为什么lisp中的mapcar使用名称而不是函数?

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

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

但这不是:

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

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

回答

是否有理由在 lisp 中决定 mapcar 的第一个参数不能是函数本身,而必须是它的名称?这样做的目的是什么?

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

写作+意味着变量。它由read eval 打印循环使用。的值+是最后被评估的形式, 的值++是 的前一个值+, 的值+++是 的前一个值++

要告诉 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 检索符号的全局函数值+

第四,我们也可以让函数对象成为源代码的一部分。


回答

#'+ 一个函数。Common Lisp 就是所谓的“lisp 2”,这意味着它有两个命名空间:在计算复合形式时,例如(+ a b),函数位置在函数命名空间中查找,而其他位置在值命名空间中查找。这意味着,例如(append list list),不会创建两个元素是list函数的列表:它创建一个列表,其两个元素是list碰巧绑定到的值。

但有时您需要在值位置获取名称的函数值:例如在mapcar. 为此,有一个特殊的运算符,function:(mapcar (function +) x y)将两个列表的元素相加。像quotefunction有一个读取宏,即#'.

(为了让它更有趣,mapcar实际上需要一个函数指示符, 以便您可以使用函数的 nsme:(mapcar '+ x y)会起作用,尽管它有点可怕。)


以上是为什么lisp中的mapcar使用名称而不是函数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>