4
我對使用clojure宏進行符號捕獲的確切時間有點困惑。假設我有一個從關鍵字定義函數的宏。在這個簡單的例子,使用宏來生成函數(或其他宏)時避免符號捕獲
(defmacro foo [keywd1 keywd2] `(defn ~(symbol (name keywd1))
[~(symbol (name keywd2))] (* 2 ~(symbol (name keywd2)))))
我請(FOO:條:巴茲),並且該被擴展到(DEFN巴[巴茲](* 2巴茲))。
所以現在的問題 - 這可能導致符號捕獲?如果是這樣,在什麼情況下? 我知道它最好使用gensym(例如bar#)來防止符號捕獲,但在某些情況下(不是很多,但仍然)我想要一個漂亮的宏擴展,沒有自動生成的符號。
獎金問題:如果我們正在考慮創建宏的宏,答案會改變嗎?
實際上〜'是不必要的在你的例子中導致符號捕獲。 (defmacro FOO [名稱&體] '(DEFN〜名[巴](的println巴) 〜@體)) 足以引起符號捕獲和它可以根據代碼之前它或之後引起一個運行時錯誤或編譯時錯誤。 – 2010-05-30 21:46:11
Jeremy Wall:您的示例將無法工作,因爲一旦宏展開,bar將變爲名稱空間限定,導致編譯器因爲無法綁定到名稱空間限定符號而陷入困境。 – Brian 2010-05-31 02:11:33