Special Operator | Package: excl | ToC | DocOverview | CGDoc | RelNotes | FAQ | Index | PermutedIndex
| Allegro CL version 9.0 Unrevised from 8.2 to 9.0. 8.2 version

## named-function

Arguments: name lambda-expression

This special operator extension operates approximately as though it were defined by this macro:

     (defmacro excl:named-function (name function) (declare (ignore name))
         `(function ,function))

except that when the form is compiled or executed the resultant function is given the specified name. The name has no semantic effect, but may be helpful when encountered in the debugger or in profiler output. Also, if an appropriate function spec handler has been defined, the function name (or its closure template) can be accessed by name for tracing, disassembly, etc. For more info about function specs, see Function specs (fspecs) in implementation.htm.

There is an alternate macro definition for named-function which will be used automatically by macroexpand-1 for the benefit of portable code walkers.

     cl-user(1): (defun make-counter-function (&optional (initial 0))
    	       (let ((cons (list initial)))
    		 (named-function counter-function
    		   (lambda () (incf (car cons))))))
     make-counter-function
     cl-user(2): (make-counter-function)
     #<Interpreted Closure counter-function @ #x10022764a2>
     cl-user(3): (funcall *)
     1
     cl-user(4): (funcall **)
     2
     cl-user(5):

When compiling a named-function form, the compiler treats the form just like a function form, except that the name is used if possible in the resulting function. This is especially useful for closures of a particular kind, as in the following example:

    user(1): (defun get-one-arg-frobber (ix)
                (named-function frobber
                  (lambda (arg) (frob-by-index ix arg))))
    get-one-arg-frobber
    user(2): (compile *)
    Warning: While compiling these undefined
    functions were referenced: frob-by-index.
    get-one-arg-frobber
    nil
    nil
    user(3): (get-one-arg-frobber 10)
    #<Closure frobber @ #x2065dea9>
    user(4):

Note that the name of the closure is taken from the named-function form. Contrast that with the following definition using the more traditional function form:

    user(7): (defun get-one-arg-frobber (ix)
                (function (lambda (arg)
                             (frob-by-index ix arg))))
    get-one-arg-frobber
    user(8): (compile *)
    Warning: While compiling these undefined
    functions were referenced: frob-by-index.
    get-one-arg-frobber
    nil
    nil
    user(9): (get-one-arg-frobber 12)
    #<Closure (:internal get-one-arg-frobber 0) @ #x20664fa1>
    user(10):

See also named-annotated-function.

Copyright (c) 1998-2019, Franz Inc. Oakland, CA., USA. All rights reserved.
This page was not revised from the 8.2 page.
Created 2012.5.30.

|  | ToC | DocOverview | CGDoc | RelNotes | FAQ | Index | PermutedIndex
| Allegro CL version 9.0 Unrevised from 8.2 to 9.0. 8.2 version