aboutsummaryrefslogtreecommitdiff
path: root/perl
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-23 21:59:50 -0500
committerJoel Martin <github@martintribe.org>2014-04-23 21:59:50 -0500
commit6301e0b6374cecc5599665be14d6ddc6a31ce1e8 (patch)
treedbf1dc2ff6c682fd87c72a7907e7f6e59c8d4c03 /perl
parent89bd4de1e2704c1bc562788b2c5e4fc08b71a538 (diff)
downloadmal-6301e0b6374cecc5599665be14d6ddc6a31ce1e8.tar.gz
mal-6301e0b6374cecc5599665be14d6ddc6a31ce1e8.zip
All: TCO let* and quasiquote.
Diffstat (limited to 'perl')
-rw-r--r--perl/step5_tco.pl4
-rw-r--r--perl/step6_file.pl4
-rw-r--r--perl/step7_quote.pl7
-rw-r--r--perl/step8_macros.pl7
-rw-r--r--perl/step9_interop.pl7
-rw-r--r--perl/stepA_more.pl7
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());
}