Skip to content

Commit

Permalink
init code
Browse files Browse the repository at this point in the history
  • Loading branch information
dongbin committed Apr 18, 2008
1 parent cd091ff commit 8245fbd
Show file tree
Hide file tree
Showing 5 changed files with 2,363 additions and 0 deletions.
70 changes: 70 additions & 0 deletions nodes.rb
@@ -0,0 +1,70 @@


class Program < Treetop::Runtime::SyntaxNode
def eval(env={})
exprs.inject(nil){ |last_env, exp|
exp.eval(env)
}
end

def exprs
[expression] + expressions.exprs
end

end

class Cons < Treetop::Runtime::SyntaxNode
def eval(env)
self
end

end

class CompoundProcedure < Treetop::Runtime::SyntaxNode

def initialize(env, args, body)
@env = env
@args = args.elements.map{ |arg| arg.name}
@body = body
end

def apply(*values)
raise SchemeSyntaxError.new("Parameter doesn't match") unless @args.size == values.size
@body.eval(extend_env(values))
end

def extend_env(values)
@env.merge([@args, values].transpose.
map{ |key, value| { key => value}}.
inject{|sum, value| sum.merge(value)})
end
end


class RubyProcedure < Treetop::Runtime::SyntaxNode

def initialize(env, args, body)
@env = env
@args = args.elements.map{ |arg| arg.name}
@body = body
end

def apply(*values)
raise SchemeSyntaxError.new("Parameter doesn't match") unless @args.size == values.size
@body.call(*values)
end

def add(x, y)
x + y
end


def extend_env(values)
@env.merge([@args, values].transpose.map{ |key, value| { key => value}}.
inject{|sum, value| sum.merge(value)})
end
end


class SchemeSyntaxError < Exception
end

0 comments on commit 8245fbd

Please sign in to comment.