Clojure匿名函数

时间:2016-05-04 21:56:57

标签: clojure anonymous-function

我正在构建一个将字符串放在向量中的函数。

我无法弄清楚,为什么会这样做:

(mapv (fn [i] [i]) '("hi" "there"))

但这不起作用:

(mapv #([%]) '("hi" "there"))

3 个答案:

答案 0 :(得分:2)

请参阅:https://clojuredocs.org/clojure.core/fn#example-560054c2e4b08e404b6c1c80

简而言之:#(f) == (fn [] (f)),因此#([1 2 3]) == (fn [] ([1 2 3]))

希望它有所帮助。

答案 1 :(得分:2)

As glts mentioned,匿名函数reader macro将其正文包装在列表中,如下所示:

(read-string "#([%])")
;=> (fn* [p1__20620#] ([p1__20620#]))

通常情况下,如果您需要编写一个主体为矢量的匿名函数,我建议您在问题中使用fn宏:

(mapv (fn [i] [i]) '("hi" "there"))
;=> [["hi"] ["there"]]

在这种情况下,您的(fn [i] [i])等同于内置的vector功能,因此我建议您改用它:

(mapv vector '("hi" "there"))
;=> [["hi"] ["there"]]

答案 2 :(得分:1)

#()期望函数作为其第一个参数。你可以做#(vector %)

e.g:

(map #(vector %) (range 5))
> ([0] [1] [2] [3] [4])

当然你也可以这样做:

(map vector (range 5))
> ([0] [1] [2] [3] [4])