Commits

camlspotter committed 3e2b49d

update

  • Participants
  • Parent commits cbbdbd8

Comments (0)

Files changed (1)

 CamlP4 も悲観的入門
 ===============================
 
+必要なもの
+* OCaml 普通に書けるけど、そろそろ何かもうちょっと楽に書きたいなぁ、こう書ければ嬉しいなあと思い始めたアナタ。
+* 当然 LL(n) とか Parsec とか、原理はともかく、使ったことあるよね!
+* OCaml ソースコード
+* OCaml コンパイラ一式
+
 =======================
 肝に命じること
 =======================
 
 というわけで OCaml の文法を拡張する道具としての P4 についてしか述べない。
 
+===============================================
+できないことを知ろう
+===============================================
+
+P4 で出来ないこと。夢想しても逆立ちしても出来ないこと。
+
+* Lexer を変更してオレオレリテラル書きたい! => 諦めろ。  えっでも書けるようなドキュメントが => 諦めろ。pa_xxx.cmo を積み重ねる方式の P4 での文法拡張では常にバニラLexerが使用される
+* 型チェックした後の情報から… => 諦めろ。P4 は型付け前、パース段階で AST をいじるフレームワークなので、型付け情報は扱えない。でも… => じゃあ P4 内部で自分で型推論器実装してみればなんとかなるはずなので勝手にやってくれ
+
 =======================================
 どう動作するのか
 =======================================
 camlp4, camlp4o, camlp4of, camlp4oof, camlp4orf, camlp4r,  camlp4rf … ナメてんのか!
 ======================================================================================
 
-Quote の外と中の言語を上記の Syntax のどちらで書くか、そして reflective であるかどうか(言語拡張が Quote 内部にも適用されるべきか)の違いにより、 P4 には 2x2x2 = 8 種類のバリアントが想定される、そのため P4 には沢山のコマンドがある。君が使うべきはまず一つ、
+Quote の外と中の言語を上記の Syntax のどちらで書くか、そして reflective であるかどうか(言語拡張が Quote 内部にも適用されるべきか)の違いにより、 P4 には 2x2x2 = 8 種類のバリアントが想定される、そのため P4 には沢山のコマンドがある。君が使うべきはまず一つ、::
 
-camlp4of
+    camlp4of
 
 である。Quote の外と中両方共 Original syntax で reflective なものだ。それ以外は忘れろ。
 
 次に進もう。
 
 
-===============================================
-できないことを知ろう
-===============================================
-
-P4 で出来ないこと。夢想しても逆立ちしても出来ないこと。
-
-* Lexer を変更してオレオレリテラル書きたい! => 諦めろ。  えっでも書けるようなドキュメントが => 諦めろ。pa_xxx.cmo を積み重ねる方式の P4 での文法拡張では常にバニラLexerが使用される
-* 型チェックした後の情報から… => 諦めろ。P4 は型付け前、パース段階で AST をいじるフレームワークなので、型付け情報は扱えない。でも… => じゃあ P4 内部で自分で型推論器実装してみればなんとかなるはずなので勝手にやってくれ
-
 =============================
 文法拡張のテンプレート
 =============================
 では実際に使ってみよう::
 
     $ ocaml
-            OCaml version 4.00.0+dev22_2012-07-20+camlp4-lexer-plug+annot+p4-expand-directory+typeloc    <--- まあ気にするな
+            OCaml version 4.00.0
     
     # #load "dynlink.cma";;
     # #load "camlp4of.cma";;
-    	Camlp4 Parsing version 4.00.0+dev22_2012-07-20+camlp4-lexer-plug+annot+p4-expand-directory+typeloc   <--- まあ気にするな
+    	Camlp4 Parsing version 4.00.0
     
     # #load "pa_letrec.cmo";;
     Fatal error: exception Not_found
             <:expr< let rec $bi$ in $x$ >>
         ...
 
-こんな感じになるはずだ。元ソースでは Revised syntax だったがこちらは Original に書き換えてある。Quote の中身ではバニラOCaml を書かねばならないから let rec と書かざるを得ないが…ぐぐぅ。そこは革命のためだ我慢せよ。
+こんな感じになるはずだ。
+オリジナルのルールをそれぞれ二つにわけ、 let と letrec にし、バニラ側で非再帰、再帰の let に置き換えてやる。
+元ソースでは Revised syntax だったがこちらは Original に書き換えてある。Quote の中身ではバニラOCaml を書かねばならないから let rec と書かざるを得ないが…ぐぐぅ。そこは革命のためだ我慢せよ。
 
 さてこれを拡張ルールとして書くには::
 
 
     ocamlc -pp camlp4of -I `ocamlc -where`/camlp4 -c pa_letrec.ml
     $ ocaml
-            OCaml version 4.00.0+dev22_2012-07-20+camlp4-lexer-plug+annot+p4-expand-directory+typeloc    <--- まあ気にするな
+            OCaml version 4.00.0
     
     # #load "dynlink.cma";;
     # #load "camlp4of.cma";;
-    	Camlp4 Parsing version 4.00.0+dev22_2012-07-20+camlp4-lexer-plug+annot+p4-expand-directory+typeloc   <--- まあ気にするな
+    	Camlp4 Parsing version 4.00.0
     
     # #load "pa_letrec.cmo";;
     # let x = 1;;