我正在构建一个将字符串放在向量中的函数。
我无法弄清楚,为什么会这样做:
(mapv (fn [i] [i]) '("hi" "there"))
但这不起作用:
(mapv #([%]) '("hi" "there"))
答案 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])