プログラム言語論 補足説明

MicroML と OCaml の構文の対応

OCaml                MicroML
 13                  CstI 13
 true                CstI true
 x                   Var "x"
 let x = e1 in e2    Let("x", e1', e2')
 e1 + e2             Prim("+", e1', e2')
 if e1 then e2       If(e1', e2', e3')
       else e3
 let rec f x = e1    Letfun("f","x",e1',e2')
      in e2 
 e1 e2               Call(e1',e2')
 fun x -> e1         Lam("x", e1')
ただし、e1',e2' はe1,e2 を MicroMLに変換したもの。 例:
OCaml
  fun x -> x + 10
MicroML
  Lam("x", Prim("+", Var "x", CstI 10))

OCaml
  fun x -> fun y -> x y
MicroML
  Lam("x", Lam("y", Call(Var "x", Var "y")))

OCaml
  let f x = 10 in let g y = 20 in f (g 3)
MicroML
  Letrec("f","x",CstI 10,
  Letrec("g","y",CstI 20,
  Call(Var "f", Call("g", CstI 3))))

MicroML の Lam とは何か?


亀山幸義