8000 Macro translation. Jumping to 'every macro doc now explicitly mention… · weih/scala.github.com@a5e9830 · GitHub
[go: up one dir, main page]

Skip to content

Commit a5e9830

Browse files
committed
Macro translation. Jumping to 'every macro doc now explicitly mentions blackbox vs whitebox' on scala.github.com@53ea9ac15b1bd7e6a29c96cfd978226822151fbd
1 parent d6af97f commit a5e9830

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

ja/overviews/macros/annotations.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,8 @@ title: マクロアノテーション
100100

101101
Scala マクロの精神に則り、マクロアノテーションは柔軟性のために可能な限り型指定を無くし (untyped; マクロ展開前に型検査を必須としないこと)、利便性のために可能な限り型付けた (typed; マクロ展開前に利用可能な型情報を取得すること)。注釈対象は型指定が無いため、後付けでシグネチャ (例えばクラスメンバのリストなど) を変更できる。しかし、Scala マクロを書くということはタイプチェッカと統合するということであり、マクロアノテーションもそれは同じだ。そのため、マクロ展開時には全ての型情報を得ることができる
102102
(例えば、包囲するプログラムに対してリフレクションを使ったり、現行スコープ内から型検査を行ったり、implicit の検索を行うことができる)。
103+
104+
## blackbox vs whitebox
105+
106+
マクロアノテーションは [whitebox](/ja/overviews/macros/blackbox-whitebox.html) である必要がある。
107+
マクロアノテーションを [blackbox](/ja/overviews/macros/blackbox-whitebox.html) だと宣言すると正しく動作しない。

ja/overviews/macros/bundles.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,10 @@ Scala 2.10.x においてマクロ実装は関数として表されている。
4040
def mono = macro Impl.mono
4141
def poly[T] = macro Impl.poly[T]
4242
}
43+
44+
## blackbox vs whitebox
45+
46+
マクロバンドルは、[blackbox](/ja/overviews/macros/blackbox-whitebox.html)[whitebox](/ja/overviews/macros/blackbox-whitebox.html)
47+
の両方のマクロの実装に使うことができる。マクロバンドルのコンストラクタのパラメータに
48+
`scala.reflect.macros.blackbox.Context` の型を渡せば blackbox マクロになって、
49+
`scala.reflect.macros.whitebox.Context` ならば whitebox マクロになる。

ja/overviews/macros/extractors.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,7 @@ typer とのよどみない会話をお膳立てするには全ての部分が
7979
[run/t5903d](https://github.com/scala/scala/tree/00624a39ed84c3fd245dd9df7454d4cec4399e13/test/files/run/t5903d)
8080
などのテストケースを参照してほしい。
8181

82-
抽出子マクロは [whitebox](/ja/overviews/macros/blackbox-whitebox.html) マクロじゃないと動作しないことに注意。
82+
## blackbox vs whitebox
83+
84+
抽出子マクロは [whitebox](/ja/overviews/macros/blackbox-whitebox.html) である必要がある。
85+
抽出子マクロを [blackbox](/ja/overviews/macros/blackbox-whitebox.html) だと宣言すると正しく動作しない。

ja/overviews/macros/implicits.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,18 @@ Scala 2.10 においてはマクロの適用は全ての型引数が推論され
121121
全てがすごくシンプルになっていることに注意してほしい。implicit マクロの `materializeIso` は最初の型引数だけを使って展開コードを生成する。
122122
型推論は自動的に行われるので、(推論することができなかった) 2つ目の型引数のことは分からなくてもいい。
123123

124-
ただし、`Nothing` に関してはまだ[おかしい制限](https://github.com/scala/scala/blob/7b890f71ecd0d28c1a1b81b7abfe8e0c11bfeb71/test/files/run/t5923a/Macros_1.scala)があるので注意する必要がある。また、関数従属性の具現化は [whitebox](/ja/overviews/macros/blackbox-whitebox.html) マクロじゃないと動作しないことにも注意。
124+
ただし、`Nothing` に関してはまだ[おかしい制限](https://github.com/scala/scala/blob/7b890f71ecd0d28c1a1b81b7abfe8e0c11bfeb71/test/files/run/t5923a/Macros_1.scala)があるので注意する必要がある。
125+
126+
## blackbox vs whitebox
127+
128+
本稿の前半で紹介した素の具現化は [blackbox](/ja/overviews/macros/blackbox-whitebox.html)[whitebox](/ja/overviews/macros/blackbox-whitebox.html) のどちらでもいい。
129+
130+
blackbox な具現化と whitebox な具現化には大きな違いが一つある。blackbox な implicit マクロの展開 (例えば、明示的な `c.abort` の呼び出しや展開時の型検査の失敗)
131+
はコンパイルエラーとなるが、whitebox な implicit マクロの展開は、実際のエラーはユーザ側には報告されずに現在の implicit 検索から implicit の候補が抜けるだけになる。
132+
これによって、blackbox implicit マクロの方がエラー報告という意味では良いけども、whitebox implicit マクロの方が動的に無効化できるなどより柔軟性が高いというトレードオフが生じる。
133+
134+
関数従属性の具現化は [whitebox](/ja/overviews/macros/blackbox-whitebox.html) マクロじゃないと動作しないことにも注意。
135+
関数従属性の具現化を [blackbox](/ja/overviews/macros/blackbox-whitebox.html) だと宣言すると正しく動作しない。
136+
137+
138+

ja/overviews/macros/typeproviders.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ title: 型プロバイダ
1717
型プロバイダ (type provider) はそれ専用にマクロの種類があるわけではなくて、すでに Scala マクロが提供する機能の上に成り立っている。
1818

1919
型プロバイダ的をエミュレートするのは 2通りの方法があって、構造的部分型に基づいたもの (これは「匿名型プロバイダ」と呼ぶ; anonymous type provider) と、
20-
マクロアノテーションに基づいたもの (これは「公開型プロバイダ」と呼ぶ; public type provider) がある。前者は 2.10.x、2.11.x、2.12.x 系列から既に使える機能用いて実現されるが、
20+
マクロアノテーションに基づいたもの (これは「public 型プロバイダ」と呼ぶ; public type provider) がある。前者は 2.10.x、2.11.x、2.12.x 系列から既に使える機能用いて実現されるが、
2121
後者はマクロパラダイスを必要とする。両方の方法とも消去型のプロバイダを実装するのに使うことができる。
2222

23-
マクロアノテーションのコンパイルと展開の両方にマクロパラダイスが必要なため、公開型プロバイダの作者とユーザの両方がマクロパラダイスを
23+
マクロアノテーションのコンパイルと展開の両方にマクロパラダイスが必要なため、public 型プロバイダの作者とユーザの両方がマクロパラダイスを
2424
ビルドに含める必要があることに注意してほしい。
2525
しかし、マクロアノテーションが展開した後は、その結果のコードにはマクロパラダイスへの参照は残らないため、コンパイル時にも実行時にもマクロパラダイスは必要ない。
2626

@@ -78,9 +78,7 @@ def マクロによって展開された定義群のスコープは展開され
7878
[その1](http://meta.plasm.us/posts/2013/06/19/macro-supported-dsls-for-schema-bindings/)[その2](http://meta.plasm.us/posts/2013/07/11/fake-type-providers-part-2/)
7979
[その3](http://meta.plasm.us/posts/2013/07/12/vampire-methods-for-structural-types/)
8080

81-
匿名型プロバイダは [whitebox](/ja/overviews/macros/blackbox-whitebox.html) マクロじゃないと動作しないことに注意。
82-
83-
### 公開型プロバイダ
81+
### public 型プロバイダ
8482

8583
[マクロパラダイス](/ja/overviews/macros/paradise.html)[マクロアノテーション](/ja/overviews/macros/annotations.html)を使うことで
8684
構造的部分型を使った回避策を使わなくても簡単に外部から見えるクラスを生成できるようになった。
@@ -99,7 +97,7 @@ def マクロによって展開された定義群のスコープは展開され
9997
これはまだ深くは研究していないけども、型メンバとシングルトン型を使えば F# 同様の消去型プロバイダを提供できるのではないかという仮説がある。
10098
具体的には、消去したくない型は普通に今までどおり宣言して、任意の上限境界に消去したいクラスは一意に定まる識別子を持ったシングルトン型によってパラメータ化された上限境界の型エイリアスとして提供すればいい。
10199
この方法を用いても全ての新しい型に対して型エイリアスのメタデータのための余計なバイトコードというオーバヘッドが発生するけども、このバイトコードは普通のクラスのバイトコードに比べると非常に小さいものとなる。
102-
このテクニックは匿名と公開の両方の型プロバイダにあてはまる
100+
このテクニックは匿名と public の両方の型プロバイダにあてはまる
103101

104102
object Netflix {
105103
type Title = XmlEntity["http://.../Title".type]
@@ -124,3 +122,8 @@ def マクロによって展開された定義群のスコープは展開され
124122
else c.abort(s"value $sField is not a member of $sUrl")
125123
}
126124
}
125+
126+
## blackbox vs whitebox
127+
128+
匿名と public の両方の型プロバイダとも [whitebox](/ja/overviews/macros/blackbox-whitebox.html) である必要がある。
129+
型プロバイダマクロを [blackbox](/ja/overviews/macros/blackbox-whitebox.html) だと宣言すると正しく動作しない。

0 commit comments

Comments
 (0)
0