Commits

relsa committed f47e33e

リファクタリング終わった

Comments (0)

Files changed (3)

Interpreter/eval.ml

       let (id, exp) = car in
       let arg = eval_exp env' exp in
       let newenv = Environment.extend id arg env in
+      Printf.printf "val %s = " id;
+      pp_val arg;
+      print_newline();
       env_contains_vars cdr newenv env'
 ;;
 
   | LetDecl decls ->
     begin match decls with
     | [] ->
-      ("var", env, BoolV true)
+      ("-", env, BoolV true)
     | car :: cdr ->
       let newenv = env_contains_vars car env env in
       eval_decl newenv (LetDecl cdr)

Interpreter/report.ml

 (* -------------------------------- *)
 
 (* Ex3.5 *)
+(* Ex3.7 *)
 
 (* 
    [説明]
    let文を拡張した。
-   let ... let ...を実装するために
-   program型に新しく
-   program * program型を受け取るコンストラクタLetDeclを設けた。
-   左結合的に実装されている。
+   これに伴って、
+   LetExpの引数型が(id * exp) list * expに、
+   LetDeclの引数型が(id * exp) list listになった。
    
    [実行例]
-   
-   # let x = 1 let y = x + 1;;
-   val y = 2 (* 最後の値の束縛結果しか表示されない *)
-   # x;;
+   # let i = 0 let j = 1;;
+   val i = 0
+   val j = 1
+   val - = true                         (* 意味は無い *)
+   # i;;
+   val - = 0
+   # j;;
    val - = 1
-   # y;;
-   val - = 2
-
-   let文を評価する際、
-   最後の束縛結果しかインタプリタに表示されていないが、
-   環境は正しく更新されている。
-   表示部分は余力があれば改善を試みたい。
-*)
-
-(* -------------------------------- *)
-
-(* Ex3.7 *)
-
-(*
-  [説明]
-  let文を拡張した。
-  e1 and e2の形に対応するために規則ADeclを実装、
-  program型に新しく
-  program * program型を受け取るコンストラクタAndDeclを設けた。
-  また、規則LetExprもADeclを使えるように変更した。
-  それに伴い、exp型のコンストラクタLetExpが受け取る引数の型も変更された。
-  
+   # let x = 5 and y = x + 5 in x + y;;
+   val x = 5
+   val y = 15                           (* 大域環境のxが参照されている *)
+   val - = 20                           (* 直前で定義されたxとyの和 *)
+   # x;;
+   val - = 10                           (* xは束縛から開放された *)
+   
 
-  [実行例]
-  # let x = 0 and y = x in x + y;;
-  val - = 10
-  # x;;
-  val - = 10 (* 大域環境のx *)
+   let宣言を評価する際、
+   最後にvar - = trueと表示されるが、
+   特に意味は無い。
+   余力があれば表示されないように改善する。
 *)
 
 (* -------------------------------- *)
   let f x y z = exp
   let f = fun x -> fun y -> fun z -> exp
-  として解釈されるよう意識して、
-  parser.ml, eval.mlを変更した。
-  また、syntax.mlに新しくparam型を追加した。
+  として解釈されるようfoldを用いてパーサを拡張した。
   
   [実行例]
   # (fun x y z -> x * y + z) 5 2 3;;

Interpreter/syntax.ml

   | BinOp of binOp * exp * exp
   | IfExp of exp * exp * exp
   | LetExp of (id * exp) list * exp            (* Ex2.4 *)
-(*  | LetExp of program * exp             (* Ex3.7で引数の型を変更 *) *)
   | FunExp of id * exp               (* Ex3.8, Ex3.10 *)
   | AppExp of exp * exp                 (* Ex3.8 *)
   | LetRecExp of id * id * exp * exp    (* Ex3.14 *)