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)); } }