(defun comp (x env) (cond ((symbolp x) (gen-var x env)) ((atom x) (gen 'CONST x)) ((member (car x) '(quote begin set! if lambda)) (comp-specialform (car x) (cdr x) env)) ((scheme-macro (car x)) (comp (scheme-macro-expand x) env)) (t (comp-call (car x) (cdr x) env))))interpreterと同様に場合にわけて,それぞれをコンパイルする ことを考えます. コード生成は,命令コードとその命令への引数とをまとめてリストにし たもののリストで表現することにします.
(defun gen (opcode &rest args) (list (cons opcode args)))