2016-05-04 3 views
0

Я строю функцию для размещения строк внутри векторов.Clojure Anonymous Функции

Я не могу понять, хотя, почему эта работа:

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

, но это не работает:

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

+1

Ответил [здесь] (http://stackoverflow.com/q/13204993) и [здесь] (HTTP: // StackOverflow. ком/кв/4921566). – glts

ответ

1

#() ожидает, что функция станет первым аргументом. Вы могли бы сделать #(vector %)

например:

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

Конечно, вы можете просто сделать:

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

As glts mentioned, анонимную функцию reader macro оборачивает свое тело в списке, например:

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

Обычно для ситуаций, когда y НУ нужно написать анонимную функцию, чье тело является вектором, я бы рекомендовал просто используя fn макрос, как вы сделали в вашем вопросе:

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

В этом случае, однако, ваш (fn [i] [i]) эквивалентно встроенные функции vector, поэтому я предлагаю вам использовать это вместо того, чтобы:

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