3
printf("fact(%d)\n", n);#endifif (n == 0) {return 1;} else {return n * fact(n - 1);}
cpp
は
#
で始まる行(ディレクティブ)を解釈し、その指示に従ってソースコードを変換していきます。コンパイラは変換結果だけを受け取るため、ディレクティブを読むことはありません。
OCaml
でいろいろなプリプロセッサを使う
ocamlc
は通常ソースファイルを直接解釈しますが
-pp
オプションを使うことにより任意のコマンドをプリプロセッサとして使うことができます。
ocamlc –pp
プリプロセッサのコマンド
ソースファイル
使用できるプリプロセッサは
Camlp4
に限られません。以下の例は
sed
を使ってソース中の文字列置換をしています。ソースファイルは識別子
PI
を定義していませんが、
seds/PI/3.14/
により文字列
PI
を
3.14
に置き換えることで、コンパイルが通るようになっています。
$ cat tryme.mllet _ = print_float PI$ ocamlc tryme.mlFile "tryme.ml", line 1, characters 20-22:Unbound constructor PI$ ocamlc -pp 'sed s/PI/3.14/' tryme.ml$ ./a.out3.14$
以下のように
cpp
を使うこともできます。
$ cat tryme.ml#define PI 3.14let _ = print_float PI$ ocamlc tryme.mlFile "tryme.ml", line 1, characters 0-1:Syntax error$ ocamlc -pp cpp tryme.ml$ ./a.out3.14$
OCaml
専用に作られた
Camlp4
以外のプリプロセッサもあります。
"The Whitespace
Leave a Comment