遇到clojure宏的麻烦

时间:2014-01-15 23:22:04

标签: macros clojure

我正在尝试编写一个宏,我可以使用它来调用新线程上的函数,并在运行它之后打印函数的名称以及线程的名称。

到目前为止我所拥有的是:

     (defmacro start-threads [f]
        '(let [t (Thread. 'f)]
            (prn (str "running " 'f " on: " (.getName t)))))

当我跑的时候:

    (start-threads funcname)

输出:"运行f:Thread-47"。我希望它输出:"运行funcname on:Thread-47。当我尝试取消引用它时,尝试评估该功能。我知道我没有在这里开始运行。但是我应该能够在之后添加它。我确定宏在这里不是完全必要的,因为我刚刚开始关注clojure中的宏是如何工作的,所以我主要想知道好奇心。

1 个答案:

答案 0 :(得分:6)

基本上,你想要的是语法引用而不是普通引用。

(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)))))