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 な定義が漏れていたみたいです。試験を追加するリキがあれば、追記します。
# って書いてそうしたコトはあまり無いですが