Lisp's apply and funcall vs Python's apply


Question

Lisp's APPLY is for calling functions with computed argument stored in lists.(Modified from Rainer's comment)

For example, the following code changes (list 1 2 3) to (+ 1 2 3).

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

However, Python's apply does what Lisp's funcall does, except for some minor differences (input is given as tuple/list)

(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])

What do you think? Are there more differences between Lisp's funcall and Python's apply?

1
2
8/28/2013 6:21:53 PM

Accepted Answer

Is there any reason why Python chose the name apply not funcall?

Because it's Python, not LISP. No need to have the same name, funcall is a LISP command and apply is something different in Python.

apply is deprecated in Python, use the extended call syntax.

Old syntax:

apply(foo, args, kwargs)

New syntax:

foo(*args, **kwargs)
8
10/4/2010 4:11:10 PM

In Common Lisp (funcall #'fun 1 (list 2 3 4)) is exactly the same as (fun 1 (list 2 3 4)), whereas (apply #'fun 1 (list 2 3 4)) would mean different things depending on the arity of fun.

* (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)

So FUNCALL and APPLY do very different things, as it were.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon