与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

上一篇: Having trouble with clojure macro

下一篇: Clojure Dynamic Binding