簡體   English   中英

Clojure宏遇到問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM