Clojure: разница между списком и функцией, которая возвращает список - PullRequest
4 голосов
/ 07 декабря 2011

Я новичок в Clojure. Я пытаюсь понять, почему вторая форма не работает:

Первая форма:

user=>(def nums(range 3))
(0 1 2)
user=>(map #(list %1) nums)
((0) (1) (2))

Вторая форма:

user=> (map #(list %1) (0 1 2))
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn 
(NO_SOURCE_FILE:0)

Ответы [ 4 ]

11 голосов
/ 07 декабря 2011

Проблема в выражении (0 1 2), которое интерпретируется как 0 применительно к 1 и 2; это невозможно, потому что 0 не является функцией.

(map #(list %1) '(0 1 2))

работает как задумано.

5 голосов
/ 07 декабря 2011

Поскольку (0 1 2) означает вызов функции 0 с аргументами 1 и 2, но 0 не является функцией.Таким образом, вам нужно составить список, а не приложение-функцию, используя цитату или функцию списка, т.е. '(0 1 2) ИЛИ (list 0 1 2)

4 голосов
/ 07 декабря 2011

Ларсман и Анкур имеют его.Я понимаю, что это тривиальный пример, но, вероятно, было бы более идиоматичным использовать вектор, а не список:

(map #(list %1) [0 1 2])

Вы также можете использовать % вместо %1, когда есть только один аргументпередано анонимной функции.

(map #(list %) [0 1 2])
1 голос
/ 08 декабря 2011
user=> (map list (range 3))
((0) (1) (2))
user=> (map list '(0 1 2))
((0) (1) (2))
user=> (map list [0 1 2])
((0) (1) (2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...