22 lines
521 B
CoffeeScript
22 lines
521 B
CoffeeScript
lispeval = require './eval'
|
|
|
|
class Proc
|
|
constructor: (@scope, @params, @body) ->
|
|
apply: (cells, scope) ->
|
|
args = (cells.map (i) -> lispeval(i, scope))
|
|
if @body instanceof Function
|
|
@body.apply(this, args)
|
|
else
|
|
inner = @scope.fork()
|
|
@params.forEach((name, i) -> inner.set(name, args[i]))
|
|
@body.map((e) -> lispeval(e, inner)).pop()
|
|
|
|
class Syntax extends Proc
|
|
apply: (cells, scope) ->
|
|
return @body(cells, scope)
|
|
|
|
|
|
module.exports =
|
|
Proc: Proc
|
|
Syntax: Syntax
|