Do any lisps have a s-expression as their head, e.g. ((f 2) 3 4)? If not, why?

前端 未结 3 1893
失恋的感觉
失恋的感觉 2021-01-12 11:24

Do any lisps support nested s-expression on their head? For example

((f 2) 3 4)

for which (f 2) presumably evaluates to a fun

相关标签:
3条回答
  • 2021-01-12 11:36

    Lisp-1 lisps, such as Scheme, usually have all expressions of a function form evaluated, even the function itself.

    Lisp-2 lisps, such as Common Lisp, usually have different behaviour for the function and for the arguments. Whereas the arguments are evaluated, the function is looked up. The common way to invoke an evaluated function is to use funcall or apply.

    (funcall (f 2) 3 4)
    

    In Common Lisp, you can use a lambda form, if you insist on evaluating something to a function in the operator:

    ((lambda (&rest args) (apply (f 2) args)) 3 4)
    
    0 讨论(0)
  • 2021-01-12 11:45

    For example in Common Lisp above is not valid. The syntax of Common Lisp does not generally allow lists as the head of a function call. You have to use FUNCALL to call a returned function value.

    (funcall (f 2) 3 4)
    

    In some other Lisp dialects it is allowed. Scheme is such a Lisp dialect. Scheme also evaluates the head of a function call expression.

    0 讨论(0)
  • 2021-01-12 11:48

    In those Lisps, which have single namespace for variables and functions, your expression is valid. These are called Lisp-1. Scheme and Clojure are examples of such Lisps.

    In those Lisps, which have separate namespaces for variables and functions, your expression would be (funcall (f 2) 3 4). These are called Lisp-2. Common Lisp and Emacs Lisp are examples of such Lisps.

    In Lisp-2 every symbol has a value slot and a function slot. To call a function, that is stored in a value slot you need to use funcall keyword.

    See more on this issue: http://www.dreamsongs.com/Separation.html

    Edit: Thanks to Rainer Joswig i corrected the answer.

    0 讨论(0)
提交回复
热议问题