パーサのバグを修正

* *scrap*でニコ動Lispのバグを指摘されました。

(defun if0 (n a b) (if (eq 0 n) a b))
(if0 0 1 2) ;=> 2
((lambda (n) (if (eq 0 n) 1 2) 0) ;=> 2
((lambda (n) (if (eq n 0) 1 2) 0) ;=> 1

(下2行は括弧が足りませんが、ただの誤字でしょう。)
試してみると、たしかにその通り。
youzさん、報告ありがとうございます。
ソースを読んでみると、
数字→スペース→文字(数字以外)
の順番で文字を読み込んだときの処理というのがまるまる抜けていました。
(eq 0 n)がリードされると(eq 0)になっていた。これは酷い。
ついでにevalもつくっておきました。評価にはevalを呼んだときの環境が使われます。
面倒だったので、長時間版の方しか変更していませんが、いいですよね。

ニコ動Lispを公開してから、いくつかバグを見つけては修正しているんですが、
そのほとんどの原因がパーサだったりします。
パーサは最初に書き始めた箇所で、あまり何も考えずに
「動けばいいや」という精神で書いたんですが、
それが後になって苦労の種となってしまいました。
ソースが手抜きなのはともかく、せめて設計だけでも先に真面目にやってればよかった……

Leave a Reply