¤³¤³¤Þ¤Ç¡¤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 ¤Ç¤¢¤ë¡¥