空想犬猫記

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

etolisp 進捗 (13) 〜 パーサの改良

追記:このエントリは誤っている可能性が高いです。
今までパーサでは愚直に cons tree をくみ上げていたが,&optional や &key の文脈によっては,cons 以外の構造体,たとえば hash などで構文木を作った方が効率的であることに気付き始めた。いろいろできることはあるかも知れないが,今日は &optional について対応。たとえば

(defun foo (x &optional y z) (and x y z))
(defun foo (x &optional (y 1) (z 2)) (+ x y z))

という入力は

(defun foo (x &optional y z) (and x y z))
(defun foo (x &optional #<Hash-Table 0x15058c0:2> y z) (+ x y z))

のようにパースされる。今のところ &optional は特殊なシンボルとしてパースしてしまっていて,defun の評価時に &optional シンボルの後に hash がいたら,デフォルト値を保持している hash と仮定して処理する。defun の評価時に cons tree 解析してごにょごにょするよりは,カッコとコッカのパース時に一気に native な構造体を作ってしまった方がずっと楽だとの判断。

key と value による引数の指定,

(foo 1 :y 2 :z 4)

(foo 1 #<Hash-Table 0x15058c0:2>)

のようにパースされる。アトム&カッコ&コッカ⇒ cons tree の対応関係から逸脱してしまったけれど,かなり実用的で扱いやすくなったと思われる。