与clojure宏有困难
我试图编写一个宏,我可以用它来调用一个新线程的函数,并在运行它之后打印该函数的名称以及线程的名称。
到目前为止,我拥有的是:
(defmacro start-threads [f]
'(let [t (Thread. 'f)]
(prn (str "running " 'f " on: " (.getName t)))))
当我运行时:
(start-threads funcname)
输出:“运行:线程-47”。 我希望它输出:“运行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)))))
链接地址: http://www.djcxy.com/p/65759.html