やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。
REPLまで出来て
(+ 1 2)
は動くのに
(+ (+ 1 2) 3)
が動かなくて、evalの再帰が悪いのかと思ったら、Functionのほうだった。
sub fun {
my ($self, $arguments) = @_;
my $arg1;
my $ret = Moosp::Integer->new(value => 0);
return $ret if ($arguments->isa('Moosp::Nil'));
while (1) {
$arg1 = $self->eval->eval($arguments->car);
$ret = $ret->add($arg1);
last if ($arguments->cdr->isa('Moosp::Nil'));
$arguments = $arguments->cdr;
}
return $ret;
}
carがfunctionの場合はcdr部は全て評価済みにしておかないといけないんだった。
やっとうまく動いた
Moosp> (+ (+ 1 2) (+ 3 4))
10
tak実行が見えてきた。