2011-12-28 77 views
4

我的問題是接下來,我嘗試使用let將這個瓦爾EVAL列表到一個讓上Clojure的

,如果我做ASIGN值來評估一些增值經銷商列表(def a (list * 'x 'y))(let [x 3 y 3] (eval a))我有一個 CompilerException了java.lang.RuntimeException:無法解析符號:X在這種情況下,編譯:(NO_SOURCE_PATH:6)

,但如果我跑 (def x 4) (def y 4)(eval a)我有一個16,無論如何,如果我再次運行(let [x 3 y 3] (eval a))再次我有16 ,

是否存在一種方法來正確綁定x和y並對列表進行評估?

ty!

回答

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)) 
5

let定義了不能從eval函數的主體訪問的詞法範圍的綁定。這與其他功能沒有區別。但是,使用def創建的綁定是可訪問的,因爲它們是全局命名空間。所有函數都可以訪問命名空間全局變量,只要它們是公共的。

3
(def ^:dynamic x 4) (def ^:dynamic y 4) 
user=> (binding [x 3 y 3] (eval a)) 
9 
user=> (eval a) 
16