lispcommon-lispfuncall

Why do we need funcall in Lisp?


Why do we have to use funcall to call higher order functions in Common Lisp? For example, why do we have to use:

(defun foo (test-func args)
  (funcall test-func args))

instead of the simpler:

(defun bar (test-func args)
  (test-func args))

Coming from a procedural background, I'm a bit surprised by that since the languages I'm more used to (e.g. Python, C#) don't need the distinction. In particular, on the source level at least, the C# compiler transforms it to something like func.invoke().

The only problem I see is that this would mean we couldn't call a global function test-func anymore because it'd be shadowed, but that's hardly a problem.


Solution

  • Strictly speaking, funcall would not be needed, but there are some Lisps (Lisp-2 variants, such as Common Lisp) that separate the variable name space and the function name space. Lisp-1 variants (e.g. Scheme) do not make this distinction.

    More specifically, in your case, test-func is in the variable name space.

    (defun foo (test-func args)
      (funcall test-func args))
    

    Therefore you need a construct that actually searches the function object associated with this variable in the variable name space. In Common Lisp this construct is funcall.

    See also this answer.