[英]Having trouble with clojure macro
我正在嘗試編寫一個宏,我可以使用該宏在新線程上調用函數,並在運行該函數后打印該函數的名稱以及該線程的名稱。
到目前為止,我所擁有的是:
(defmacro start-threads [f]
'(let [t (Thread. 'f)]
(prn (str "running " 'f " on: " (.getName t)))))
當我運行時:
(start-threads funcname)
輸出:“在線程47上運行f”。 並且我希望它輸出:“在funcname上運行:Thread-47。當我嘗試取消引用它時,它會嘗試評估該函數。我知道我沒有在此處的線程上運行.start,但是我應該能夠添加我確定宏在這里不是完全必要的,出於好奇,我剛開始開始思考Clojure中宏的工作原理時,我主要想知道。
基本上,您想要的是語法引用而不是普通引用。
(defmacro start-threads [f]
`(let [t# (Thread. ~f)]
(prn (str "running " '~f " on: " (.getName t#)))))
~f
在語法引號內插的值f
, '~f
引述該值和t#
使自動gensym這樣的變量名不會與周圍的任何名稱沖突。
但是,正如您正確指出的那樣,您實際上不需要宏。 它可以很容易地成為一個函數:
(defn start-threads [f]
(let [t (Thread. f)]
(prn (str "running " f " on: " (.getName t)))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.