next up previous
Next: 9.2 コード・インタプリタ Up: 9 生成コードの実行 Previous: 9 生成コードの実行

9.1 基本組み込み関数の定義

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日