kiyokaのブログアーカイブ

Archive of old blog posts

可変長引数のサポート

私が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行に納まるという繰返し。 この感覚なんだろう。 ぷよぷよとかテトリスの連鎖する感じ? img もうそろそろRubyで書く部分は減ってきて Nendoで書く init.nnd の行数が増えて行くのだろう。 quasiquoteが動く日も近いのではないかな?