diff options
Diffstat (limited to 'ruby')
| -rw-r--r-- | ruby/step5_tco.rb | 11 | ||||
| -rw-r--r-- | ruby/step6_file.rb | 11 | ||||
| -rw-r--r-- | ruby/step7_quote.rb | 13 | ||||
| -rw-r--r-- | ruby/step8_macros.rb | 13 | ||||
| -rw-r--r-- | ruby/step9_interop.rb | 13 | ||||
| -rw-r--r-- | ruby/stepA_more.rb | 13 |
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 |
