From 6301e0b6374cecc5599665be14d6ddc6a31ce1e8 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Wed, 23 Apr 2014 21:59:50 -0500 Subject: All: TCO let* and quasiquote. --- perl/step5_tco.pl | 4 ++++ perl/step6_file.pl | 4 ++++ perl/step7_quote.pl | 7 ++++++- perl/step8_macros.pl | 7 ++++++- perl/step9_interop.pl | 7 ++++++- perl/stepA_more.pl | 7 ++++++- 6 files changed, 32 insertions(+), 4 deletions(-) (limited to 'perl') 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()); } -- cgit v1.2.3