Commits

camlspotter committed d845dc9

escape fix

  • Participants
  • Parent commits 3e2b49d

Comments (0)

Files changed (1)

 肝に命じること
 =======================
 
-CamlP4 はオーパーツもしくはロストテクノロジー。全部を理解しようとしてソース本体を読み始めると魂を取られ帰ってこれなくなる。真髄は理解できないものとして、便利に使う、使えなさそうならさっさと諦める、という姿勢が重要。
+**CamlP4 はオーパーツもしくはロストテクノロジー。** 全部を理解しようとしてソース本体を読み始めると魂を取られ帰ってこれなくなる。真髄は理解できないものとして、便利に使う、使えなさそうならさっさと諦める、という姿勢が重要。
 
 ============================================
 OCaml の文法拡張フレームワークとしてのP4
 =======================================
 
 * P4 は改造構文を含む OCaml のソースコードをパースルールを使用してパースする
-* パースしながら改造構文の無い vanilla OCaml(以下 バニラ)のソースコードツリー(以下 AST)を生成する
-* コードをパース終了した後にも AST を変形させることができる (Filter)
+* パースしながら改造構文の無い vanilla OCaml(以下 *バニラ*)のソースコードツリー(以下 *AST*)を生成する
+* コードをパース終了した後にも AST を変形させることができる (*Filter*)
 * 最終的にバニラコードを出力する
 
 君の仕事は
 Original Syntax, Revised Syntax なんと複雑な!
 =================================================
 
-P4 にはバニラ OCaml の文法である Original syntax とは別に Revised syntax という別の OCaml 文法が実装されており、これが P4 のオーパーツ化の始まりとなっている。注意して欲しいのは
+P4 にはバニラ OCaml の文法である *Original syntax* とは別に *Revised syntax* という別の OCaml 文法が実装されており、これが P4 のオーパーツ化の始まりとなっている。注意して欲しいのは
 
-Revised syntax は君の OCaml プログラミングを revise する物ではない
+**Revised syntax は君の OCaml プログラミングを revise する物ではない**
 
 ということだ。実際のところ Revised syntax は Original syntax と比べて人間の目には冗長に見える。Original syntax を知っている人には違いを覚えるのも大変である。
 
-Revised syntax が有利になるのは P4 での拡張を Quotation(Quote。後述) を使って書く場合だけである。言語の枠構造などが人間に優しく省略されている Original syntax では、 Quote を使って拡張を書く場合境界がはっきりせずうまく書けない場合がある。Revised は P4 のための DSL として作られており、そのような境界が明示されているので書きやすい。
+Revised syntax が有利になるのは P4 での拡張を *Quotation* (*Quote* 後述) を使って書く場合だけである。言語の枠構造などが人間に優しく省略されている Original syntax では、 Quote を使って拡張を書く場合境界がはっきりせずうまく書けない場合がある。Revised は P4 のための DSL として作られており、そのような境界が明示されているので書きやすい。
 
-では Revised syntax を習得するべきか。否。Revised syntax は無視してよろしい。というか無視しろ。この文法は P4 でしか役に立たないので覚えるのは時間の無駄である。Original syntax では Quote が書けなくなるじゃないですか…という人には、Quote を使わなくても P4 は書ける、と答えよう。Revised syntax でうんうん唸るなら書けない、書きにくい Quote が現れたらそこはベタに AST コンストラクタを書く(生書き)。もちろん Quote が書けてそちらの方が簡便な場合は Quote を使おう。それが近道だ。
+では Revised syntax を習得するべきか。否。Revised syntax は無視してよろしい。というか無視しろ。この文法は P4 でしか役に立たないので覚えるのは時間の無駄である。Original syntax では Quote が書けなくなるじゃないですか…という人には、Quote を使わなくても P4 は書ける、と答えよう。Revised syntax でうんうん唸るなら書けない、書きにくい Quote が現れたらそこはベタに AST コンストラクタを書く(*生書き*)。もちろん Quote が書けてそちらの方が簡便な場合は Quote を使おう。それが近道だ。
 
 camlp4, camlp4o, camlp4of, camlp4oof, camlp4orf, camlp4r,  camlp4rf … ナメてんのか!
 ======================================================================================
 * 100行程度の x.ml という OCaml バニラソースを用意せよ。無ければ書け。
 * camlp4of x.ml を実行して出力を確認せよ。
 * camlp4 x.ml を実行して出力を確認せよ。エラーが出た場合、それは何故か考えよ。
-* [重要] camlp4of x.ml > xx.ml を実行し xx.ml を確認せよ。
-* [重要] camlp4of -printer Camlp4OCamlPrinter x.ml > xxx.ml を実行し xxx.ml を確認せよ。
+* **[重要]** camlp4of x.ml > xx.ml を実行し xx.ml を確認せよ。
+* **[重要]** camlp4of -printer Camlp4OCamlPrinter x.ml > xxx.ml を実行し xxx.ml を確認せよ。
 
 解説: P4 は OCaml コンパイラのプリプロセッサとして動作させることが多い。P4 と ocamlc の間でのソースのやり取りはわざわざ人間に読める OCaml コードを出力する意義は無いのでバイナリで行われる。 出力先がターミナル以外の場合、プリンタを明示しないと P4 がバイナリを吐くのはそのためである。
 
 演習問題
 ------------------
 
-* [重要] 上のテンプレを camlp4temp.ml に保存し ocamlc でコンパイルせよ。コマンドは ocamlc -pp camlp4of -I `ocamlc -where`/camlp4 -c camlp4temp.ml
-* [重要] 上記コンパイルコマンドを一々打ち込まなくても良いよう、自分の使用しているビルドツールのルールを作成せよ。
+* **[重要]** 上のテンプレを camlp4temp.ml に保存し ocamlc でコンパイルせよ。コマンドは ocamlc -pp camlp4of -I \`ocamlc -where\`/camlp4 -c camlp4temp.ml
+* **[重要]** 上記コンパイルコマンドを一々打ち込まなくても良いよう、自分の使用しているビルドツールのルールを作成せよ。
 
 ===================================
 Quotation と Anti-quotation
 ===================================
 
-さて、テンプレに触れたから早速文法拡張に移りたいところだが…その前に Quotation system を見なければならない。少し落ち着け。Quote system とは OCaml 内部で OCaml の syntax tree (AST) を OCaml ソースの形で記述できるようにするための言語内 DSL だと思って良い。AST を簡単にいじるために必須なツールだ。
+さて、テンプレに触れたから早速文法拡張に移りたいところだが…その前に Quotation system を見なければならない。少し落ち着け。Quote system とは OCaml 内部で OCaml の syntax tree (*AST*) を OCaml ソースの形で記述できるようにするための言語内 DSL だと思って良い。AST を簡単にいじるために必須なツールだ。
 
 Quote
 ==============
 
-P4 では Quasi-quotation (Quote) が使える。Quote を使えば、言語 AST の内部表現を書く(生書きとでも呼ぼう)代わりに、より人間様に判りやすい言語ソースをそのまま書くことができる。
+P4 では *Quasi-quotation* (*Quote*) が使える。Quote を使えば、言語 AST の内部表現を書く(生書きとでも呼ぼう)代わりに、より人間様に判りやすい言語ソースをそのまま書くことができる。
 
 例えば、P4 での空リスト [] 式の内部表現は::
 
 Quote が展開される AST の定義
 =================================
 
-さて、Quote が AST 内部表現に展開される例を見たが、そこで出てくる Ast.ExId やら Ast.IdUid はどこで定義されているか。どのようなコンストラクタがあるか。もっとも簡単な資料は OCaml ソースコードディレクトリ($OCAML と略記)の $OCAML/camlp4/Camlp4/Camlp4Ast.partial.ml である。これは Revised syntax で記述されており、なおかつこのファイル自体が P4 が作成される際にコンパイルされるわけではないのだが、もっとも判りやすい。ここに定義された型名は Quote <:XXX< ... >> のコンテクスト名 XXX として使用できる。
+さて、Quote が AST 内部表現に展開される例を見たが、そこで出てくる Ast.ExId やら Ast.IdUid はどこで定義されているか。どのようなコンストラクタがあるか。もっとも簡単な資料は OCaml ソースコードディレクトリ(*$OCAML と略記*)の $OCAML/camlp4/Camlp4/Camlp4Ast.partial.ml である。これは Revised syntax で記述されており、なおかつこのファイル自体が P4 が作成される際にコンパイルされるわけではないのだが、もっとも判りやすい。ここに定義された型名は Quote <:XXX< ... >> のコンテクスト名 XXX として使用できる。
 
 Revised syntax でのバリアント定義の読み方だが例えば、::
 
 * <:ctyp< 'a list >>
 * <:ctyp< ('a, 'b) Hashtbl.t >>
 * <:ctyp< int list option >>
-* [重要] これらを camlp4of で展開してどのような AST ツリーになるか確認せよ
+* **[重要]** これらを camlp4of で展開してどのような AST ツリーになるか確認せよ
 
 _loc とは「例の場所」
 ==========================
 Anti-quotation
 ====================
 
-Anti-quotation(Anti-quote) は Quotation の中に外部の値を導入するための Quote の中の Quote。
+*Anti-quotation(Anti-quote)* は Quotation の中に外部の値を導入するための Quote の中の Quote。
 書式は $ 式 $ と書く。例えば <:expr< $x$ + 1 >> と書けば、x に束縛された expr 型を持つ
 AST からそれにさらに 1 を足すという expr AST を作ることができる。
 
 演習問題
 ------------------
 
-* [重要] 上記コードを camlp4of で展開し(ry
-* [重要] 上記コードの expr を patt に変えて camlp4of で(ry
+* **[重要]** 上記コードを camlp4of で展開し(ry
+* **[重要]** 上記コードの expr を patt に変えて camlp4of で(ry
 
 なお、 $ は OCaml では普通に使える symbol character なのだが、camlp4of では
 $ が Anti-quote のために予約されているため $ は使えなくなってしまう。なので $ を OCaml で
 
 Yacc と異なりケースの実行は上から下へ。なので順番は重要。
 
-わかりますよね?わからない?えっ、パーサーの基礎も知らずに P4 とか無理ですよ?言わなかったけ
+わかりますよね?わからない?えっ、パーサーの基礎も知らずに P4 とか無理ですよ?言わなかったけ。
  
 改造の基本
 ==============
 Camlp4OCamlParser.ml を眺めよ!!
 ====================================
 
-とこき下ろしたが、実のところ Camlp4OCamlParser.ml は最も複雑な P4 文法拡張なので、ルールの削除や追加の例はこのファイルを眺めるのが最適である。読むなよ!眺めるだけだ!
+とこき下ろしたが、実のところ Camlp4OCamlParser.ml は最も複雑な P4 文法拡張なので、ルールの削除や追加の例はこのファイルを眺めるのが最適である。**読むなよ!眺めるだけだ!**
 
 =========================
 例題
     DELETE_RULE Gram str_item: "let"; opt_rec; binding END;
     DELETE_RULE Gram expr: "let"; opt_rec; binding; "in"; expr END;
 
-ステップ3 [重要] テストテストテスト
+ステップ3 **[重要]** テストテストテスト
 =============================================
 
 と君は書いてみた。君は基地外ではあるが慎重でもあるので、この時点でテンプレートにこの三行を書き込みテストするのを忘れない::
     	Camlp4 Parsing version 4.00.0
     
     # #load "pa_letrec.cmo";;
-    Fatal error: exception Not_found
+    **Fatal error: exception Not_found**
 
 あれ?あれれれ?ナンデ?P4ナンデ?
 
     Characters 0-3:
     let rec f x = f x;;
     ^^^
-    Error: Parse error: "module" or "open" expected after "let" (in [str_item])
+    Error: Parse error: *"module" or "open" expected after "let" (in [str_item])*
 
 こうなる。なんとエラーメッセージを見なさい。 let の後は module か open しか来ないと言っている。rec なんかは絶対来ないのだ!素晴らしい!(というか普通の let x = 1 とかも消してしまったのだが。)
 
               | _ -> <:str_item< let rec $bi$ >> 
               end
           ]
-       ];
+       ...
 
 これで良いはずだ! begin match .. with .. end に注意だ! これが出来たら、 EXTEND Gram .. END の中に入れてコンパイルしよう::
 
 演習問題
 ------------------
 
-* [重要] 君も上の letrec を試して国際Scheme戦線に参加しなさい。LCF ML 懐古趣味でも可能
+* **[重要]** 君も上の letrec を試して国際Scheme戦線に参加しなさい。LCF ML 懐古趣味でも可能