aboutsummaryrefslogtreecommitdiff
path: root/ruby
diff options
context:
space:
mode:
Diffstat (limited to 'ruby')
-rw-r--r--ruby/step5_tco.rb11
-rw-r--r--ruby/step6_file.rb11
-rw-r--r--ruby/step7_quote.rb13
-rw-r--r--ruby/step8_macros.rb13
-rw-r--r--ruby/step9_interop.rb13
-rw-r--r--ruby/stepA_more.rb13
6 files changed, 40 insertions, 34 deletions
diff --git a/ruby/step5_tco.rb b/ruby/step5_tco.rb
index 6be04ae..38bb204 100644
--- a/ruby/step5_tco.rb
+++ b/ruby/step5_tco.rb
@@ -48,17 +48,18 @@ def EVAL(ast, env)
a1.each_slice(2) do |a,e|
let_env.set(a, EVAL(e, let_env))
end
- return EVAL(a2, let_env)
+ env = let_env
+ ast = a2 # Continue loop (TCO)
when :do
eval_ast(ast[1..-2], env)
- ast = ast.last
+ ast = ast.last # Continue loop (TCO)
when :if
cond = EVAL(a1, env)
if not cond
return nil if a3 == nil
- ast = a3
+ ast = a3 # Continue loop (TCO)
else
- ast = a2
+ ast = a2 # Continue loop (TCO)
end
when :"fn*"
return Function.new(a2, env, a1) {|*args|
@@ -69,7 +70,7 @@ def EVAL(ast, env)
f = el[0]
if f.class == Function
ast = f.ast
- env = f.gen_env(el.drop(1))
+ env = f.gen_env(el.drop(1)) # Continue loop (TCO)
else
return f[*el.drop(1)]
end
diff --git a/ruby/step6_file.rb b/ruby/step6_file.rb
index 191febe..0c99cee 100644
--- a/ruby/step6_file.rb
+++ b/ruby/step6_file.rb
@@ -48,17 +48,18 @@ def EVAL(ast, env)
a1.each_slice(2) do |a,e|
let_env.set(a, EVAL(e, let_env))
end
- return EVAL(a2, let_env)
+ env = let_env
+ ast = a2 # Continue loop (TCO)
when :do
eval_ast(ast[1..-2], env)
- ast = ast.last
+ ast = ast.last # Continue loop (TCO)
when :if
cond = EVAL(a1, env)
if not cond
return nil if a3 == nil
- ast = a3
+ ast = a3 # Continue loop (TCO)
else
- ast = a2
+ ast = a2 # Continue loop (TCO)
end
when :"fn*"
return Function.new(a2, env, a1) {|*args|
@@ -69,7 +70,7 @@ def EVAL(ast, env)
f = el[0]
if f.class == Function
ast = f.ast
- env = f.gen_env(el.drop(1))
+ env = f.gen_env(el.drop(1)) # Continue loop (TCO)
else
return f[*el.drop(1)]
end
diff --git a/ruby/step7_quote.rb b/ruby/step7_quote.rb
index 18b7db3..48385f1 100644
--- a/ruby/step7_quote.rb
+++ b/ruby/step7_quote.rb
@@ -64,21 +64,22 @@ def EVAL(ast, env)
a1.each_slice(2) do |a,e|
let_env.set(a, EVAL(e, let_env))
end
- return EVAL(a2, let_env)
+ env = let_env
+ ast = a2 # 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[1..-2], env)
- ast = ast.last
+ ast = ast.last # Continue loop (TCO)
when :if
cond = EVAL(a1, env)
if not cond
return nil if a3 == nil
- ast = a3
+ ast = a3 # Continue loop (TCO)
else
- ast = a2
+ ast = a2 # Continue loop (TCO)
end
when :"fn*"
return Function.new(a2, env, a1) {|*args|
@@ -89,7 +90,7 @@ def EVAL(ast, env)
f = el[0]
if f.class == Function
ast = f.ast
- env = f.gen_env(el.drop(1))
+ env = f.gen_env(el.drop(1)) # Continue loop (TCO)
else
return f[*el.drop(1)]
end
diff --git a/ruby/step8_macros.rb b/ruby/step8_macros.rb
index 3c99cce..58adaea 100644
--- a/ruby/step8_macros.rb
+++ b/ruby/step8_macros.rb
@@ -83,11 +83,12 @@ def EVAL(ast, env)
a1.each_slice(2) do |a,e|
let_env.set(a, EVAL(e, let_env))
end
- return EVAL(a2, let_env)
+ env = let_env
+ ast = a2 # Continue loop (TCO)
when :quote
return a1
when :quasiquote
- return EVAL(quasiquote(a1), env)
+ ast = quasiquote(a1); # Continue loop (TCO)
when :defmacro!
func = EVAL(a2, env)
func.is_macro = true
@@ -96,14 +97,14 @@ def EVAL(ast, env)
return macroexpand(a1, env)
when :do
eval_ast(ast[1..-2], env)
- ast = ast.last
+ ast = ast.last # Continue loop (TCO)
when :if
cond = EVAL(a1, env)
if not cond
return nil if a3 == nil
- ast = a3
+ ast = a3 # Continue loop (TCO)
else
- ast = a2
+ ast = a2 # Continue loop (TCO)
end
when :"fn*"
return Function.new(a2, env, a1) {|*args|
@@ -114,7 +115,7 @@ def EVAL(ast, env)
f = el[0]
if f.class == Function
ast = f.ast
- env = f.gen_env(el.drop(1))
+ env = f.gen_env(el.drop(1)) # Continue loop (TCO)
else
return f[*el.drop(1)]
end
diff --git a/ruby/step9_interop.rb b/ruby/step9_interop.rb
index 507114e..6d2cbe2 100644
--- a/ruby/step9_interop.rb
+++ b/ruby/step9_interop.rb
@@ -83,11 +83,12 @@ def EVAL(ast, env)
a1.each_slice(2) do |a,e|
let_env.set(a, EVAL(e, let_env))
end
- return EVAL(a2, let_env)
+ env = let_env
+ ast = a2 # Continue loop (TCO)
when :quote
return a1
when :quasiquote
- return EVAL(quasiquote(a1), env)
+ ast = quasiquote(a1); # Continue loop (TCO)
when :defmacro!
func = EVAL(a2, env)
func.is_macro = true
@@ -98,14 +99,14 @@ def EVAL(ast, env)
return eval(a1)
when :do
eval_ast(ast[1..-2], env)
- ast = ast.last
+ ast = ast.last # Continue loop (TCO)
when :if
cond = EVAL(a1, env)
if not cond
return nil if a3 == nil
- ast = a3
+ ast = a3 # Continue loop (TCO)
else
- ast = a2
+ ast = a2 # Continue loop (TCO)
end
when :"fn*"
return Function.new(a2, env, a1) {|*args|
@@ -116,7 +117,7 @@ def EVAL(ast, env)
f = el[0]
if f.class == Function
ast = f.ast
- env = f.gen_env(el.drop(1))
+ env = f.gen_env(el.drop(1)) # Continue loop (TCO)
else
return f[*el.drop(1)]
end
diff --git a/ruby/stepA_more.rb b/ruby/stepA_more.rb
index 101dee3..6123293 100644
--- a/ruby/stepA_more.rb
+++ b/ruby/stepA_more.rb
@@ -83,11 +83,12 @@ def EVAL(ast, env)
a1.each_slice(2) do |a,e|
let_env.set(a, EVAL(e, let_env))
end
- return EVAL(a2, let_env)
+ env = let_env
+ ast = a2 # Continue loop (TCO)
when :quote
return a1
when :quasiquote
- return EVAL(quasiquote(a1), env)
+ ast = quasiquote(a1); # Continue loop (TCO)
when :defmacro!
func = EVAL(a2, env)
func.is_macro = true
@@ -113,14 +114,14 @@ def EVAL(ast, env)
end
when :do
eval_ast(ast[1..-2], env)
- ast = ast.last
+ ast = ast.last # Continue loop (TCO)
when :if
cond = EVAL(a1, env)
if not cond
return nil if a3 == nil
- ast = a3
+ ast = a3 # Continue loop (TCO)
else
- ast = a2
+ ast = a2 # Continue loop (TCO)
end
when :"fn*"
return Function.new(a2, env, a1) {|*args|
@@ -131,7 +132,7 @@ def EVAL(ast, env)
f = el[0]
if f.class == Function
ast = f.ast
- env = f.gen_env(el.drop(1))
+ env = f.gen_env(el.drop(1)) # Continue loop (TCO)
else
return f[*el.drop(1)]
end