первая странная вещь о карте в 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)).