在Clojure中,變量範圍+ EVAL Clojure中
(def x 3)
(eval '(prn x))
打印3,而
(let [y 3]
(eval '(prn y)))
和
(binding [z 3] (eval '(prn z)))
產生 '無法解析變種' 異常。
根據http://clojure.org/evaluation,eval
,load-string
等生成臨時名稱空間來評估其內容。因此,我預計上述代碼示例都不能工作,因爲(def x 3)
是在我當前的命名空間中完成的,而不是由eval
創建的。
- 爲什麼第一個代碼示例工作,而不是最後兩個?
- 我怎樣才能
eval
綁定變量不使用def
?
謝謝!
請注意,這在Clojure 1.3中不起作用。你必須使用'(declare ^:dynamic x)'。 – danlei 2011-06-03 00:44:33
謝謝!我現在明白我的問題了 - 我假設「null詞法作用域」在「空名稱空間」中也有意義,但快速測試顯示「eval」在當前名稱空間內工作,這就是爲什麼它可以訪問名稱空間變量但不能詞彙變量。 非常好的答案,你的鏈接也很有幫助! – gilesc 2011-06-03 17:10:14
不客氣!我很高興它有幫助。另外,感謝接受。 – danlei 2011-06-03 17:53:34