简单的线程宏实现

noM*_*MAD 1 clojure

对clojure来说很新,所以可能是一个noob问题,但在这里.所以我读到->宏将按顺序调用函数,我理解它是如何工作的. (-> (+ 1 2) (* 10))结果是30

但为什么这样做不一样呢?

(defn testing-> [a b]
  (list a b)
  first)
Run Code Online (Sandbox Code Playgroud)

这将返回一个函数,first而不是"a" (testing-> "a" "b").我在这里错过了什么?以错误的方式使用它?

Art*_*ldt 5

->需求是在函数体.它不是魔术归结为以 - >结尾的函数,而是字面上的一个宏,其名称是->一系列要做的事情并产生一个新的表达式,其中相同的东西嵌套在下一个内部:

(defn testing [a b]
  (-> [a b]
      list
      first))
Run Code Online (Sandbox Code Playgroud)

在这个例子中,当 - >宏运行时,它产生一个新的表达式,如下所示:

(defn testing [a b]
  (first (list [a b])))
Run Code Online (Sandbox Code Playgroud)

再举一个例子,当你->使用arguemnts 调用(+ 1 2) (* 10)它时会返回表达式(* (+ 1 2) 30),然后将其作为普通的Clojure代码进行计算.

PS:宏是一个函数,它接受Clojure表达式并产生另一个Clojure表达式.这些运行在编译周期的中间,你可以看到他们正在使用该macroexpand-1函数做什么.