File tree Expand file tree Collapse file tree 1 file changed +2
-2
lines changed Expand file tree Collapse file tree 1 file changed +2
-2
lines changed Original file line number Diff line number Diff line change @@ -33,7 +33,7 @@ Scala 2.11.x および Scala 2.12.x 系列では、マクロ機能が blackbox
33
33
34
34
しかし、ときとして def マクロは「ただのメソッド呼び出し」という概念を超越することがある。例えば、展開されたマクロは、元のマクロの戻り値の型よりも特化された型を持つ式を返すことが可能だ。Scala 2.10 では、StackOverflow の [ Static return type of Scala macros] ( https://stackoverflow.com/questions/13669974/static-return-type-of-scala-macros ) で解説したように、そのような展開は特化された型を保持し続けることができる。
35
35
36
- この興味深い機能がもたらす柔軟性によって、[ 偽装型プロバイダ] ( https://meta.plasm.us/posts/2013/07/11/fake-type-providers-part-2/ ) 、[ 具現化の拡張] ( https://github.com/scala/improvement-proposals/pull/18 ) 、[ 関数従属性の具現化] ( /ja/overviews/macros/implicits.html#fundep_materialization ) 、抽出子マクロなどを可能とするけども、書かれたコードの明確さ (人にとってもマシンにとっても) が犠牲になるという側面がある。
36
+ この興味深い機能がもたらす柔軟性によって、[ 偽装型プロバイダ] ( https://meta.plasm.us/posts/2013/07/11/fake-type-providers-part-2/ ) 、[ 具現化の拡張] ( https://github.com/scala/improvement-proposals/pull/18 ) 、[ 関数従属性の具現化] ( /ja/overviews/macros/implicits.html#関数従属性の具現化 ) 、抽出子マクロなどを可能とするけども、書かれたコードの明確さ (人にとってもマシンにとっても) が犠牲になるという側面がある。
37
37
38
38
普通のメソッド同様に振る舞うマクロと戻り値の型を細別化 (refine) するマクロという決定的な区別を明確にするために、blackbox マクロと whitebox マクロという概念を導入することにした。型シグネチャに忠実に従うマクロは、振る舞いを理解するのに実装を知る必要が無い (ブラックボックスとして扱うことができる) ため、** blackbox マクロ** (blackbox macro) と呼ぶ。
39
39
Scala の型システムを使ってシグネチャを持つことができないマクロは ** whitebox マクロ** (whitebox macro) と呼ぶ。(whitebox def マクロもシグネチャは持つが、これらのシグネチャは近似値でしかない)
@@ -49,7 +49,7 @@ blackbox マクロと whitebox マクロの両方とも大切なことは認識
49
49
blackbox def マクロは Scala 2.10 の def マクロと異なる扱いとなる。Scala の型検査において以下の制限が加わる:
50
50
51
51
1 . blackbox マクロが構文木 ` x ` に展開するとき、展開される式は型注釈 ` (x: T) ` でラップされる。この ` T ` は blackbox マクロの宣言された戻り値の型に、マクロ適用時に一貫性を持つように型引数やパス依存性を適用したものとなる。これによって、blackbox マクロを[ 型プロバイダ] ( https://meta.plasm.us/posts/2013/07/11/fake-type-providers-part-2/ ) のための手段としての利用は無効となる。
52
- 1 . Scala の型推論アルゴリズムが終わった後でも blackbox マクロの適用に未決定の型パラメータが残る場合、これらの型パラメータは普通のメソッドと同様に強制的に型推論が実行される。これによって blackbox マクロから型推論に影響を与えることが不可能となり、[ 関数従属性の具現化] ( /ja/overviews/macros/implicits.html#fundep_materialization ) に使うことが無効となる。
52
+ 1 . Scala の型推論アルゴリズムが終わった後でも blackbox マクロの適用に未決定の型パラメータが残る場合、これらの型パラメータは普通のメソッドと同様に強制的に型推論が実行される。これによって blackbox マクロから型推論に影響を与えることが不可能となり、[ 関数従属性の具現化] ( /ja/overviews/macros/implicits.html#関数従属性の具現化 ) に使うことが無効となる。
53
53
1 . blackbox マクロの適用が implicit の候補として使われる場合、implicit 検索がそのマクロを選択するまでは展開は実行されない。これによって [ implicit マクロの入手可能性を動的に計算する] ( https://github.com/scala/improvement-proposals/pull/18 ) ことが無効となる。
54
54
1 . blackbox マクロの適用がパターンマッチの抽出子として使われる場合、無条件でコンパイラエラーを発生するようにして、マクロで実装されたパターンマッチングのカスタマイズを無効となる。
55
55
You can’t perform that action at this time.
0 commit comments