#

## 3.1.2.1.2.3 Function Forms

If the operator is a symbol naming a function, the form represents a function form, and the cdr of the list contains the forms which when evaluated will supply the arguments passed to the function.

When a function name is not defined, an error of type undefined-function should be signaled at run time; see Section 3.2.2.3 (Semantic Constraints).

A function form is evaluated as follows:

The subforms in the cdr of the original form are evaluated in left-to-right order in the current lexical and dynamic environments. The primary value of each such evaluation becomes an argument to the named function; any additional values returned by the subforms are discarded.

The functional value of the operator is retrieved from the lexical environment, and that function is invoked with the indicated arguments.

Although the order of evaluation of the argument subforms themselves is strictly left-to-right, it is not specified whether the definition of the operator in a function form is looked up before the evaluation of the argument subforms, after the evaluation of the argument subforms, or between the evaluation of any two argument subforms if there is more than one such argument subform. For example, the following might return 23 or 24.

     (defun foo (x) (+ x 3))
     (defun bar () (setf (symbol-function 'foo) #'(lambda (x) (+ x 4))))
     (foo (progn (bar) 20))

A binding for a function name can be established in one of several ways. A binding for a function name in the global environment can be established by defun, setf of fdefinition, setf of symbol-function, ensure-generic-function, defmethod (implicitly, due to ensure-generic-function), or defgeneric. A binding for a function name in the lexical environment can be established by flet or labels.

The next figure lists some defined names that are applicable to functions.

    apply                 fdefinition  mapcan
    call-arguments-limit  flet         mapcar
    complement            fmakunbound  mapcon
    constantly            funcall      mapl
    defgeneric            function     maplist
    defmethod             functionp    multiple-value-call
    defun                 labels       reduce
    fboundp               map          symbol-function

Figure 3-4. Some function-related defined names

The following X3J13 cleanup issues, not part of the specification, apply to this section:

- GENERIC-FLET-POORLY-DESIGNED:DELETE
- WITH-ADDED-METHODS:DELETE
- FUNCTION-CALL-EVALUATION-ORDER:MORE-UNSPECIFIED

Copyright 1996-2005, LispWorks Ltd. All rights reserved.