EoPL reading (132) 3.1 A Simple Interpreter
Figure 3.2 を実装してみる。Ex 3.1 は OK ってコトにしといて次に進む。
以下が実装です。
(add-load-path ".") (load "define-datatype") (load "simple-interpreter") (load "Fig2.3") (define eval-program (lambda (pgm) (cases program pgm (a-program (body) (eval-expression body (init-env)))))) (define eval-expression (lambda (exp env) (cases expression exp (lit-exp (datum) datum) (var-exp (id) (apply-env env id)) (primapp-exp (prim rands) (let ((args (eval-rands rands env))) (apply-primitive prim args)))))) (define eval-rands (lambda (rands env) (map (lambda (x) (eval-rand x env)) rands))) (define eval-rand (lambda (rand env) (eval-expression rand env))) (define apply-primitive (lambda (prim args) (cases primitive prim (add-prim () (+ (car args) (cadr args))) (subtract-prim () (- (car args) (cadr args))) (mult-prim () (* (car args) (cadr args))) (incr-prim () (+ (car args) 1)) (decr-prim () (- (car args) 1)) ))) (define init-env (lambda () (extend-env '(i v x) '(1 5 10) (empty-env))))
なんとなく試験してみました。
(use gauche.test) (add-load-path ".") (load "Fig3.2") (test-start "Fig3.2") (test-section "eval-program") (test* "(eval-program '(a-program (lit-exp 1)))" 1 (eval-program '(a-program (lit-exp 1)))) (test* "(eval-program '(a-program (var-exp x)))" 10 (eval-program '(a-program (var-exp x)))) (test* "(eval-program '(a-program (primapp-exp ((add-prim) ((lit-exp 1) (lit-exp 2))))))" 3 (eval-program '(a-program (primapp-exp (add-prim) ((lit-exp 1) (lit-exp 2)))))) (test* "(eval-program '(a-program (primapp-exp ((add-prim) ((var-exp i) (lit-exp 2))))))" 3 (eval-program '(a-program (primapp-exp (add-prim) ((var-exp i) (lit-exp 2)))))) (test* "(eval-program '(a-program (primapp-exp ((add-prim) ((var-exp i) (var-exp v))))))" 6 (eval-program '(a-program (primapp-exp (add-prim) ((var-exp i) (var-exp v)))))) (test-end)
これを元に色々確認予定ですが、日中時間が取れるのかどうか。