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 の試験は明日現実トウヒの時間が確保できれば、な世界ッス。