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