对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")
.我在这里错过了什么?以错误的方式使用它?
该->
需求是在函数体.它不是魔术归结为以 - >结尾的函数,而是字面上的一个宏,其名称是->
一系列要做的事情并产生一个新的表达式,其中相同的东西嵌套在下一个内部:
(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
函数做什么.