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)

これを元に色々確認予定ですが、日中時間が取れるのかどうか。