2

Lisp 的 APPLY 用于调用存储在列表中的计算参数的函数。(根据 Rainer 的评论修改)

例如,以下代码将 (list 1 2 3) 更改为 (+ 1 2 3)。

(应用#'+'(1 2 3)) 

然而,Python 的 apply 和 Lisp 的 funcall 一样,除了一些细微的差别(输入以元组/列表的形式给出)

(defun add (xy) (+ xy))
(funcall #'add 1 2)
或者
(funcall #'(lambda (xy) (+ xy)) 10 2)
应用(λx,y:x+y,[1,2])

你怎么看?Lisp 的 funcall 和 Python 的 apply 有更多的区别吗?

4

5 回答 5

8

Python 选择名称 apply 而不是 funcall 有什么原因吗?

因为它是 Python,而不是 LISP。无需同名,funcall是 LISP 命令,apply在 Python 中有所不同。

apply在 Python 中已弃用,请使用扩展调用语法。

旧语法:

apply(foo, args, kwargs)

新语法:

foo(*args, **kwargs)
于 2010-10-04T16:05:33.080 回答
4

在 Common Lisp(funcall #'fun 1 (list 2 3 4))中与 完全相同(fun 1 (list 2 3 4)),而(apply #'fun 1 (list 2 3 4))根据有趣程度的不同,意味着不同的东西。

* (defun bleargh (a &rest b) (cons a b))

BLEARGH
* (funcall #'bleargh 1 (list 1 2 3))

(1 (1 2 3))
* (apply  #'bleargh 1 (list 1 2 3))

(1 1 2 3)

因此,FUNCALL 和 APPLY 做了非常不同的事情。

于 2010-10-05T08:55:30.883 回答
2

只是一个说明

2.3 版后已弃用:使用扩展调用语法*args**keywords代替。

在 py3k 中删除。

于 2010-10-04T16:05:03.847 回答
2

我不明白你为什么声称 Lispapply()会做任何与 Python 不同的事情。这两个函数都接受一个函数和一个列表,然后以列表元素作为参数调用该函数。((+ 1 2 3) 一个+带有 arguments的调用12并且3,不是吗?) 对我来说,看起来两个applys 都做同样的事情。

funcall另一方面,讲述一个函数和几个单独的参数(不是包含参数的列表)并将函数应用于这些参数。

于 2010-10-04T16:20:17.660 回答
1

Lisp 和 Python 的 apply 函数做同样的事情——给定一个函数 f 和一个参数列表 p,将 f 应用到 p。唯一的区别是 Python 的 apply 也接受关键字参数的字典。在 Lisp 中,这些将作为:keyword参数包含在参数列表中。

于 2010-10-07T04:38:50.610 回答