空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

etolisp 進捗 (9) &REST, &OPTIONAL, &KEY, ,@ の実装

defmacro は,id:xoinu:20070227 の方法で,とりあえず動いているようだ。Lamda を保持する ValueLambda クラスがあって,それを継承して ValueMacro クラスを作った。ついでに &REST,&OPTIONAL,&KEY,に加えて,back-quote でリストを splice する prefix ,@ に対応した。

「&...」も「,...」も,parse 時には単なるシンボルとしてポカポカ構文木に取り込んで,lambda の定義を評価するときに適宜「&」や 「,」をチェックするようにした。実装は思ったよりも簡単だ。構文木の評価結果をキャッシュしたり,使用頻度の高い関数は別スレッドで動的にコンパイルできるようにしたりとか,夢は広がる。

僕がいままで知っていたプログラミング言語は,特定の問題を解くのに便利なように記号を増やしたり演算子の優先順位を人為的に操作して,S 式を変換させただけのものなんだなーと思うようになってきた。

今のところ,etolisp は大きく分けて

  • parser
  • cons, value
  • runtime
  • controller

のよっつからできている。controller というのは,コマンドラインやデバッガ用のインターフェースを提供する層で,多くの人に使ってもらう(ことが仮にあったら)ことになってから充実させようと思っている。runtime は,上で妄想したような,動的コンパイルや,スレッド,ガーベージコレクション,さらにデバイスや,他言語とのインターフェースなどを提供する際に重要になってくる。

ある機能を追加するときに,実装の仕方は何通りもある。たとえば,macro や &REST の実装については,parser の層で対応する選択肢もあったと思う。今回,lambda の評価時に処理する方法は,それを value の層で実装したことになる(あくまで観念的なものに過ぎないけど)。今のところは,何事も評価を先送りさせて動的さを保つと同時に,この仮想的な四本柱を偏りなく充実させることに注意して設計上の判断を下すようにしている。