package jscheme;
/** A closure is a user-defined procedure. It is "closed" over the
* environment in which it was created. To apply the procedure, bind
* the parameters to the passed in variables, and evaluate the body.
* @author Peter Norvig, peter@norvig.com http://www.norvig.com
* Copyright 1998 Peter Norvig, see http://www.norvig.com/license.html **/
public class Closure extends Procedure {
Object parms;
Object body;
Environment env;
/** Make a closure from a parameter list, body, and environment. **/
public Closure (Object parms, Object body, Environment env) {
this.parms = parms;
this.env = env;
this.body = (body instanceof Pair && rest(body) == null)
? first(body)
: cons("begin", body);
}
/** Apply a closure to a list of arguments. **/
public Object apply(Scheme interpreter, Object args) {
return interpreter.eval(body, new Environment(parms, args, env));
}
}