我们这里需要括号来调用匿名函数
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.