lib/nydp/compiler.rb in nydp-0.5.1 vs lib/nydp/compiler.rb in nydp-0.6.0
- old
+ new
@@ -1,55 +1,65 @@
require 'nydp/cond'
+require 'nydp/loop'
require 'nydp/function_invocation'
require 'nydp/interpreted_function'
require 'nydp/literal'
module Nydp
class Compiler
extend Helper
- def self.compile expression, bindings
- compile_expr expression, bindings
+ def self.compile expression, bindings, ns
+ compile_expr expression, bindings, ns
rescue StandardError => e
- raise Nydp::Error.new "failed to compile expression:\n#{expression.inspect}"
+ raise Nydp::Error.new "failed to compile expression:\n#{expression._nydp_inspect}\n#{e.message}"
end
- def self.compile_expr expression, bindings
- if expression.is_a? Nydp::Symbol
- SymbolLookup.build expression, bindings
+ 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
+ Literal.build expression, bindings, ns
elsif expression.is_a? Nydp::Pair
- compile_pair expression, bindings
+ 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
def self.maybe_cons a, b
- Nydp::NIL.is?(a) ? b : cons(a, b)
+ (a == nil) ? b : cons(a, b)
end
- def self.compile_each expr, bindings
- if Nydp::NIL.is?(expr)
+ def self.compile_each expr, bindings, ns
+ if expr == nil
expr
elsif pair?(expr)
- maybe_cons compile(expr.car, bindings), compile_each(expr.cdr, bindings)
+ maybe_cons compile(expr.car, bindings, ns), compile_each(expr.cdr, bindings, ns)
else
- compile(expr, bindings)
+ compile(expr, bindings, ns)
end
end
- def self.compile_pair expression, bindings
+ def self.compile_pair expression, bindings, ns
key = expression.car
if sym?(key, :cond)
- Cond.build expression.cdr, bindings # todo: replace with function? (cond x (fn () iftrue) (fn () iffalse)) -->> performance issues, creating two closures for every cond invocation
+ 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
+ Literal.build expression.cadr, bindings, ns
elsif sym?(key, :assign)
- Assignment.build expression.cdr, bindings
+ Assignment.build expression.cdr, bindings, ns
elsif sym?(key, :fn)
- InterpretedFunction.build expression.cadr, expression.cddr, bindings
+ InterpretedFunction.build expression.cadr, expression.cddr, bindings, ns
else
- FunctionInvocation.build expression, bindings
+ FunctionInvocation.build expression, bindings, ns
end
end
end
end