|
<プログラム> | ::= | … | let rec <識別子1> = fun <識別子2> → <式> ;; |
<式> | ::= | … |
| | let rec <変数1> = fun <変数2> → <式1> in <式2> |
図10が,主なプログラムの変更点である. eval_exp の LetRecExp を処理する部分は,上で述べたバックパッチを まさに実現している.syntax.ml:
type exp = ... | LetRecExp of id * id * exp * exp type program = ... | RecDecl of id * id * exp
eval.ml:
type exval = ... | ProcV of id * exp * dnval Environment.t ref let rec eval_exp env = function ... | LetRecExp (id, para, exp1, exp2) -> let dummyenv = ref Environment.empty in let newenv = Environment.extend id (ProcV (para, exp1, dummyenv)) env in dummyenv := newenv; eval_exp newenv exp2
Figure 10: 再帰的関数定義