Previous Up Next

3.4牋ML2 — 年盗の瞥掐

ここまで·MLプログラム面で徊救できる恃眶は main.ml 面の initial_env であらかじめ年められた恃眶に嘎られていたˉML2で は恃眶离咐の怠墙を·let 离咐と let 及として瞥掐するˉ

3.4.1牋let 离咐ˇ及の瞥掐

ML2 の菇矢は·笆布のように涂えられるˉ

�<プログラム>::=…爘�let �<急侍灰>�=�<及>�;;�
牋<及>::=…�
 |let�<急侍灰>�=�<及1> 牋牋牋牋牋牋牋�in�<及2>

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: 渡疥年盗


Exercise�4牋[涩饯草玛] ML2 インタプリタを侯喇し·テストせよˉ
Exercise�5牋[岂白刨 1] Objective Caml では·let离咐の误を办刨に掐蜗することができるˉ この怠墙を悸刘せよˉ笆布は瓢侯毋であるˉ

# let x = 1
  let y = x + 1;;
val x = 1
val y = 2
Exercise�6牋[岂白刨 1] バッチインタプリタを侯喇せよˉ恶挛弄には miniml コマンドの苞眶とし て ファイル叹をとり·そのファイルの柒推を豺坚し·冯蔡をディスプレイ に叫蜗するように恃构せよˉまた·コメントを痰浑するよう悸刘せよˉ
Exercise�7牋[岂白刨 2] andを蝗って恃眶を票箕にふたつ笆惧离咐できるように let 及ˇ离咐を橙磨せよˉ毋えば笆布のプログラム

let x = 100
and y = x in x+y
の悸乖冯蔡は 200 ではなく·(xが络拌茨董で 10に芦躯され ているので) 110 であるˉ

Previous Up Next