4

私の問題は次のとおりです。この変数に値を割り当てるために let を使用して、いくつかの変数を持つリストを評価しようとします

もしそう(def a (list * 'x 'y))(let [x 3 y 3] (eval a))、CompilerException java.lang.RuntimeException: Unable to resolve symbol: x in this context, compiling:(NO_SOURCE_PATH:6) がある場合

しかし、走っ て16なら(def x 4) (def y 4)、もう一度(eval a)走れば16です。(let [x 3 y 3] (eval a))

x と y を正しくバインドし、リストを評価する方法はありますか?

ティ!

4

3 に答える 3

5

leteval 関数の本体からアクセスできない字句スコープのバインディングを定義します。これは他の機能と変わりません。ただし、 で作成されたバインディングdefは名前空間グローバルであるため、アクセス可能です。public である限り、すべての関数は名前空間グローバル変数にアクセスできます。

于 2011-12-29T00:08:59.687 に答える
3
(def ^:dynamic x 4) (def ^:dynamic y 4)
user=> (binding [x 3 y 3] (eval a))
9
user=> (eval a)
16
于 2011-12-29T01:00:02.033 に答える
2

まあ、次evallet表現もできます。

(eval '(let [x 3 y 3] (* x y)))

編集 :

コメントによると、これはあなたの場合にうまくいきます:

(def a (list (list * 'x 'y)))
(eval (concat '(let [x 3 y 3]) a))

さらに良いことに、quasiquoting を使用します。

(def a (list * 'x 'y))
(eval `(let ~'[x 3 y 3] ~a))
于 2011-12-28T23:52:45.937 に答える