函数调用 - >线程宏

4e6*_*4e6 9 clojure

我们这里需要括号来调用匿名函数

user=> (-> [1 2 3 4] (conj 5) (#(map inc %)))
(2 3 4 5 6)
Run Code Online (Sandbox Code Playgroud)

为什么就没有必要加上括号map+,并fmap+在这些例子?

user=> (def map+ #(map inc %))
#'user/map+
user=> (-> [1 2 3 4] (conj 5) map+)
(2 3 4 5 6)

user=> (defn fmap+ [xs] (map inc xs))
#'user/fmap+
(-> [1 2 3 4] (conj 5) fmap+)
(2 3 4 5 6)
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 17

文档->->>,如果他们不是已经列出的第一个参数后的形式被包装成列表宏状态.所以,问题是为什么这不是工作#()(fn ..)形式?原因是两个表单在宏扩展时都是列表形式.

例如

(-> 3 (fn [x] (println x)))
Run Code Online (Sandbox Code Playgroud)

(fn [x] ...)在扩展时获取表单,因此宏认为"很棒,它是一个列表,我只是将3插入(fn ..)列表的第二个位置".调用macroexpansion,这就是我们得到的:

(fn 3 [x] (println x))
Run Code Online (Sandbox Code Playgroud)

这当然不起作用.同样地#():

(-> 3 #(println %))
Run Code Online (Sandbox Code Playgroud)

扩大到

(fn* 3 [p1__6274#] (println p1__6274#))
Run Code Online (Sandbox Code Playgroud)

这就是为什么我们需要额外的parens.