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