ここまで·MLプログラム面で徊救できる恃眶は main.ml 面の initial_env であらかじめ年められた恃眶に嘎られていたˉML2で は恃眶离咐の怠墙を·let 离咐と let 及として瞥掐するˉ
ML2 の菇矢は·笆布のように涂えられるˉ
|
expressed value, denoted value ともに笆涟と票じ·つまり· let による芦躯の滦据は·及の猛であるˉこの橙磨に燃なう プログラムの恃构爬を哭7に绩すˉsyntax.ml では·菇矢の 橙磨に燃うコンストラクタの纳裁·parser.mly では·恶挛弄な菇矢惮搂 (letは冯圭が ifと票镍刨に煎い)の纳裁·lexer.mllでは·徒腆胳 と淡规の纳裁を乖っているˉeval_exp の let 及を胺う婶尸では· 呵介に·芦躯恃眶叹·及を艰りだし·称及を删擦するˉ その猛を蝗って·附哼の茨董を橙磨し·塑挛及を删擦しているˉ
syntax.ml:
type exp = ... | LetExp of id * exp * exp type program = Exp of exp | Decl of id * exp
parser.mly:
%token LET IN EQ toplevel : Expr SEMISEMI { Exp $1 } | LET ID EQ Expr SEMISEMI { Decl ($2, $4) } Expr : IfExpr { $1 } | LetExpr { $1 } | LTExpr { $1 } LetExpr : LET ID EQ Expr IN Expr { LetExp ($2, $4, $6) }
lexer.mll:
let reservedWords = [ ... ("in", Parser.IN); ("let", Parser.LET); ] ... | "<" Parser.LT | "=" Parser.EQ
eval.ml:
let rec eval_exp env = function ... | LetExp (id, exp1, exp2) -> let value = eval_exp env exp1 in eval_exp (Environment.extend id value env) exp2 let eval_decl env = function Exp e -> let v = eval_exp env e in ("-", env, v) | Decl (id, e) -> let v = eval_exp env e in (id, Environment.extend id v env, v)
Figure 7: 渡疥年盗
# let x = 1 let y = x + 1;; val x = 1 val y = 2
let x = 100 and y = x in x+yの悸乖冯蔡は 200 ではなく·(xが络拌茨董で 10に芦躯され ているので) 110 であるˉ