EoPL reading (138) 3.2 The Front End

直前エントリはダウトで終わったんですが、帰宅後に以下をでっち上げた。

(define parse-program
  (lambda (datum)
    (list 'a-program (parse-expression datum))))

(define parse-expression
  (lambda (datum)
    (cond ((number? datum) (list 'lit-exp datum))
	  ((symbol? datum) (list 'var-exp datum))
	  ((pair? datum) 
	   (list 'primapp 
		 (cond ((eq? '+ (car datum)) 'add-prim)
		       ((eq? '- (car datum)) 'subtract-prim)
		       ((eq? '* (car datum)) 'mult-prim)
		       ((eq? 'add1 (car datum)) 'incr-prim)
		       ((eq? 'sub1 (car datum)) 'decr-prim))
		 (map (lambda (x) (parse-expression x)) (cdr datum)))))))

なんとなく微妙。以下な試験をとりあえず一つだけ作成。

(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-end)

試験したらこの試験はパスしたんですが、別の試験が fail との事。なんでかねー、と思ったら実装が以下でした。

(define eval-program
  (lambda (pgm)
    (cases program pgm
	   (a-program (body)
;;		      (eval-expression body (init-env))))))
		      (eval-expression body (empty-env))))))

これは変数束縛の解決ができません。適宜修正して試験パス。続きの試験を書く。以下を追加。

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

予想通り試験に通らん。流石にあまり考えナシな実装は通らんか。って primapp のみ、な実装にしている事が判明。とほほ杉。
で、色々試行錯誤して実装が以下。

(define parse-program
  (lambda (datum)
    (list 'a-program (parse-expression datum))))

(define parse-expression
  (lambda (datum)
    (cond ((number? datum) (list 'lit-exp datum))
	  ((symbol? datum) (list 'var-exp datum))
	  ((pair? datum) 
	   (list 'primapp-exp
		 (list (cond ((eq? '+ (car datum)) 'add-prim)
			     ((eq? '- (car datum)) 'subtract-prim)
			     ((eq? '* (car datum)) 'mult-prim)
			     ((eq? 'add1 (car datum)) 'incr-prim)
			     ((eq? 'sub1 (car datum)) 'decr-prim)))
		 (map (lambda (x) (parse-expression x)) (cdr datum)))))))

以下な試験にもパスはしてます。

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

上記以外の試験と 3.4 の eval-program の試験は明日現実トウヒの時間が確保できれば、な世界ッス。