我目前正在研究用 Java 编写的 LISP 解释器。现在我坚持关闭。我想启用这样的闭包:
(define a 1000)
(define closure (lambda (a) (lambda (b) (+ a b))))
(define x (closure 10))
(x 20) --> 30
所以,(x 20)
应该返回30
。但是,你猜怎么着,它在我的解释器中返回 1020。我认为错误出在我的 lambda 类中。它看起来像这样:
public class LLambda extends LOperation {
private LList parameters;
private LList definitions;
public LLambda(LList parameters, LList definitions) {
this.parameters = parameters;
this.definitions = definitions;
}
public LObject eval(Environment environment, LObject tokens) {
environment = environment.copy();
for(int i = 0; i < parameters.size(); i++) {
LSymbol key = LSymbol.create(parameters.get(i));
LObject object = ((LList) tokens).get(i);
object = object.eval(environment, tokens);
environment.put(key, object);
}
return definitions.eval(environment, tokens);
}
}
此类工作正常,但它不存储环境值以启用闭包。有人知道怎么做吗?在哪里做呢?在构造函数中还是在 eval 方法中?
而且,如果我不执行此操作:
environment = environment.copy();
闭包有效,但它破坏了其他一些测试。
谢谢。
(我也可以上传整个源代码或在 GIT 中免费提供)。