可変長引数のサポート
私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。
lambdaとmacroの可変長引数のサポートができた。 これで、いろんなScheme処理系みたいに初期化ライブラリがガンガン書けるぜぃ。
例えば、list関数同様の関数は次の様に定義できる。
nendo> (define mylist (lambda lst lst))
#<Proc:0x00063880@(stdin):1>
nendo> (mylist 'a 'b 'c)
(a b c)
1個以上の可変長引数もこの通り
nendo> (define firstAndRest (lambda ( first . rest ) (list first rest)))
#<Proc:0x00050460@(stdin):9>
nendo> (firstAndRest 1 2)
(1 (2))
nendo> (firstAndRest 1 2 3)
(1 (2 3))
これが動くまでにいろんなバグが見つかってなかなか本題の or と and をmacroで書く所まで行けてない。
そんなわけで、思ったよりもLisp処理系を作るのは簡単ではないことが分かりつつあるのだが、書いてはリファクタリングを続けることで頭の中でLispというものがどんどん整理されて行く気がする。これが悟り体験のような気がしてウレシイ。
実際にコードを書いてみて冗長に感じたり、直感的に場合分けが大すぎると感じたりした場合は、だいたいリファクタリングしたらゴッソリと短いコードに置き換わる。
nendo.rbが1000行を超えては1000行に納まるという繰返し。
この感覚なんだろう。
ぷよぷよとかテトリスの連鎖する感じ?
もうそろそろRubyで書く部分は減ってきて Nendoで書く init.nnd の行数が増えて行くのだろう。
quasiquoteが動く日も近いのではないかな?