OCamlでCpp

たまに、OCamlでも型を無視して字句的な操作をしたいことがある。そういうときはcamp4を使うのが正統な方法だろうけど、そこまで頑張りたくないときはCpp(C PreProcessor)を使うと便利。http://alohakun.blog7.fc2.com/blog-entry-459.htmlみないなネタもあるらしいし。

基本

mod1.ml:

#include "mod2.ml"

let _ =
  f ()

mod2.ml

let f () =
  print_endline "hello"

これをコンパイルするには、-ppでcppを指定してやればいい。

$ ocamlc -pp "cpp" mod1.ml
$ ./a.out
hello

OCamlによるcppサポート

で、おもしろいのはここから。実はOCamlはcppが生成するディレティブを理解してくれる。
だから、mod2.mlを次のように間違えたとする。

let f () =
  print_endlinee "hello" (* eがひとつ多い *)

そして、コンパイルするとmod2.mlに間違いがあることを教えてくれる。

$ ocamlc -pp "cpp" mod1.ml
File "mod2.ml", line 2, characters 2-16:
Unbound value print_endlinee