Lisp( GitHubのコード)を書いていますが、ローカルバインディングを実装したいと思います。現在、2つの構文があります。
(let <var> <val> <expr>)
単一の変数または関数をバインドするため、および
(with (<var1> <val1> ... <varN> <valN>) <expr>)
一度に複数の値をバインドします。
現在、バインディングは順番に評価され、新しい関数バインディングはそれぞれ、定義された環境のコピーを保持しているため、<var2>
参照することはできますが<var1>
、その逆はできません。
複数の値を一度にバインドするときに、効果的に同時にバインドできるようにコードを変更したいと思います。たとえば、次のように記述できるようにしたいと思います(これは簡単な例ですが、アイデアを説明する必要があります)。
(define (h y)
(with ((f x) (if (eq? x 0) #t (g (- x 1)))
(g x) (if (eq? x 0) #f (f (- x 1))))
(f y))
現時点では、このコードは実行されません-g
終了しますがf
、その逆はありません。
Lispで同時バインディングを実装する標準的な方法はありますか?