Commits

camlspotter committed 52d5b47

update

Comments (0)

Files changed (1)

 CamlAst 以外の型(int や文字列)の値を Anti-quotation で埋め込むにはどうしたらよいのだろう。
 もちろん常に生書きすることはできる::
 
-    let make_add_1 _loc x = <:expr< $Ast.ExInt (_loc, string_of_int x)$ + 1 >>
+    let make_add_1 _loc x = <:expr< $Ast.ExInt (_loc, string_of_int x)$ + 1 >>    (* x の型は int *)
 
 しかしこれは面倒だ。こんな場合のために P4 には $XXX: 式$ という Anti-quotation 記法がある(これが全然ドキュメントされてないのだ…)。この記法を使うと上の式は次のように書き換えることができる::
 
-    let make_add_1 _loc x = <:expr< $int: x$ + 1 >>
+    let make_add_1 _loc x = <:expr< $int: x$ + 1 >>  (* x の型は int *)
 
-$int: x$ は x は int なんだけどそれをよろしくコンテクストに合う AST に変更しちゃってください、という意味だと思えば良い。(おそらく)次のものが使用できる::
+$int: x$ は x は int なんだけどそれをよろしくコンテクストに合う AST に変更しちゃってください、という意味だと思えば良い。もっとかっこよく言うと「ホスト言語(Quote の外側)の値から、埋め込み言語(Quote の内側)の AST への変換子」だ。この変換子は(おそらく)次のものが使用できる::
 
     <:expr< $x$ >>              (* 普通。x がそのまま使われる *)
     <:expr< $id:x$ >>           (* x : ident を expr にする *)
 
 は ast を受け取り、もし ○ + 1 という形であれば + 1 を剥ぎとり、それ以外は ast 自身を返す操作を行う。 Anti-quotation で x に AST が束縛されることに注意。
 
-パターン中でも $XXX: パターン$ という書式が使える::
+パターン中でも $XXX: パターン$ という書式が使える。「埋め込み言語のASTから、ホスト言語の値への変換子」だ。::
 
     match ast with
     | <:expr< $int: x$ + 1 >> -> <:expr< $int: x + 1$ >>
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.