为什么 lisp 中的 mapcar 取一个名字而不是函数?

Why does mapcar in lisp take a name instead of function?

我正在阅读一本 lisp 书,我正在看 mapcar,我的问题是为什么这是有效的:

> (mapcar #'+ '(1 2) '(3 4))

但这一个不是:

(mapcar + '(1 2) '(3 4))

换句话说,在 lisp 中是否有理由决定 mapcar 的第一个参数不能是函数本身,而必须是它的名字?这有什么用?

#'+ 一个函数。 Common Lisp 就是所谓的 'lisp 2',这意味着它有两个命名空间:在计算复合形式时,如 (+ a b),函数位置在函数命名空间中查找,而其他位置则在查找在值命名空间中。这意味着,例如 (append list list) 不会生成一个列表,其两个元素是 list 函数:它生成一个列表,其两个元素是 list 恰好作为值绑定到的任何内容.

但有时你需要在值位置获取名称的函数值:例如在mapcar的第一个参数中。为此,有一个特殊的运算符,function(mapcar (function +) x y) 添加两个列表的元素。和quote一样,function有个读宏,就是#'.

(为了让它更有趣,mapcar 实际上需要一个函数 designator 所以你 可以 使用一个函数的 nsme功能:(mapcar '+ x y) 会起作用,虽然它有点可怕。)

is there a reason it was decided in lisp that the first argument to mapcar cannot be the function itself, and has to be its name? what purpose does this serve?

只是在像 Common Lisp 这样的东西中,标识符 + 有多种不同的用途。它是一个变量,一个函数,加上其他各种东西。

+表示变量。它由 read eval print loop 使用。 +的值是最后计算的形式,++的值是+的前一个值,+++的值是[的前​​一个值=16=].

要告诉 Common Lisp 你想使用标识符 + 的函数值,必须写成 (function +) 或更短的 #'+.

因此

(mapcar (function +) '(1 2) '(3 4))

或更短

(mapcar #'+ '(1 2) '(3 4))

实际上意味着使用函数 + 和列表 (1 2) 和 (3 4) 调用 mapcar

还有另外两种使用函数的方法+

(mapcar '+ '(1 2) '(3 4))

上面将使 Lisp 检索符号 +.

的全局函数值

第四,我们还可以将函数对象作为源代码的一部分。