2012-03-05 51 views
1

正如你們中的一些人知道我正在Clojure中實施Shen。 由於Shen有一個雙重命名空間,並且所有符號都是自己評估的,所以我需要一個Clojure宏,它將符號綁定到自身,並將該值綁定到後綴符號。Clojure:^:在宏中動態?

現在還必須綁定像*language*這樣的符號。但是,當我使用下面的宏與*language*作爲參數,我得到Warning: *language* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *language* or change the name.

(defmacro set [x y] 
    `(let [y# ~y] 
    (def ^:dynamic ~x '~x) 
    (intern *ns* (symbol (str (name ~x) "__varPoF__"))) 
    (def ^:dynamic ~(symbol (str (name x) "__varPoF__")) y#) 
    y#)) 

有人能告訴我這是爲什麼不工作?

回答

3

此處使用閱讀器宏是錯誤的。你必須使用with-meta。我也不確定你爲什麼需要撥打intern

(defmacro set 
    [x y] 
    (let [dynamic {:dynamic true}] 
    `(let [y# ~y] 
     (def ~(vary-meta x merge dynamic) '~x) 
     (def ~(vary-meta (symbol (str (name x) "__varPoF__")) merge dynamic) y#) 
     y#))) 

無恥自我推銷:with-meta and the reader

+0

謝謝! – 2012-03-05 15:01:51

1

由於Clojure < 1.3中的約定,您收到的是WARNING,其中變量名稱爲「earmuffs」的變量,即具有前導和尾隨起點,可動態重新綁定。

由於Clojure 1.3這不再是這種情況,讀者會將此警告引發給您,告誡您事情可能不像您期望的那樣。它不應該破壞你的代碼,因爲WARNING s不是錯誤。

+0

這裏的問題是,我想爲Shen創建一個REPL,並且WARNINGS不應該彈出,因爲它們與Shen沒有任何關係。是否有可能抑制警告,因爲有在Java中? – 2012-03-05 10:37:13

+0

我想重新綁定'* err *'應該修復它 – skuro 2012-03-05 11:58:15

+0

綁定'* err *'和'* out *'「都不會隱藏警告...... – 2012-03-05 12:17:03