Lisp's apply и funcall против Python - PullRequest
       4

Lisp's apply и funcall против Python

2 голосов
/ 04 октября 2010

Lisp APPLY предназначен для вызова функций с вычисленным аргументом, хранящимся в списках. (Изменено из комментария Райнера)

Например, следующий код меняется (список 1 2 3) на (+ 1 2 3).

(apply #'+ '(1 2 3)) 

Однако Python применяет то, что делает funcall Лиспа, за исключением некоторых незначительных различий (ввод задается как кортеж / список)

(defun add (x y) (+ x y))
(funcall #'add 1 2) 
or
(funcall #'(lambda (x y) (+ x y)) 10 2)
apply(lambda x,y : x+y, [1,2])

Что вы думаете?Есть ли еще различия между funcall Lisp и Python?

Ответы [ 5 ]

8 голосов
/ 04 октября 2010

Есть ли причина, по которой Python выбрал название apply, не funcall?

Потому что это Python, а не LISP. Не нужно иметь одно и то же имя, funcall - это команда LISP, а apply - это нечто другое в Python.

apply устарело в Python, используйте расширенный синтаксис вызова.

Старый синтаксис:

apply(foo, args, kwargs)

Новый синтаксис:

foo(*args, **kwargs)
4 голосов
/ 05 октября 2010

В 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 делают совершенно разные вещи.

2 голосов
/ 04 октября 2010

Я не понимаю, почему вы утверждаете, что Lisp apply() сделает что-то отличное от Python.Обе функции принимают функцию и список, а затем вызывают функцию с элементами списка в качестве аргументов.((+ 1 2 3) - это вызов + с аргументами 1, 2 и 3, не так ли?) Мне кажется, что оба apply s делают точното же самое.

funcall с другой стороны рассказывает о функции и нескольких отдельных аргументах (не в списке, содержащем аргументы) и применяет функцию к этим аргументам.

2 голосов
/ 04 октября 2010

Просто примечание :

устарело с версии 2.3 : используйте расширенный синтаксис вызова вместо *args и **keywords.

удалено в py3k.

1 голос
/ 07 октября 2010

Функция применения и в Lisp, и в Python делает одно и то же - учитывая функцию f и список параметров p, применяют f к p. Единственное отличие состоит в том, что Python's apply также принимает словарь для аргументов ключевых слов. В Лиспе они будут включены в список параметров как :keyword аргументы.

...