关于clojure中地图的第一个奇怪的事情是在以下片段中:
(apply map list '((1 a) (2 b) (3 c)))
Run Code Online (Sandbox Code Playgroud)
结果令我惊讶:
((1 2 3) (a b c))
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释它的工作原理
sep*_*p2k 23
(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)).