@@ -14,14 +14,17 @@ title: blackbox vs whitebox
1414** Eugene Burmako 著** <br >
1515** Eugene Yokota 訳**
1616
17- Scala 2.11.0-M7 以降の Scala 2.11 マイルストーンビルドよりマクロを blackbox と whitebox という二つに分かれた実装となった (しかし、2.11.0-M8 で構文が変更されたため、本稿は以前の 2.11 には当てはまらない)。blackbox/whitebox の分化は Scala 2.10.x やマクロパラダイスでは実装されていない。最新の 2.11 マイルストーンをダウンロードして使用するには [ http://www.scala-lang.org/download/ ] ( http://www.scala-lang.org/download/ ) に書いてある手順を参照してほしい。
17+ Scala 2.11.x および Scala 2.12.x 系列では、マクロ機能が blackbox と whitebox という二つに分かれることになった。
18+ この blackbox/whitebox の分化は Scala 2.10.x では実装されていない。Scala 2.10.x 向けのマクロパラダイスでも、これは実装されていない。
1819
1920## マクロの成功
2021
2122マクロが正式な Scala 2.10 リリースの一部になったことで、研究分野でも業界でもプログラマは様々な問題に対して独創的なマクロの利用方法を考えだしていて、我々の当初の期待をはるかに上回る反応を得ている。
2223
2324エコシステムにおけるマクロがあまりも速く重要なものとなってきているため、Scala 2.10 が実験的機能としてリリースされた数カ月後の Scala 言語チームの会議の中では、Scala 2.12 までにはマクロを標準化して Scala 言語の一人前の機能とすることが決定された。
2425
26+ <i >追記: Scala 2.12 までにマクロを安定化させるのはそう生易しいことでは無いことが分かった。この調査を受けて、Scala でメタプログラミングを行うための新たな基盤となる [ scala.meta] ( http://scalameta.org ) が生まれ、Scala 2.12 リリースと同時に最初のベータ版を出すをことを目指している。これが将来の Scala に入ることになるかもしれない。今の所は、Scala 2.12 ではマクロやリフレクション関連の変更は予定されていない。全機能が Scala 2.10 と 2.11 同様に実験的機能扱いのままで、機能が削除されることもない。本稿が書かれた背景となった状況は変わったが、書かれた内容はまだ生きているのでこのまま読み進んでほしい。</i >
27+
2528マクロには多くの種類があるため、それぞれを注意深く調べて、どれを標準に入れるのかを厳選することを決めた。評価するときに必然として出てきた疑問がいくつかある。何故マクロ機能はこれほどまでに成功したのか? マクロが使われる理由は何か?
2629
2730理解しづらいメタプログラミングという概念が def マクロで表現されることで馴染みやすい型付けされたメソッド呼び出しという概念に乗っかることができるからではないか、というのが我々の仮説だ。これによって、ユーザが書くコードは無闇に肥大化したり、読み易さを犠牲とせずにより多くの意味を吸収できるようになった。
@@ -35,7 +38,7 @@ Scala 2.11.0-M7 以降の Scala 2.11 マイルストーンビルドよりマク
3538普通のメソッド同様に振る舞うマクロと戻り値の型を細別化 (refine) するマクロという決定的な区別を明確にするために、blackbox マクロと whitebox マクロという概念を導入することにした。型シグネチャに忠実に従うマクロは、振る舞いを理解するのに実装を知る必要が無い (ブラックボックスとして扱うことができる) ため、** blackbox マクロ** (blackbox macro) と呼ぶ。
3639Scala の型システムを使ってシグネチャを持つことができないマクロは ** whitebox マクロ** (whitebox macro) と呼ぶ。(whitebox def マクロもシグネチャは持つが、これらのシグネチャは近似値でしかない)
3740
38- blackbox マクロと whitebox マクロの両方とも大切なことは認識しているけども、より簡単に説明したり、規格化したり、サポートしやすい blackbox マクロの方に我々としては多くの信頼を置いている。そのため、Scala 2.12 で標準化されてるマクロには blackbox マクロのみが含まれる予定だ。将来の Scala リリースには whitebox マクロも実験的機能扱いでは無い形で入るかもしれないけども 、今からは何とも言えない。
41+ blackbox マクロと whitebox マクロの両方とも大切なことは認識しているけども、より簡単に説明したり、規格化したり、サポートしやすい blackbox マクロの方に我々としては多くの信頼を置いている。そのため、標準化されてるマクロには blackbox マクロのみが含まれる予定だ。将来の的に whitebox マクロも予定の中に入るかもしれないけども 、今からは何とも言えない。
3942
4043## 区別の成文化
4144
@@ -50,4 +53,4 @@ blackbox def マクロは Scala 2.10 の def マクロと異なる扱いとな
50531 . blackbox マクロの適用が implicit の候補として使われる場合、implicit 検索がそのマクロを選択するまでは展開は実行されない。これによって [ implicit マクロの入手可能性を動的に計算する] ( /sips/pending/source-locations.html ) ことが無効となる。
51541 . blackbox マクロの適用がパターンマッチの抽出子として使われる場合、無条件でコンパイラエラーを発生するようにして、マクロで実装された[ パターンマッチングのカスタマイズ] ( https://github.com/paulp/scala/commit/84a335916556cb0fe939d1c51f27d80d9cf980dc ) を無効にした。
5255
53- whitebox def マクロは Scala 2.10 での def マクロ同様に動作する。一切の制限が無いため、2.10 のマクロで出来ていたことの全てが 2.11 でも行えるはずだ。
56+ whitebox def マクロは Scala 2.10 での def マクロ同様に動作する。一切の制限が無いため、2.10 のマクロで出来ていたことの全てが 2.11 と 2.12 でも行えるはずだ。
0 commit comments