Next: 9.2 コード・インタプリタ
Up: 9 生成コードの実行
Previous: 9 生成コードの実行
Schemeのcarや+などの基本組み込み関数の
実行には,Lispのそれを使うことにします.
そのため,これらの組み込み関数は,
lambdaで作られる関数と同様に関数の構造を
もつ必要があります.
そこで,コードとして,対応する
Lispの関数名を呼び出すという命令コード
PRIMをつくり,そのPRIMの後に対応する
Lisp関数を書いてコードを新たに導入します.
defineで生成されたname!についても
その対応するLisp関数が必要であるため,
それを他の組み込み関数と同様に
初期化の段階で登録するという
ことを行うことにします.
(defun init-scheme-proc (x)
(if
(atom x)
(init-scheme-proc (list x x))
(set-global-var!
(car x)
(make-fn
:name (car x)
:code
(seq
(gen 'prim (cadr x))
(gen 'return))))))
(defparameter *scheme-procs*
'(+ - * / abs sqrt sin cos atan
= < > <= >=
cons car cdr not append list
member read random name!
(null? null) (eq? eq)
(equal? equal) (eqv? eql)
(compile scheme-compile)
(exit scheme-exit)
(number? numberp)
(even? evenp) (odd? oddp)
(write prin1) (display princ)
(newline terpri)))
(defun set-global-var! (var value)
(setf (get var 'scheme-global-value) value))
(defun name! (fn name)
(when (and (fn-p fn) (null (fn-name fn)))
(setf (fn-name fn) name))
name)
という具合に定義して,
(defun init-scheme-compiler ()
(init-scheme-macros)
(set-global-var! nil nil)
(set-global-var! t t)
(mapc #'init-scheme-proc *scheme-procs*)
)
という具合にinit-scheme-compilerを再定義します.
generated through LaTeX2HTML. M.Inaba 平成18年5月6日