Странность в функции отображения clojure

первая странная вещь о карте в clojure находится в следующем фрагменте:

(apply map list '((1 a) (2 b) (3 c)))

Результат удивителен для меня:

((1 2 3) (a b c))

Кто-нибудь может объяснить, как это работает?

Ответ 1

(apply f x '(y z)) эквивалентен (f x y z), поэтому ваш код эквивалентен (map list '(1 a) '(2 b) '(3 c)).

При вызове с несколькими списками map повторяет параллельные списки и вызывает данную функцию с одним элементом из каждого списка для каждого элемента (т.е. первый элемент списка результатов является результатом вызова функции с первым элемент каждого списка в качестве аргументов, второй - результат для вторых элементов и т.д.).

Итак, (map list '(1 a) '(2 b) '(3 c)) сначала вызывает list с первыми элементами списков (т.е. числа) в качестве аргументов, а затем со вторыми элементами (буквами). Итак, вы получаете ((list 1 2 3) (list 'a 'b 'c)).