[Lisp処理系を作る] 13日目 システム関数を作る

この時点で Lisp のオブジェクトのシステム自体は出来ており、後は以下が残っている。

  • デフォルトの関数群(システム関数)
  • パーサ
  • 人間とのインターフェイス

という事で、とりあえずシステム関数を作ります。

必要なシステム関数

Lisp はある程度システム関数が用意されていれば、他の多くの関数はそれらの組合せで実現できるようです。 とりあえず今回実装するシステム関数は以下。 一部 xyzzy には存在しない関数も用意する。

  • car
  • cdr
  • quote
  • cons
  • atom
  • cond
  • eq
  • progn
  • if
  • cond
  • lambda
  • macro (マクロ作成関数)
  • function
  • bind-function (関数登録関数)
  • set
  • apply
  • funcall
  • setq
  • eval
  • list
  • macroexpand
  • let*
  • 他数値用関数

それぞれの関数の解説は面倒なのでソースを参照してください。 基本的に今まで実装したメソッドなどを使えば出来るはず。

システム関数 1 つに対し 1 つのクラスを作成する。 それぞれの関数は Lambda または SpecialForm または Macro を継承して作成する。

作成した関数の登録

Env を作成する際に自前の関数テーブルにそれぞれのシステム関数クラスのインスタンスを登録するようにする。

また、 defun や defmacro 等のマクロもその場で S 式を作成してマクロを作り登録する。

これまでの成果