読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

What's a macro? #ScalaMatsuri

  • マクロって何
  • マクロのなにがいいの
  • マクロを使ってコードを書くとどうなるか
  • マクロの今後

Scala2.1.0から入ってきた

マクロを使うのは簡単、マクロを作るのは難しい

  • コードを作るコード
  • Scalaのシンタックスでコードを組む
  • コンパイラがコンパイル時に実行する

マクロ以前

  • sbtプラグインを使う
  • 今も使ってるけど
  • ASTコンパイラプラグイン(別のプラグインを使う必要がない)

なぜマクロ

  • プラグインあるじゃん
  • プラグインのお作法を学ぶのはしんどい
  • コードがシンプルになる
  • 必要なときだけコードを生成する
  • 余計なものを生成しない
  • パフォーマンス
  • マクロはみんなの味方

マクロを使おう

  • import scala.language.experimental.macros
  • -language:experimental.macros(コンパイル時引数指定)

  • マクロを使うコードとマクロが書かれたコードは別々にコンパイルする必要がある

  • 同時にコンパイル出来ない

Def Macros

http://docs.scala-lang.org/ja/overviews/macros/overview.html

コードを置き換えてくれる

logger.debug(s"Some $expensive message!")

if(logger.isDebugEnabled)
logger.debug(s"Some $expensive message!")

キーワードはマクロで。

マクロ例(Emacs Lisp) http://e-arrows.sakura.ne.jp/2010/03/macros-in-emacs-el.html

ドライアプローチ 2.11はホワイトボックスとブラックボックスに分かれている

http://scalamacros.org/paperstalks/2014-06-17-EasyMetaprogrammingForEveryone.pdf

よいところ

  • 自動生成
  • 静的チェック

わるいところ

ライブラリを使うユーザーにはやさしくないので複雑

meta 実際に使う人向けにシンプルに

Scalaマクロの使いドコロ

  • Code生成
  • 静的型チェック

まとめ

  • OSSコミュニティレベルで積極的に使っていけば、フィードバックが得られる
  • あまり枯れていないので改善点は多い
  • Scalaマクロは過渡期