diff --git a/lib/Minilisp.pm b/lib/Minilisp.pm index 99d5f05..dec835d 100644 --- a/lib/Minilisp.pm +++ b/lib/Minilisp.pm @@ -977,6 +977,25 @@ sub macro_return { } $macros{'return'} = \¯o_return; +sub macro_loop { + my $ts = shift; + + my $inner = macro_progn($ts); + + return create_block( + "nil", + sub { + my $ctx = shift; + + while (1) + { + $inner->($ctx); + } + } + ); +} +$macros{loop} = \¯o_loop; + sub compile { my ($term) = @_; my @tokens = tokenize($term); diff --git a/t/loop.t b/t/loop.t new file mode 100644 index 0000000..76149bd --- /dev/null +++ b/t/loop.t @@ -0,0 +1,6 @@ +(expect "loop" + (equal (let ((i 0)) + (loop (set i (+ i 1)) + (when (> i 3) + (return i)))) + 4))