私は現在、Java で書かれた LISP インタープリターに取り組んでいます。今、私はクロージャーにこだわっています。次のようなクロージャを有効にしたい:
(define a 1000)
(define closure (lambda (a) (lambda (b) (+ a b))))
(define x (closure 10))
(x 20) --> 30
したがって、(x 20)
を返す必要があり30
ます。しかし、私のインタープリターでは 1020 が返されます。間違いは私のラムダクラスにあると思います。次のようになります。
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 で無料で提供することもできます)。