diff --git a/lib/Minilisp.pm b/lib/Minilisp.pm index 7eb2269..2d1d303 100644 --- a/lib/Minilisp.pm +++ b/lib/Minilisp.pm @@ -202,21 +202,32 @@ sub macro_let { while ($ts->[0]->{type} != RPAREN) { - my $ident = shift @$ts; - die "Expected identifier in let" unless $ident->{type} == IDENT; + $tok = shift @$ts; + die "Expected pair in parameter list in let" unless $tok->{type} == LPAREN; - my $assignment = parser_expr($ts); + my $ident = shift @$ts; + die "Expected identifier in pair in parameter list in let" unless $ident->{type} == IDENT; + + my $assignment; + if ($ts->[0]->{type} == RPAREN) + { + $assignment = sub { return undef }; + } + else + { + $assignment = parser_expr($ts) + } + + $tok = shift @$ts; + die "Expected ) after parameter pair" unless $tok->{type} == RPAREN; $pctx->{$ident->{value}} = $assignment; } $tok = shift @$ts; - die "Expected ) after assignments in let" unless $tok->{type} == RPAREN; + die "Expected ) after parameter list in let" unless $tok->{type} == RPAREN; - my $inner = parser_expr($ts); - - $tok = shift @$ts; - die "Expected ) after let" unless $tok->{type} == RPAREN; + my $inner = macro_progn($ts); return sub { my $octx = shift;