我需要帮助包围计划表达式

时间:2016-05-22 00:31:08

标签: scheme lisp racket

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

我无法真正地围绕这个表达。这里发生了什么?

2 个答案:

答案 0 :(得分:7)

您需要了解的第一件事是map的作用。 map接受一个函数和一个或多个列表。 map然后在每个列表的第一个元素上调用该函数,这将成为map返回的列表中的第一个值。 map为每个列表中的第二个元素重复此操作,依此类推,直到其中一个列表用完元素。例如:

(map + '(1 2 3) '(4 5 6)) => (5 7 9)

map首先在每个列表的第一个参数1和4上调用+,得到5作为结果列表中的第一个值。其他值的计算方法相同。

apply通过将函数,一堆值和列表作为最后一个参数来工作。 apply首先将除函数之外的所有参数附加到作为其最后一个参数传入的列表中,以便:

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

变为

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

apply然后调用传递给它的函数,列表的每个元素作为单独的参数,因此上面变为:

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

map将在每个列表的第一个参数上调用list并获取(a 1),这将成为结果列表中的第一个值。其余的列表也会发生同样的事情。

答案 1 :(得分:1)

apply很容易作为代码的纯文本转换来处理,来自

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

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