EoPL reading (143) 3.2 The Front End
色々バタバタしてたので久々なカンジ。
Exercise 3.7
cons とか car とか cdr とか list の追加。
ええと、ここ からカンニングしたところでは、新たな primitive の追加は以下三点の追加必要との事。
- primitive を define-datatype している箇所への情報追加
- parse-expression 手続きへの情報追加
- apply-primitive 手続きへの情報追加
とりあえず、parse-expression 手続きに情報を追加。
(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) ((eq? 'print (car datum)) 'print-prim) ((eq? 'minus (car datum)) 'minus-prim) ((eq? 'list (car datum)) 'list-prim) ((eq? 'cons (car datum)) 'cons-prim) ((eq? 'car (car datum)) 'car-prim) ((eq? 'cdr (car datum)) 'cdr-prim) )) (map (lambda (x) (parse-expression x)) (cdr datum)))))))
primitive な define-datatype への情報追加が以下。
(define-datatype primitive primitive? (add-prim) (subtract-prim) (mult-prim) (incr-prim) (decr-prim) (print-prim) (minus-prim) (list-prim) (cons-prim) (car-prim) (cdr-prim))
あと、apply-primitive 手続きが残りですか。いいのかなぁ。
(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)) (print-prim () (print (car args)) 1) (minus-prim () (- (car args))) (list-prim () (list args)) (cons-prim () (cons (car args) (cadr args))) (car-prim () (car (car args))) (cdr-prim () (cdr (car args))) )))
で、上記を盛り込んで試験を動かしてみたらデグレードな模様。primitive な定義が漏れていたみたいです。試験を追加するリキがあれば、追記します。
# って書いてそうしたコトはあまり無いですが