annotate man/lispref/functions.texi @ 1318:b531bf8658e9

[xemacs-hg @ 2003-02-21 06:56:46 by ben] redisplay fixes et al. PROBLEMS: Add comment about Cygwin, unexec and sysmalloc. Move some non-general stuff out of general. Make a section for x86. configure.in: Add check for broken alloca in funcalls. mule/mule-cmds.el: Alias file-name to native not vice-versa. Do set EOL of native but not of process output to fix various problems and be consistent with code-init.el. code-cmds.el: Return a name not a coding system. code-init.el: Reindent. Remove `file-name' since it should always be the same as native. unicode.el: Rename to load-unicode-mapping-table as suggested by the anonymous (but rather Turnbullian) comment in unicode.c. xemacs.dsp: Add /k to default build. alloc.c: Make gc_currently_forbidden static. config.h.in, lisp.h: Move some stuff to lisp.h. console-gtk.h, console-impl.h, console-msw.h, console-x.h, event-Xt.c, event-msw.c, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-x.c, gtk-xemacs.c: Remove duplicated code to redraw exposed area. Add deadbox method needed by the generalized redraw code. Defer redrawing if already in redisplay. frame-msw.c, event-stream.c, frame.c: Add comments about calling Lisp. debug.c, general-slots.h: Move generalish symbols to general-slots.h. doprnt.c: reindent. lisp.h, dynarr.c: Add debug code for locking a dynarr to catch invalid mods. Use in redisplay.c. eval.c: file-coding.c: Define file-name as alias for native not vice-versa. frame-gtk.c, frame-x.c: Move Qwindow_id to general-slots. dialog-msw.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, gui.c, gui.h, menubar-msw.c, menubar.c: Ensure that various glyph functions that eval within redisplay protect the evals. Same for calls to internal_equal(). Modify various functions, e.g. gui_item_*(), to protect evals within redisplay, taking an in_redisplay parameter if it's possible for them to be called both inside and outside of redisplay. gutter.c: Defer specifier-changed updating till after redisplay, if necessary, since we need to enter redisplay to do it. gutter.c: Do nothing if in redisplay. lisp.h: Add version of alloca() for use in function calls. lisp.h: Add XCAD[D+]R up to 6 D's, and aliases X1ST, X2ND, etc. frame.c, frame.h, redisplay.c, redisplay.h, signal.c, toolbar.c: Redo critical-section code and move from frame.c to redisplay.c. Require that every place inside of redisplay catch errors itself, not at the edge of the critical section (thereby bypassing the rest of redisplay and leaving things in an inconsistent state). Introduce separate means of holding frame-size changes without entering a complete critical section. Introduce "post-redisplay" methods for deferring things till after redisplay. Abort if we enter redisplay reentrantly. Disable all quit checking in redisplay since it's too dangerous. Ensure that all calls to QUIT trigger an abort if unprotected. redisplay.c, scrollbar-gtk.c, scrollbar-x.c, scrollbar.c: Create enter/exit_redisplay_critical_section_maybe() for code that needs to ensure it's in a critical section but doesn't interfere with an existing critical section. sysdep.c: Use _wexecve() when under Windows NT for Unicode correctness. text.c, text.h: Add new_dfc() functions, which return an alloca()ed value rather than requiring an lvalue. (Not really used yet; used in another workspace, to come.) Add some macros for SIZED_EXTERNAL. Update the encoding aliases after involved scrutinization of the X manual. unicode.c: Answer the anonymous but suspiciously Turnbullian questions. Rename parse-unicode-translation-table to load-unicode-mapping-table, as suggested.
author ben
date Fri, 21 Feb 2003 06:57:21 +0000
parents 576fb035e263
children 6780963faf78
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 @c This is part of the XEmacs Lisp Reference Manual.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 @c See the file lispref.texi for copying conditions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @setfilename ../../info/functions.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 @node Functions, Macros, Variables, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 @chapter Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 A Lisp program is composed mainly of Lisp functions. This chapter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 explains what functions are, how they accept arguments, and how to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 define them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 * What Is a Function:: Lisp functions vs. primitives; terminology.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 * Lambda Expressions:: How functions are expressed as Lisp objects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 * Function Names:: A symbol can serve as the name of a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 * Defining Functions:: Lisp expressions for defining functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 * Calling Functions:: How to use an existing function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 * Mapping Functions:: Applying a function to each element of a list, etc.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
20 * Anonymous Functions:: Lambda expressions are functions with no names.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 * Function Cells:: Accessing or setting the function definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 of a symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 * Inline Functions:: Defining functions that the compiler will open code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 * Related Topics:: Cross-references to specific Lisp primitives
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 that have a special bearing on how functions work.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 @node What Is a Function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 @section What Is a Function?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 In a general sense, a function is a rule for carrying on a computation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 given several values called @dfn{arguments}. The result of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 computation is called the value of the function. The computation can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 also have side effects: lasting changes in the values of variables or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 the contents of data structures.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 Here are important terms for functions in XEmacs Lisp and for other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 function-like objects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 @table @dfn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 @item function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 @cindex function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 In XEmacs Lisp, a @dfn{function} is anything that can be applied to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 arguments in a Lisp program. In some cases, we use it more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 specifically to mean a function written in Lisp. Special forms and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 macros are not functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 @item primitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 @cindex primitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 @cindex subr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 @cindex built-in function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 A @dfn{primitive} is a function callable from Lisp that is written in C,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 such as @code{car} or @code{append}. These functions are also called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 @dfn{built-in} functions or @dfn{subrs}. (Special forms are also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 considered primitives.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Usually the reason that a function is a primitives is because it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 fundamental, because it provides a low-level interface to operating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 system services, or because it needs to run fast. Primitives can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 modified or added only by changing the C sources and recompiling the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 editor. See @ref{Writing Lisp Primitives,,, internals, XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 Internals Manual}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 @item lambda expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 A @dfn{lambda expression} is a function written in Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 These are described in the following section.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 @xref{Lambda Expressions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 @item special form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 A @dfn{special form} is a primitive that is like a function but does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 evaluate all of its arguments in the usual way. It may evaluate only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 some of the arguments, or may evaluate them in an unusual order, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 several times. Many special forms are described in @ref{Control
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 Structures}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 @item macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 @cindex macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 A @dfn{macro} is a construct defined in Lisp by the programmer. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 differs from a function in that it translates a Lisp expression that you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 write into an equivalent expression to be evaluated instead of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 original expression. Macros enable Lisp programmers to do the sorts of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 things that special forms can do. @xref{Macros}, for how to define and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 use macros.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 @item command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 @cindex command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 A @dfn{command} is an object that @code{command-execute} can invoke; it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 is a possible definition for a key sequence. Some functions are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 commands; a function written in Lisp is a command if it contains an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 interactive declaration (@pxref{Defining Commands}). Such a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 can be called from Lisp expressions like other functions; in this case,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 the fact that the function is a command makes no difference.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 Keyboard macros (strings and vectors) are commands also, even though
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 they are not functions. A symbol is a command if its function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 definition is a command; such symbols can be invoked with @kbd{M-x}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 The symbol is a function as well if the definition is a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 @xref{Command Overview}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 @item keystroke command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 @cindex keystroke command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 A @dfn{keystroke command} is a command that is bound to a key sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 (typically one to three keystrokes). The distinction is made here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 merely to avoid confusion with the meaning of ``command'' in non-Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 editors; for Lisp programs, the distinction is normally unimportant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 @item compiled function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 A @dfn{compiled function} is a function that has been compiled by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 byte compiler. @xref{Compiled-Function Type}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 @defun subrp object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 This function returns @code{t} if @var{object} is a built-in function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 (i.e., a Lisp primitive).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (subrp 'message) ; @r{@code{message} is a symbol,}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 @result{} nil ; @r{not a subr object.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 (subrp (symbol-function 'message))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 @defun compiled-function-p object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 This function returns @code{t} if @var{object} is a compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 function. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (compiled-function-p (symbol-function 'next-line))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 @node Lambda Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 @section Lambda Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 @cindex lambda expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 A function written in Lisp is a list that looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (lambda (@var{arg-variables}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 @r{[}@var{documentation-string}@r{]}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 @r{[}@var{interactive-declaration}@r{]}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 @var{body-forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 Such a list is called a @dfn{lambda expression}. In XEmacs Lisp, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 actually is valid as an expression---it evaluates to itself. In some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 other Lisp dialects, a lambda expression is not a valid expression at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 all. In either case, its main use is not to be evaluated as an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 expression, but to be called as a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 * Lambda Components:: The parts of a lambda expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 * Simple Lambda:: A simple example.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 * Argument List:: Details and special features of argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 * Function Documentation:: How to put documentation in a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 @node Lambda Components
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 @subsection Components of a Lambda Expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 A function written in Lisp (a ``lambda expression'') is a list that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 (lambda (@var{arg-variables}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 [@var{documentation-string}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 [@var{interactive-declaration}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 @var{body-forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 @cindex lambda list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 The first element of a lambda expression is always the symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 @code{lambda}. This indicates that the list represents a function. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 reason functions are defined to start with @code{lambda} is so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 other lists, intended for other uses, will not accidentally be valid as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 The second element is a list of symbols--the argument variable names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 This is called the @dfn{lambda list}. When a Lisp function is called,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 the argument values are matched up against the variables in the lambda
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 list, which are given local bindings with the values provided.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 @xref{Local Variables}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 The documentation string is a Lisp string object placed within the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 function definition to describe the function for the XEmacs help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 facilities. @xref{Function Documentation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 The interactive declaration is a list of the form @code{(interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 @var{code-string})}. This declares how to provide arguments if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 function is used interactively. Functions with this declaration are called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 @dfn{commands}; they can be called using @kbd{M-x} or bound to a key.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 Functions not intended to be called in this way should not have interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 declarations. @xref{Defining Commands}, for how to write an interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 declaration.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 @cindex body of function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 The rest of the elements are the @dfn{body} of the function: the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 code to do the work of the function (or, as a Lisp programmer would say,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 ``a list of Lisp forms to evaluate''). The value returned by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 function is the value returned by the last element of the body.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 @node Simple Lambda
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 @subsection A Simple Lambda-Expression Example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 Consider for example the following function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (lambda (a b c) (+ a b c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 We can call this function by writing it as the @sc{car} of an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 expression, like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 ((lambda (a b c) (+ a b c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 1 2 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 This call evaluates the body of the lambda expression with the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 @code{a} bound to 1, @code{b} bound to 2, and @code{c} bound to 3.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 Evaluation of the body adds these three numbers, producing the result 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 therefore, this call to the function returns the value 6.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 Note that the arguments can be the results of other function calls, as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 this example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 ((lambda (a b c) (+ a b c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 1 (* 2 3) (- 5 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 This evaluates the arguments @code{1}, @code{(* 2 3)}, and @code{(- 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 4)} from left to right. Then it applies the lambda expression to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 argument values 1, 6 and 1 to produce the value 8.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 It is not often useful to write a lambda expression as the @sc{car} of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 a form in this way. You can get the same result, of making local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 variables and giving them values, using the special form @code{let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (@pxref{Local Variables}). And @code{let} is clearer and easier to use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 In practice, lambda expressions are either stored as the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 definitions of symbols, to produce named functions, or passed as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 arguments to other functions (@pxref{Anonymous Functions}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 However, calls to explicit lambda expressions were very useful in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 old days of Lisp, before the special form @code{let} was invented. At
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 that time, they were the only way to bind and initialize local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 @node Argument List
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 @subsection Advanced Features of Argument Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 @kindex wrong-number-of-arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 @cindex argument binding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 @cindex binding arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 Our simple sample function, @code{(lambda (a b c) (+ a b c))},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 specifies three argument variables, so it must be called with three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 arguments: if you try to call it with only two arguments or four
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 arguments, you get a @code{wrong-number-of-arguments} error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 It is often convenient to write a function that allows certain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 arguments to be omitted. For example, the function @code{substring}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 accepts three arguments---a string, the start index and the end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 index---but the third argument defaults to the @var{length} of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 string if you omit it. It is also convenient for certain functions to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 accept an indefinite number of arguments, as the functions @code{list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 and @code{+} do.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 @cindex optional arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 @cindex rest arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 @kindex &optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 @kindex &rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 To specify optional arguments that may be omitted when a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 is called, simply include the keyword @code{&optional} before the optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 arguments. To specify a list of zero or more extra arguments, include the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 keyword @code{&rest} before one final argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 Thus, the complete syntax for an argument list is as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (@var{required-vars}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 @r{[}&optional @var{optional-vars}@dots{}@r{]}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 @r{[}&rest @var{rest-var}@r{]})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 The square brackets indicate that the @code{&optional} and @code{&rest}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 clauses, and the variables that follow them, are optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 A call to the function requires one actual argument for each of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 @var{required-vars}. There may be actual arguments for zero or more of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 the @var{optional-vars}, and there cannot be any actual arguments beyond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 that unless the lambda list uses @code{&rest}. In that case, there may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 be any number of extra actual arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 If actual arguments for the optional and rest variables are omitted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 then they always default to @code{nil}. There is no way for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 function to distinguish between an explicit argument of @code{nil} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 an omitted argument. However, the body of the function is free to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 consider @code{nil} an abbreviation for some other meaningful value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 This is what @code{substring} does; @code{nil} as the third argument to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 @code{substring} means to use the length of the string supplied.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 @cindex CL note---default optional arg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 @quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 @b{Common Lisp note:} Common Lisp allows the function to specify what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 default value to use when an optional argument is omitted; XEmacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 always uses @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 @end quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 For example, an argument list that looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 (a b &optional c d &rest e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 binds @code{a} and @code{b} to the first two actual arguments, which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 required. If one or two more arguments are provided, @code{c} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 @code{d} are bound to them respectively; any arguments after the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 four are collected into a list and @code{e} is bound to that list. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 there are only two arguments, @code{c} is @code{nil}; if two or three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 arguments, @code{d} is @code{nil}; if four arguments or fewer, @code{e}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 is @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 There is no way to have required arguments following optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 ones---it would not make sense. To see why this must be so, suppose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 that @code{c} in the example were optional and @code{d} were required.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 Suppose three actual arguments are given; which variable would the third
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 argument be for? Similarly, it makes no sense to have any more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 arguments (either required or optional) after a @code{&rest} argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 Here are some examples of argument lists and proper calls:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 ((lambda (n) (1+ n)) ; @r{One required:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 1) ; @r{requires exactly one argument.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 @result{} 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 ((lambda (n &optional n1) ; @r{One required and one optional:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (if n1 (+ n n1) (1+ n))) ; @r{1 or 2 arguments.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 1 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 ((lambda (n &rest ns) ; @r{One required and one rest:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 (+ n (apply '+ ns))) ; @r{1 or more arguments.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 1 2 3 4 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 @result{} 15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 @node Function Documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 @subsection Documentation Strings of Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 @cindex documentation of function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 A lambda expression may optionally have a @dfn{documentation string} just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 after the lambda list. This string does not affect execution of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 function; it is a kind of comment, but a systematized comment which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 actually appears inside the Lisp world and can be used by the XEmacs help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 facilities. @xref{Documentation}, for how the @var{documentation-string} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 accessed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 It is a good idea to provide documentation strings for all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 functions in your program, even those that are only called from within
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 your program. Documentation strings are like comments, except that they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 are easier to access.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 The first line of the documentation string should stand on its own,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 because @code{apropos} displays just this first line. It should consist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 of one or two complete sentences that summarize the function's purpose.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 The start of the documentation string is usually indented in the source file,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 but since these spaces come before the starting double-quote, they are not part of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 the string. Some people make a practice of indenting any additional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 lines of the string so that the text lines up in the program source.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 @emph{This is a mistake.} The indentation of the following lines is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 inside the string; what looks nice in the source code will look ugly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 when displayed by the help commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 You may wonder how the documentation string could be optional, since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 there are required components of the function that follow it (the body).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 Since evaluation of a string returns that string, without any side effects,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 it has no effect if it is not the last form in the body. Thus, in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 practice, there is no confusion between the first form of the body and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 documentation string; if the only body form is a string then it serves both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 as the return value and as the documentation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 @node Function Names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 @section Naming a Function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 @cindex function definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 @cindex named function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 @cindex function name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 In most computer languages, every function has a name; the idea of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 function without a name is nonsensical. In Lisp, a function in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 strictest sense has no name. It is simply a list whose first element is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 @code{lambda}, or a primitive subr-object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 However, a symbol can serve as the name of a function. This happens
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 when you put the function in the symbol's @dfn{function cell}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (@pxref{Symbol Components}). Then the symbol itself becomes a valid,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 callable function, equivalent to the list or subr-object that its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 function cell refers to. The contents of the function cell are also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 called the symbol's @dfn{function definition}. The procedure of using a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 symbol's function definition in place of the symbol is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 @dfn{symbol function indirection}; see @ref{Function Indirection}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 In practice, nearly all functions are given names in this way and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 referred to through their names. For example, the symbol @code{car} works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 as a function and does what it does because the primitive subr-object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 @code{#<subr car>} is stored in its function cell.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 We give functions names because it is convenient to refer to them by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 their names in Lisp expressions. For primitive subr-objects such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 @code{#<subr car>}, names are the only way you can refer to them: there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 is no read syntax for such objects. For functions written in Lisp, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 name is more convenient to use in a call than an explicit lambda
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 expression. Also, a function with a name can refer to itself---it can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 be recursive. Writing the function's name in its own definition is much
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 more convenient than making the function definition point to itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (something that is not impossible but that has various disadvantages in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 practice).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 We often identify functions with the symbols used to name them. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 example, we often speak of ``the function @code{car}'', not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 distinguishing between the symbol @code{car} and the primitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 subr-object that is its function definition. For most purposes, there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 is no need to distinguish.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 Even so, keep in mind that a function need not have a unique name. While
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 a given function object @emph{usually} appears in the function cell of only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 one symbol, this is just a matter of convenience. It is easy to store
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 it in several symbols using @code{fset}; then each of the symbols is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 equally well a name for the same function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 A symbol used as a function name may also be used as a variable;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 these two uses of a symbol are independent and do not conflict.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 @node Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 @section Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 @cindex defining a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 We usually give a name to a function when it is first created. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 is called @dfn{defining a function}, and it is done with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 @code{defun} special form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 @defspec defun name argument-list body-forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 @code{defun} is the usual way to define new Lisp functions. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 defines the symbol @var{name} as a function that looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (lambda @var{argument-list} . @var{body-forms})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 @code{defun} stores this lambda expression in the function cell of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 @var{name}. It returns the value @var{name}, but usually we ignore this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 As described previously (@pxref{Lambda Expressions}),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 @var{argument-list} is a list of argument names and may include the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 keywords @code{&optional} and @code{&rest}. Also, the first two forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 in @var{body-forms} may be a documentation string and an interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 declaration.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 There is no conflict if the same symbol @var{name} is also used as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 variable, since the symbol's value cell is independent of the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 cell. @xref{Symbol Components}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 Here are some examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 (defun foo () 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 @result{} foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (defun bar (a &optional b &rest c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (list a b c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 (bar 1 2 3 4 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 @result{} (1 2 (3 4 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 (bar 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 @result{} (1 nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (bar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 @error{} Wrong number of arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (defun capitalize-backwards ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 "Upcase the last letter of a word."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 (backward-word 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 (forward-word 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (backward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (capitalize-word 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 @result{} capitalize-backwards
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 Be careful not to redefine existing functions unintentionally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 @code{defun} redefines even primitive functions such as @code{car}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 without any hesitation or notification. Redefining a function already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 defined is often done deliberately, and there is no way to distinguish
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 deliberate redefinition from unintentional redefinition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 @defun define-function name definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 @defunx defalias name definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 These equivalent special forms define the symbol @var{name} as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 function, with definition @var{definition} (which can be any valid Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 function).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 The proper place to use @code{define-function} or @code{defalias} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 where a specific function name is being defined---especially where that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 name appears explicitly in the source file being loaded. This is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 because @code{define-function} and @code{defalias} record which file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 defined the function, just like @code{defun}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 (@pxref{Unloading}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 By contrast, in programs that manipulate function definitions for other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 purposes, it is better to use @code{fset}, which does not keep such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 See also @code{defsubst}, which defines a function like @code{defun}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 and tells the Lisp compiler to open-code it. @xref{Inline Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 @node Calling Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 @section Calling Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 @cindex function invocation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 @cindex calling a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 Defining functions is only half the battle. Functions don't do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 anything until you @dfn{call} them, i.e., tell them to run. Calling a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 function is also known as @dfn{invocation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 The most common way of invoking a function is by evaluating a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 For example, evaluating the list @code{(concat "a" "b")} calls the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 function @code{concat} with arguments @code{"a"} and @code{"b"}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 @xref{Evaluation}, for a description of evaluation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 When you write a list as an expression in your program, the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 name is part of the program. This means that you choose which function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 to call, and how many arguments to give it, when you write the program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 Usually that's just what you want. Occasionally you need to decide at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 run time which function to call. To do that, use the functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 @code{funcall} and @code{apply}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 @defun funcall function &rest arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 @code{funcall} calls @var{function} with @var{arguments}, and returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 whatever @var{function} returns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 Since @code{funcall} is a function, all of its arguments, including
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 @var{function}, are evaluated before @code{funcall} is called. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 means that you can use any expression to obtain the function to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 called. It also means that @code{funcall} does not see the expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 you write for the @var{arguments}, only their values. These values are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 @emph{not} evaluated a second time in the act of calling @var{function};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 @code{funcall} enters the normal procedure for calling a function at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 place where the arguments have already been evaluated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 The argument @var{function} must be either a Lisp function or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 primitive function. Special forms and macros are not allowed, because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 they make sense only when given the ``unevaluated'' argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 expressions. @code{funcall} cannot provide these because, as we saw
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 above, it never knows them in the first place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 (setq f 'list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 @result{} list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (funcall f 'x 'y 'z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 @result{} (x y z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (funcall f 'x 'y '(z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 @result{} (x y (z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (funcall 'and t nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 @error{} Invalid function: #<subr and>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 Compare these example with the examples of @code{apply}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 @defun apply function &rest arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 @code{apply} calls @var{function} with @var{arguments}, just like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 @code{funcall} but with one difference: the last of @var{arguments} is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 list of arguments to give to @var{function}, rather than a single
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 argument. We also say that @code{apply} @dfn{spreads} this list so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 each individual element becomes an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 @code{apply} returns the result of calling @var{function}. As with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 @code{funcall}, @var{function} must either be a Lisp function or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 primitive function; special forms and macros do not make sense in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 @code{apply}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (setq f 'list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 @result{} list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 (apply f 'x 'y 'z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 @error{} Wrong type argument: listp, z
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 (apply '+ 1 2 '(3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 @result{} 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 (apply '+ '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 @result{} 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 (apply 'append '((a b c) nil (x y z) nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 @result{} (a b c x y z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 For an interesting example of using @code{apply}, see the description of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 @code{mapcar}, in @ref{Mapping Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 @cindex functionals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 It is common for Lisp functions to accept functions as arguments or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 find them in data structures (especially in hook variables and property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 lists) and call them using @code{funcall} or @code{apply}. Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 that accept function arguments are often called @dfn{functionals}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 Sometimes, when you call a functional, it is useful to supply a no-op
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 function as the argument. Here are two different kinds of no-op
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 @defun identity arg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 This function returns @var{arg} and has no side effects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
674 @deffn Command ignore &rest args
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 This function ignores any arguments and returns @code{nil}.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
676 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 @node Mapping Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 @section Mapping Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 @cindex mapping functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 A @dfn{mapping function} applies a given function to each element of a
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
683 list or other collection. XEmacs Lisp has several such functions;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 @code{mapcar} and @code{mapconcat}, which scan a list, are described
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
685 here. @xref{Creating Symbols}, for the function @code{mapatoms} which
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
686 maps over the symbols in an obarray.
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
687
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
688 Mapping functions should never modify the sequence being mapped over.
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
689 The results are unpredictable.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 @defun mapcar function sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 @code{mapcar} applies @var{function} to each element of @var{sequence}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 in turn, and returns a list of the results.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
695 The argument @var{sequence} can be any kind of sequence; that is, a
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
696 list, a vector, a bit vector, or a string. The result is always a list.
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
697 The length of the result is the same as the length of @var{sequence}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 @exdent @r{For example:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 (mapcar 'car '((a b) (c d) (e f)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 @result{} (a c e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 (mapcar '1+ [1 2 3])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 @result{} (2 3 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 (mapcar 'char-to-string "abc")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 @result{} ("a" "b" "c")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 ;; @r{Call each function in @code{my-hooks}.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 (mapcar 'funcall my-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 (defun mapcar* (f &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 "Apply FUNCTION to successive cars of all ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 Return the list of results."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 ;; @r{If no list is exhausted,}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
721 (if (not (memq 'nil args))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 ;; @r{apply function to @sc{car}s.}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
723 (cons (apply f (mapcar 'car args))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
724 (apply 'mapcar* f
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 ;; @r{Recurse for rest of elements.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 (mapcar 'cdr args)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 (mapcar* 'cons '(a b c) '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 @result{} ((a . 1) (b . 2) (c . 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 @defun mapconcat function sequence separator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 @code{mapconcat} applies @var{function} to each element of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 @var{sequence}: the results, which must be strings, are concatenated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 Between each pair of result strings, @code{mapconcat} inserts the string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 @var{separator}. Usually @var{separator} contains a space or comma or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 other suitable punctuation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 The argument @var{function} must be a function that can take one
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
744 argument and return a string. The argument @var{sequence} can be any
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
745 kind of sequence; that is, a list, a vector, a bit vector, or a string.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
746
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 (mapconcat 'symbol-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 '(The cat in the hat)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 " ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 @result{} "The cat in the hat"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 (mapconcat (function (lambda (x) (format "%c" (1+ x))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 "HAL-8000"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 @result{} "IBM.9111"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 @node Anonymous Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 @section Anonymous Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 @cindex anonymous function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 In Lisp, a function is a list that starts with @code{lambda}, a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 byte-code function compiled from such a list, or alternatively a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 primitive subr-object; names are ``extra''. Although usually functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 are defined with @code{defun} and given names at the same time, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 occasionally more concise to use an explicit lambda expression---an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 anonymous function. Such a list is valid wherever a function name is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 Any method of creating such a list makes a valid function. Even this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 (setq silly (append '(lambda (x)) (list (list '+ (* 3 4) 'x))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 @result{} (lambda (x) (+ 12 x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 This computes a list that looks like @code{(lambda (x) (+ 12 x))} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 makes it the value (@emph{not} the function definition!) of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 @code{silly}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 Here is how we might call this function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 (funcall silly 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 @result{} 13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 (It does @emph{not} work to write @code{(silly 1)}, because this function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 is not the @emph{function definition} of @code{silly}. We have not given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 @code{silly} any function definition, just a value as a variable.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 Most of the time, anonymous functions are constants that appear in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 your program. For example, you might want to pass one as an argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 to the function @code{mapcar}, which applies any given function to each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 element of a list. Here we pass an anonymous function that multiplies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 a number by two:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 (defun double-each (list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 (mapcar '(lambda (x) (* 2 x)) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 @result{} double-each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 (double-each '(2 11))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 @result{} (4 22)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 In such cases, we usually use the special form @code{function} instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 of simple quotation to quote the anonymous function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 @defspec function function-object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 @cindex function quoting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 This special form returns @var{function-object} without evaluating it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 In this, it is equivalent to @code{quote}. However, it serves as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 note to the XEmacs Lisp compiler that @var{function-object} is intended
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 to be used only as a function, and therefore can safely be compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 Contrast this with @code{quote}, in @ref{Quoting}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 Using @code{function} instead of @code{quote} makes a difference
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 inside a function or macro that you are going to compile. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 (defun double-each (list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 (mapcar (function (lambda (x) (* 2 x))) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 @result{} double-each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 (double-each '(2 11))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 @result{} (4 22)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 If this definition of @code{double-each} is compiled, the anonymous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 function is compiled as well. By contrast, in the previous definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 where ordinary @code{quote} is used, the argument passed to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 @code{mapcar} is the precise list shown:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 (lambda (x) (* x 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 The Lisp compiler cannot assume this list is a function, even though it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 looks like one, since it does not know what @code{mapcar} does with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 list. Perhaps @code{mapcar} will check that the @sc{car} of the third
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 element is the symbol @code{*}! The advantage of @code{function} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 that it tells the compiler to go ahead and compile the constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 We sometimes write @code{function} instead of @code{quote} when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 quoting the name of a function, but this usage is just a sort of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 comment.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 (function @var{symbol}) @equiv{} (quote @var{symbol}) @equiv{} '@var{symbol}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 See @code{documentation} in @ref{Accessing Documentation}, for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 realistic example using @code{function} and an anonymous function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 @node Function Cells
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 @section Accessing Function Cell Contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 The @dfn{function definition} of a symbol is the object stored in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 function cell of the symbol. The functions described here access, test,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 and set the function cell of symbols.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 See also the function @code{indirect-function} in @ref{Function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 Indirection}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 @defun symbol-function symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 @kindex void-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 This returns the object in the function cell of @var{symbol}. If the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 symbol's function cell is void, a @code{void-function} error is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 signaled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 This function does not check that the returned object is a legitimate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 (defun bar (n) (+ n 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 (symbol-function 'bar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 @result{} (lambda (n) (+ n 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 (fset 'baz 'bar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 (symbol-function 'baz)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 @cindex void function cell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 If you have never given a symbol any function definition, we say that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 that symbol's function cell is @dfn{void}. In other words, the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 cell does not have any Lisp object in it. If you try to call such a symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 as a function, it signals a @code{void-function} error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 Note that void is not the same as @code{nil} or the symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 @code{void}. The symbols @code{nil} and @code{void} are Lisp objects,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 and can be stored into a function cell just as any other object can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 (and they can be valid functions if you define them in turn with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 @code{defun}). A void function cell contains no object whatsoever.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 You can test the voidness of a symbol's function definition with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 @code{fboundp}. After you have given a symbol a function definition, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 can make it void once more using @code{fmakunbound}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 @defun fboundp symbol
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
934 This function returns @code{t} if @var{symbol} has an object in its
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 function cell, @code{nil} otherwise. It does not check that the object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 is a legitimate function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 @defun fmakunbound symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 This function makes @var{symbol}'s function cell void, so that a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 subsequent attempt to access this cell will cause a @code{void-function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 error. (See also @code{makunbound}, in @ref{Local Variables}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 (defun foo (x) x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 @result{} x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 (foo 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 @result{}1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 (fmakunbound 'foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 @result{} x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 (foo 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 @error{} Symbol's function definition is void: foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 @defun fset symbol object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 This function stores @var{object} in the function cell of @var{symbol}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 The result is @var{object}. Normally @var{object} should be a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 or the name of a function, but this is not checked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 There are three normal uses of this function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 Copying one symbol's function definition to another. (In other words,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 making an alternate name for a function.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 Giving a symbol a function definition that is not a list and therefore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 cannot be made with @code{defun}. For example, you can use @code{fset}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
979 to give a symbol @var{symbol1} a function definition which is another symbol
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
980 @var{symbol2}; then @var{symbol1} serves as an alias for whatever definition
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
981 @var{symbol2} presently has.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 In constructs for defining or altering functions. If @code{defun}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 were not a primitive, it could be written in Lisp (as a macro) using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 @code{fset}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 Here are examples of the first two uses:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 ;; @r{Give @code{first} the same definition @code{car} has.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 (fset 'first (symbol-function 'car))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 @result{} #<subr car>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 (first '(1 2 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 ;; @r{Make the symbol @code{car} the function definition of @code{xfirst}.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 (fset 'xfirst 'car)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 @result{} car
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 (xfirst '(1 2 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 (symbol-function 'xfirst)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 @result{} car
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 (symbol-function (symbol-function 'xfirst))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 @result{} #<subr car>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 ;; @r{Define a named keyboard macro.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 (fset 'kill-two-lines "\^u2\^k")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 @result{} "\^u2\^k"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 See also the related functions @code{define-function} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 @code{defalias}, in @ref{Defining Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 When writing a function that extends a previously defined function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 the following idiom is sometimes used:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 (fset 'old-foo (symbol-function 'foo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 (defun foo ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 "Just like old-foo, except more so."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 (old-foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 (more-so))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 This does not work properly if @code{foo} has been defined to autoload.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 In such a case, when @code{foo} calls @code{old-foo}, Lisp attempts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 to define @code{old-foo} by loading a file. Since this presumably
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 defines @code{foo} rather than @code{old-foo}, it does not produce the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 proper results. The only way to avoid this problem is to make sure the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 file is loaded before moving aside the old definition of @code{foo}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 But it is unmodular and unclean, in any case, for a Lisp file to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 redefine a function defined elsewhere.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 @node Inline Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 @section Inline Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 @cindex inline functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 @findex defsubst
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 You can define an @dfn{inline function} by using @code{defsubst} instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 of @code{defun}. An inline function works just like an ordinary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 function except for one thing: when you compile a call to the function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 the function's definition is open-coded into the caller.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 Making a function inline makes explicit calls run faster. But it also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 has disadvantages. For one thing, it reduces flexibility; if you change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 the definition of the function, calls already inlined still use the old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 definition until you recompile them. Since the flexibility of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 redefining functions is an important feature of XEmacs, you should not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 make a function inline unless its speed is really crucial.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 Another disadvantage is that making a large function inline can increase
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 the size of compiled code both in files and in memory. Since the speed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 advantage of inline functions is greatest for small functions, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 generally should not make large functions inline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 It's possible to define a macro to expand into the same code that an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 inline function would execute. But the macro would have a limitation:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 you can use it only explicitly---a macro cannot be called with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 @code{apply}, @code{mapcar} and so on. Also, it takes some work to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 convert an ordinary function into a macro. (@xref{Macros}.) To convert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 it into an inline function is very easy; simply replace @code{defun}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 with @code{defsubst}. Since each argument of an inline function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 evaluated exactly once, you needn't worry about how many times the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 body uses the arguments, as you do for macros. (@xref{Argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 Evaluation}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 Inline functions can be used and open-coded later on in the same file,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 following the definition, just like macros.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 @c Emacs versions prior to 19 did not have inline functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 @node Related Topics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 @section Other Topics Related to Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 Here is a table of several functions that do things related to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 function calling and function definitions. They are documented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 elsewhere, but we provide cross references here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 @item apply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 See @ref{Calling Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 @item autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 See @ref{Autoload}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 @item call-interactively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 See @ref{Interactive Call}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 @item commandp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 See @ref{Interactive Call}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 @item documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 See @ref{Accessing Documentation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 @item eval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 See @ref{Eval}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 @item funcall
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 See @ref{Calling Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 @item ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 See @ref{Calling Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 @item indirect-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 See @ref{Function Indirection}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 @item interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 See @ref{Using Interactive}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 @item interactive-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 See @ref{Interactive Call}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 @item mapatoms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 See @ref{Creating Symbols}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 @item mapcar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 See @ref{Mapping Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 @item mapconcat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 See @ref{Mapping Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 @item undefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 See @ref{Key Lookup}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146