我正在尝试编写一个宏,我可以使用它来调用新线程上的函数,并在运行它之后打印函数的名称以及线程的名称。
到目前为止我所拥有的是:
(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中的宏是如何工作的,所以我主要想知道好奇心。
答案 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)))))