EoPL reading (139) 3.2 The Front End

ええと、parse な試験は全部書けてはないはずなので検討。
以下で良いのかな。# 面倒なので全部

(use gauche.test)

(add-load-path ".")
(load "parse-program")
(load "Fig3.2")

(test-start "parse-program")
(test-section "example")
(test* "(eval-program (parse-program '5))"
       5
       (eval-program (parse-program '5)))

(test* "(eval-program (parse-program '(add1 2)))"
       3
       (eval-program (parse-program '(add1 2))))

(test* "(eval-program (parse-program '(+ (add1 2) (- 6 4))))"
       5
       (eval-program (parse-program '(+ (add1 2) (- 6 4)))))

(test-section "parse-program")
(test* "(parse-program 1)"
       '(a-program (lit-exp 1))
       (parse-program 1))

(test-section "parse-expression")
(test* "(parse-expression 1)"
       '(lit-exp 1)
       (parse-expression 1))

(test* "(parse-expression 'a)"
       '(var-exp a)
       (parse-expression 'a))

(test* "(parse-expression '(+ 1 1))"
       '(primapp-exp (add-prim) ((lit-exp 1) (lit-exp 1)))
       (parse-expression '(+ 1 1)))

(test* "(parse-expression '(- 1 1))"
       '(primapp-exp (subtract-prim) ((lit-exp 1) (lit-exp 1)))
       (parse-expression '(- 1 1)))

(test* "(parse-expression '(* 1 1))"
       '(primapp-exp (mult-prim) ((lit-exp 1) (lit-exp 1)))
       (parse-expression '(* 1 1)))

(test* "(parse-expression '(add1 1))"
       '(primapp-exp (incr-prim) ((lit-exp 1)))
       (parse-expression '(add1 1)))

(test* "(parse-expression '(sub1 1))"
       '(primapp-exp (decr-prim) ((lit-exp 1)))
       (parse-expression '(sub1 1)))

(test-end)

これで Ex.3.3 は OK ってコトにします。次は 3.4 です。パワーが続く限りヤッツケな方向にて。

Exercise 3.4

ええと、run は gauche.test で試験できますが read-eval-print は無理ですな。とりあえず run の試験が以下。

(use gauche.test)

(add-load-path ".")
(load "run")

(test-start "run")
(test-section "run")
(test* "(run '5)"
       5
       (run '5))

(test* "(run '(add1 2))"
       3
       (run '(add1 2)))

(test* "(run '(sub1 2))"
       1
       (run '(sub1 2)))

(test* "(run '(+ 1 1))"
       2
       (run '(+ 1 1)))

(test* "(run '(- 1 1))"
       0
       (run '(- 1 1)))

(test* "(run '(* 1 1))"
       1
       (run '(* 1 1)))

(test* "(run 'x)"
       10
       (run 'x))

(test-end)

今日はこれで力尽きる方向ッス。残りは明日以降な上に GAE にニゲる可能性大。あとマクドで無線の動作確認したい。 (何