MetaOCaml

K.INABAさんが紹介されてた (http://www.kmonos.net/wlog/35.php#_2247040108) 文章を今頃読んだのでした。すごいなあ。よくわかってませんけど。

文中の一番簡単な例。こんな OCaml のコードがあったとして、

let rec power n x =
  if n=0 then 1 else x * (power (n-1) x) in
let power3 =
  fun x -> (power 3 x) in
Printf.printf "%d\n" (power3 4)

これを multi-stage にして

let rec power n x =
  if n=0 then .<1>. else .< .~x * .~(power (n-1) x)>. in
let power3 =
  .! .<fun x -> .~(power 3 .<x>.)>. in
Printf.printf "%d\n" (power3 4)

なんてするらしいのですが、 .< >. というのが囲った部分の中身は未来に interpret を遅延させる演算子で、 .~ というのが .< >. 中にもかかわらず今すぐ interpret させる演算子、 .! は .< >. で遅延させたものを解釈させる演算子らしいです。

ということは後者では、 power 3 .<x>. を計算 → .<x>. * power 2 .<x>. → .<x>. * .<x>. * power 1 .<x>. → .<x * x * x * 1>. となって (notation があやしい) 、このコード片を実行した結果が power3 関数ですよ、と代入されるため、以降 power3 を呼んでも再帰関数を呼ばなくなる、のかな?やはりよくわかってない。

以下箇条書き。

この論文は DSL を作るためにこういう機構を考えようということでした。 DSL ってのは tcl の上に expect があるとかそんな感じかな。 C++ の上に BNF 乗せたりとか。

C++ と違っての普通 OCaml コードがメタ部分にも書ける。 IO ができるのはでかいと思う。

今は interpreter が multi-stage になっているだけだけど、どこからどこまでが compile時の stage で残りが interpret時の stage だとか定義できると面白げ。 IO も使えるわけですし、 ./configure 的なことをコンパイラにやらせることができたりすると幸せだねえ。

MetaOCaml もまだ全然こなれてないなあ。こんなもん読めないよ。

Template Haskell も見たいけどまあいいや。 Haskell よく知らないので。

MetaOCaml / Template Haskell / C++ どれも決定打からかなり遠い気がする。これらの機能がぐちゃぐちゃと混ざると凄いものができる気もする。

追記: Haskell は Haskel じゃないと教えてもらったので修正。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h