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. --- ruby/step6_file.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'ruby/step6_file.rb') 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 -- cgit v1.2.3