diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-23 21:59:50 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-23 21:59:50 -0500 |
| commit | 6301e0b6374cecc5599665be14d6ddc6a31ce1e8 (patch) | |
| tree | dbf1dc2ff6c682fd87c72a7907e7f6e59c8d4c03 /perl | |
| parent | 89bd4de1e2704c1bc562788b2c5e4fc08b71a538 (diff) | |
| download | mal-6301e0b6374cecc5599665be14d6ddc6a31ce1e8.tar.gz mal-6301e0b6374cecc5599665be14d6ddc6a31ce1e8.zip | |
All: TCO let* and quasiquote.
Diffstat (limited to 'perl')
| -rw-r--r-- | perl/step5_tco.pl | 4 | ||||
| -rw-r--r-- | perl/step6_file.pl | 4 | ||||
| -rw-r--r-- | perl/step7_quote.pl | 7 | ||||
| -rw-r--r-- | perl/step8_macros.pl | 7 | ||||
| -rw-r--r-- | perl/step9_interop.pl | 7 | ||||
| -rw-r--r-- | perl/stepA_more.pl | 7 |
6 files changed, 32 insertions, 4 deletions
diff --git a/perl/step5_tco.pl b/perl/step5_tco.pl index b041110..44de718 100644 --- a/perl/step5_tco.pl +++ b/perl/step5_tco.pl @@ -68,10 +68,12 @@ sub EVAL { } $ast = $a2; $env = $let_env; + # Continue loop (TCO) } when (/^do$/) { eval_ast($ast->slice(1, $#{$ast->{val}}-1), $env); $ast = $ast->nth($#{$ast->{val}}); + # Continue loop (TCO) } when (/^if$/) { my $cond = EVAL($a1, $env); @@ -80,6 +82,7 @@ sub EVAL { } else { $ast = $a2; } + # Continue loop (TCO) } when (/^fn\*$/) { return Function->new(\&EVAL, $a2, $env, $a1); @@ -90,6 +93,7 @@ sub EVAL { if ((ref $f) =~ /^Function/) { $ast = $f->{ast}; $env = $f->gen_env($el->rest()); + # Continue loop (TCO) } else { return &{ $f }($el->rest()); } diff --git a/perl/step6_file.pl b/perl/step6_file.pl index a5f7791..9fcac1d 100644 --- a/perl/step6_file.pl +++ b/perl/step6_file.pl @@ -68,10 +68,12 @@ sub EVAL { } $ast = $a2; $env = $let_env; + # Continue loop (TCO) } when (/^do$/) { eval_ast($ast->slice(1, $#{$ast->{val}}-1), $env); $ast = $ast->nth($#{$ast->{val}}); + # Continue loop (TCO) } when (/^if$/) { my $cond = EVAL($a1, $env); @@ -80,6 +82,7 @@ sub EVAL { } else { $ast = $a2; } + # Continue loop (TCO) } when (/^fn\*$/) { return Function->new(\&EVAL, $a2, $env, $a1); @@ -90,6 +93,7 @@ sub EVAL { if ((ref $f) =~ /^Function/) { $ast = $f->{ast}; $env = $f->gen_env($el->rest()); + # Continue loop (TCO) } else { return &{ $f }($el->rest()); } diff --git a/perl/step7_quote.pl b/perl/step7_quote.pl index 9654cc8..19c0599 100644 --- a/perl/step7_quote.pl +++ b/perl/step7_quote.pl @@ -91,16 +91,19 @@ sub EVAL { } $ast = $a2; $env = $let_env; + # Continue loop (TCO) } when (/^quote$/) { return $a1; } when (/^quasiquote$/) { - return EVAL(quasiquote($a1), $env); + $ast = quasiquote($a1); + # Continue loop (TCO) } when (/^do$/) { eval_ast($ast->slice(1, $#{$ast->{val}}-1), $env); $ast = $ast->nth($#{$ast->{val}}); + # Continue loop (TCO) } when (/^if$/) { my $cond = EVAL($a1, $env); @@ -109,6 +112,7 @@ sub EVAL { } else { $ast = $a2; } + # Continue loop (TCO) } when (/^fn\*$/) { return Function->new(\&EVAL, $a2, $env, $a1); @@ -119,6 +123,7 @@ sub EVAL { if ((ref $f) =~ /^Function/) { $ast = $f->{ast}; $env = $f->gen_env($el->rest()); + # Continue loop (TCO) } else { return &{ $f }($el->rest()); } diff --git a/perl/step8_macros.pl b/perl/step8_macros.pl index 22f078f..47004a2 100644 --- a/perl/step8_macros.pl +++ b/perl/step8_macros.pl @@ -117,12 +117,14 @@ sub EVAL { } $ast = $a2; $env = $let_env; + # Continue loop (TCO) } when (/^quote$/) { return $a1; } when (/^quasiquote$/) { - return EVAL(quasiquote($a1), $env); + $ast = quasiquote($a1); + # Continue loop (TCO) } when (/^defmacro!$/) { my $func = EVAL($a2, $env); @@ -135,6 +137,7 @@ sub EVAL { when (/^do$/) { eval_ast($ast->slice(1, $#{$ast->{val}}-1), $env); $ast = $ast->nth($#{$ast->{val}}); + # Continue loop (TCO) } when (/^if$/) { my $cond = EVAL($a1, $env); @@ -143,6 +146,7 @@ sub EVAL { } else { $ast = $a2; } + # Continue loop (TCO) } when (/^fn\*$/) { return Function->new(\&EVAL, $a2, $env, $a1); @@ -153,6 +157,7 @@ sub EVAL { if ((ref $f) =~ /^Function/) { $ast = $f->{ast}; $env = $f->gen_env($el->rest()); + # Continue loop (TCO) } else { return &{ $f }($el->rest()); } diff --git a/perl/step9_interop.pl b/perl/step9_interop.pl index 2c20e89..45dd4af 100644 --- a/perl/step9_interop.pl +++ b/perl/step9_interop.pl @@ -118,12 +118,14 @@ sub EVAL { } $ast = $a2; $env = $let_env; + # Continue loop (TCO) } when (/^quote$/) { return $a1; } when (/^quasiquote$/) { - return EVAL(quasiquote($a1), $env); + $ast = quasiquote($a1); + # Continue loop (TCO) } when (/^defmacro!$/) { my $func = EVAL($a2, $env); @@ -139,6 +141,7 @@ sub EVAL { when (/^do$/) { eval_ast($ast->slice(1, $#{$ast->{val}}-1), $env); $ast = $ast->nth($#{$ast->{val}}); + # Continue loop (TCO) } when (/^if$/) { my $cond = EVAL($a1, $env); @@ -147,6 +150,7 @@ sub EVAL { } else { $ast = $a2; } + # Continue loop (TCO) } when (/^fn\*$/) { return Function->new(\&EVAL, $a2, $env, $a1); @@ -157,6 +161,7 @@ sub EVAL { if ((ref $f) =~ /^Function/) { $ast = $f->{ast}; $env = $f->gen_env($el->rest()); + # Continue loop (TCO) } else { return &{ $f }($el->rest()); } diff --git a/perl/stepA_more.pl b/perl/stepA_more.pl index 8520480..eca2b6e 100644 --- a/perl/stepA_more.pl +++ b/perl/stepA_more.pl @@ -118,12 +118,14 @@ sub EVAL { } $ast = $a2; $env = $let_env; + # Continue loop (TCO) } when (/^quote$/) { return $a1; } when (/^quasiquote$/) { - return EVAL(quasiquote($a1), $env); + $ast = quasiquote($a1); + # Continue loop (TCO) } when (/^defmacro!$/) { my $func = EVAL($a2, $env); @@ -166,6 +168,7 @@ sub EVAL { when (/^do$/) { eval_ast($ast->slice(1, $#{$ast->{val}}-1), $env); $ast = $ast->nth($#{$ast->{val}}); + # Continue loop (TCO) } when (/^if$/) { my $cond = EVAL($a1, $env); @@ -174,6 +177,7 @@ sub EVAL { } else { $ast = $a2; } + # Continue loop (TCO) } when (/^fn\*$/) { return Function->new(\&EVAL, $a2, $env, $a1); @@ -184,6 +188,7 @@ sub EVAL { if ((ref $f) =~ /^Function/) { $ast = $f->{ast}; $env = $f->gen_env($el->rest()); + # Continue loop (TCO) } else { return &{ $f }($el->rest()); } |
