Sha256: 2405283560594a66be778b35858bce1cd60273b6e08bf423df0c97cd36434ab9
Contents?: true
Size: 886 Bytes
Versions: 2
Compression:
Stored size: 886 Bytes
Contents
require "lasp/parser" require "lasp/env" module Lasp module_function def eval(ast, env) case ast when Symbol then env.fetch(ast) when Array then eval_form(ast, env) else ast end end def eval_form(form, env) head, *tail = *form if head == :def key, value = tail env[key] = eval(value, env) elsif head == :fn params, func = tail # Use env from context to properly scope closures -> (_, *args) { eval(func, env.merge(Hash[params.zip(args)])) } elsif head == :do tail.map { |form| eval(form, env) }.last elsif head == :if conditional, true_form, false_form = tail eval(conditional, env) ? eval(true_form, env) : eval(false_form, env) elsif Proc === head head.(env, *tail) else fn = eval(head, env) fn.(env, *tail.map { |form| eval(form, env) }) end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
lasp-0.4.0 | lib/lasp/eval.rb |
lasp-0.3.2 | lib/lasp/eval.rb |