class Nydp::Compiler

Public Class Methods

compile(expression, bindings, ns) click to toggle source
# File lib/nydp/compiler.rb, line 11
def self.compile expression, bindings, ns
  compile_expr expression, bindings, ns
rescue StandardError => e
  raise Nydp::Error.new "failed to compile expression:\n#{expression._nydp_inspect}\n#{e.message}"
end
compile_each(expr, bindings, ns) click to toggle source
# File lib/nydp/compiler.rb, line 38
def self.compile_each expr, bindings, ns
  if expr == nil
    expr
  elsif pair?(expr)
    maybe_cons compile(expr.car, bindings, ns), compile_each(expr.cdr, bindings, ns)
  else
    compile(expr, bindings, ns)
  end
end
compile_expr(expression, bindings, ns) click to toggle source
# File lib/nydp/compiler.rb, line 17
def self.compile_expr expression, bindings, ns
  # if expression.is_a? Nydp::Symbol
  if expression.is_a? ::Symbol
    SymbolLookup.build expression, bindings, ns
  elsif literal? expression
    Literal.build expression, bindings, ns
  elsif expression.is_a? Nydp::Pair
    begin
      compile_pair expression, bindings, ns
    rescue => e
      raise "failed to compile #{expression._nydp_inspect}"
    end
  else
    raise Nydp::Error.new "failed to compile unrecognised expression:\n#{expression._nydp_inspect}\nwhich is a #{expression.class}"
  end
end
compile_pair(expression, bindings, ns) click to toggle source
# File lib/nydp/compiler.rb, line 48
def self.compile_pair expression, bindings, ns
  key = expression.car
  if sym?(key, :cond)
    Cond.build expression.cdr, bindings, ns # todo: replace with function? (cond x (fn () iftrue) (fn () iffalse)) -->> performance issues, creating two closures for every cond invocation
  elsif sym?(key, :loop)
    Loop.build expression.cdr, bindings, ns
  elsif sym?(key, :quote)
    Literal.build expression.cadr, bindings, ns
  elsif sym?(key, :assign)
    Assignment.build expression.cdr, bindings, ns
  elsif sym?(key, :fn)
    InterpretedFunction.build expression.cadr, expression.cddr, bindings, ns
  else
    FunctionInvocation.build expression, bindings, ns
  end
end
maybe_cons(a, b) click to toggle source
# File lib/nydp/compiler.rb, line 34
def self.maybe_cons a, b
  (a == nil) ? b : cons(a, b)
end