我们这里需要括号来调用匿名函数
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) 如果您阅读问题宏 - >使用匿名函数,您将看到->宏与匿名函数不兼容.要正确使用宏,您需要了解实现.从这个意义上说,宏是"漏洞" - API没有完全隐藏实现.
(足够复杂的)Clojure宏是否会泄漏?
[为了比较:C预处理器出现了类似的问题,当粗略地处理宏参数时,可以看到奇怪的副作用.在这种情况下,可以通过将宏参数括在括号中(宏内部)来解决问题.这并没有解决使用具有可变状态的C宏的问题(即每次使用参数都会改变状态),但也许我们可以忽略函数式语言的问题,或者let用来避免多次评估.
如果我在线程宏中使用匿名函数之前定义了它:
(def even #(map even? %))
(-> [1 2 3] even)
Run Code Online (Sandbox Code Playgroud)
我得到正确的结果:
(false true false)
Run Code Online (Sandbox Code Playgroud)
但是,如果我评估以下代码:
(-> [1 2 3] #(map even? %))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
clojure.lang.Compiler$CompilerException: java.lang.IllegalArgumentException: fn params must be Symbols
Run Code Online (Sandbox Code Playgroud)
为什么我不能在线程宏中使用匿名函数?