annotate man/lispref/functions.texi @ 5353:38e24b8be4ea

Improve the lexical scoping in #'block, #'return-from. lisp/ChangeLog addition: 2011-02-07 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el: * bytecomp.el (byte-compile-initial-macro-environment): Shadow `block', `return-from' here, we implement them differently when byte-compiling. * bytecomp.el (byte-compile-active-blocks): New. * bytecomp.el (byte-compile-block-1): New. * bytecomp.el (byte-compile-return-from-1): New. * bytecomp.el (return-from-1): New. * bytecomp.el (block-1): New. These are two aliases that exist to have their own associated byte-compile functions, which functions implement `block' and `return-from'. * cl-extra.el (cl-macroexpand-all): Fix a bug here when macros in the environment have been compiled. * cl-macs.el (block): * cl-macs.el (return): * cl-macs.el (return-from): Be more careful about lexical scope in these macros. * cl.el: * cl.el ('cl-block-wrapper): Removed. * cl.el ('cl-block-throw): Removed. These aren't needed in code generated by this XEmacs. They shouldn't be needed in code generated by XEmacs 21.4, but if it turns out the packages do need them, we can put them back. 2011-01-30 Mike Sperber <mike@xemacs.org> * font-lock.el (font-lock-fontify-pending-extents): Don't fail if `font-lock-mode' is unset, which can happen in the middle of `revert-buffer'. 2011-01-23 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (delete): * cl-macs.el (delq): * cl-macs.el (remove): * cl-macs.el (remq): Don't use the compiler macro if these functions were given the wrong number of arguments, as happens in lisp-tests.el. * cl-seq.el (remove, remq): Removed. I added these to subr.el, and forgot to remove them from here. 2011-01-22 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el (byte-compile-setq, byte-compile-set): Remove kludge allowing keywords' values to be set, all the code that does that is gone. * cl-compat.el (elt-satisfies-test-p): * faces.el (set-face-parent): * faces.el (face-doc-string): * gtk-font-menu.el: * gtk-font-menu.el (gtk-reset-device-font-menus): * msw-font-menu.el: * msw-font-menu.el (mswindows-reset-device-font-menus): * package-get.el (package-get-installedp): * select.el (select-convert-from-image-data): * sound.el: * sound.el (load-sound-file): * x-font-menu.el (x-reset-device-font-menus-core): Don't quote keywords, they're self-quoting, and the win from backward-compatibility is sufficiently small now that the style problem overrides it. 2011-01-22 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (block, return-from): Require that NAME be a symbol in these macros, as always documented in the #'block docstring and as required by Common Lisp. * descr-text.el (unidata-initialize-unihan-database): Correct the use of non-symbols in #'block and #'return-from in this function. 2011-01-15 Aidan Kehoe <kehoea@parhasard.net> * cl-extra.el (concatenate): Accept more complicated TYPEs in this function, handing the sequences over to #'coerce if we don't understand them here. * cl-macs.el (inline): Don't proclaim #'concatenate as inline, its compiler macro is more useful than doing that. 2011-01-11 Aidan Kehoe <kehoea@parhasard.net> * subr.el (delete, delq, remove, remq): Move #'remove, #'remq here, they don't belong in cl-seq.el; move #'delete, #'delq here from fns.c, implement them in terms of #'delete*, allowing support for sequences generally. * update-elc.el (do-autoload-commands): Use #'delete*, not #'delq here, now the latter's no longer dumped. * cl-macs.el (delete, delq): Add compiler macros transforming #'delete and #'delq to #'delete* calls. 2011-01-10 Aidan Kehoe <kehoea@parhasard.net> * dialog.el (make-dialog-box): Correct a misplaced parenthesis here, thank you Mats Lidell in 87zkr9gqrh.fsf@mail.contactor.se ! 2011-01-02 Aidan Kehoe <kehoea@parhasard.net> * dialog.el (make-dialog-box): * list-mode.el (display-completion-list): These functions used to use cl-parsing-keywords; change them to use defun* instead, fixing the build. (Not sure what led to me not including this change in d1b17a33450b!) 2011-01-02 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (define-star-compiler-macros): Make sure the form has ITEM and LIST specified before attempting to change to calls with explicit tests; necessary for some tests in lisp-tests.el to compile correctly. (stable-union, stable-intersection): Add compiler macros for these functions, in the same way we do for most of the other functions in cl-seq.el. 2011-01-01 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (dolist, dotimes, do-symbols, macrolet) (symbol-macrolet): Define these macros with defmacro* instead of parsing the argument list by hand, for the sake of style and readability; use backquote where appropriate, instead of calling #'list and and friends, for the same reason. 2010-12-30 Aidan Kehoe <kehoea@parhasard.net> * x-misc.el (device-x-display): Provide this function, documented in the Lispref for years, but not existing previously. Thank you Julian Bradfield, thank you Jeff Mincy. 2010-12-30 Aidan Kehoe <kehoea@parhasard.net> * cl-seq.el: Move the heavy lifting from this file to C. Dump the cl-parsing-keywords macro, but don't use defun* for the functions we define that do take keywords, dynamic scope lossage makes that not practical. * subr.el (sort, fillarray): Move these aliases here. (map-plist): #'nsublis is now built-in, but at this point #'eql isn't necessarily available as a test; use #'eq. * obsolete.el (cl-delete-duplicates): Make this available for old compiler macros and old code. (memql): Document that this is equivalent to #'member*, and worse. * cl.el (adjoin, subst): Removed. These are in C. 2010-12-30 Aidan Kehoe <kehoea@parhasard.net> * simple.el (assoc-ignore-case): Remove a duplicate definition of this function (it's already in subr.el). * iso8859-1.el (char-width): On non-Mule, make this function equivalent to that produced by (constantly 1), but preserve its docstring. * subr.el (subst-char-in-string): Define this in terms of #'substitute, #'nsubstitute. (string-width): Define this using #'reduce and #'char-width. (char-width): Give this a simpler definition, it makes far more sense to check for mule at load time and redefine, as we do in iso8859-1.el. (store-substring): Implement this in terms of #'replace, now #'replace is cheap. 2010-12-30 Aidan Kehoe <kehoea@parhasard.net> * update-elc.el (lisp-files-needed-for-byte-compilation) (lisp-files-needing-early-byte-compilation): cl-macs belongs in the former, not the latter, it is as fundamental as bytecomp.el. 2010-12-30 Aidan Kehoe <kehoea@parhasard.net> * cl.el: Provde the Common Lisp program-error, type-error as error symbols. This doesn't nearly go far enough for anyone using the Common Lisp errors. 2010-12-29 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (delete-duplicates): If the form has an incorrect number of arguments, don't attempt a compiler macroexpansion. 2010-12-29 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (cl-safe-expr-p): Forms that start with the symbol lambda are also safe. 2010-12-29 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (= < > <= >=): For these functions' compiler macros, the optimisation is safe even if the first and the last arguments have side effects, since they're only used the once. 2010-12-29 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (inline-side-effect-free-compiler-macros): Unroll a loop here at macro-expansion time, so these compiler macros are compiled. Use #'eql instead of #'eq in a couple of places for better style. 2010-12-29 Aidan Kehoe <kehoea@parhasard.net> * cl-extra.el (notany, notevery): Avoid some dynamic scope stupidity with local variable names in these functions, when they weren't prefixed with cl-; go into some more detail in the doc strings. 2010-12-29 Aidan Kehoe <kehoea@parhasard.net> * byte-optimize.el (side-effect-free-fns): #'remove, #'remq are free of side-effects. (side-effect-and-error-free-fns): Drop dot, dot-marker from the list. 2010-11-17 Aidan Kehoe <kehoea@parhasard.net> * cl-extra.el (coerce): In the argument list, name the first argument OBJECT, not X; the former name was always used in the doc string and is clearer. Handle vector type specifications which include the length of the target sequence, error if there's a mismatch. * cl-macs.el (cl-make-type-test): Handle type specifications starting with the symbol 'eql. 2010-11-14 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (eql): Don't remove the byte-compile property of this symbol. That was necessary to override a bug in bytecomp.el where #'eql was confused with #'eq, which bug we no longer have. If neither expression is constant, don't attempt to handle the expression in this compiler macro, leave it to byte-compile-eql, which produces better code anyway. * bytecomp.el (eq): #'eql is not the function associated with the byte-eq byte code. (byte-compile-eql): Add an explicit compile method for this function, for cases where the cl-macs compiler macro hasn't reduced it to #'eq or #'equal. 2010-10-25 Aidan Kehoe <kehoea@parhasard.net> Add compiler macros and compilation sanity-checking for various functions that take keywords. * byte-optimize.el (side-effect-free-fns): #'symbol-value is side-effect free and not error free. * bytecomp.el (byte-compile-normal-call): Check keyword argument lists for sanity; store information about the positions where keyword arguments start using the new byte-compile-keyword-start property. * cl-macs.el (cl-const-expr-val): Take a new optional argument, cl-not-constant, defaulting to nil, in this function; return it if the expression is not constant. (cl-non-fixnum-number-p): Make this into a separate function, we want to pass it to #'every. (eql): Use it. (define-star-compiler-macros): Use the same code to generate the member*, assoc* and rassoc* compiler macros; special-case some code in #'add-to-list in subr.el. (remove, remq): Add compiler macros for these two functions, in preparation for #'remove being in C. (define-foo-if-compiler-macros): Transform (remove-if-not ...) calls to (remove ... :if-not) at compile time, which will be a real win once the latter is in C. (define-substitute-if-compiler-macros) (define-subst-if-compiler-macros): Similarly for these functions. (delete-duplicates): Change this compiler macro to use #'plists-equal; if we don't have information about the type of SEQUENCE at compile time, don't bother attempting to inline the call, the function will be in C soon enough. (equalp): Remove an old commented-out compiler macro for this, if we want to see it it's in version control. (subst-char-in-string): Transform this to a call to nsubstitute or nsubstitute, if that is appropriate. * cl.el (ldiff): Don't call setf here, this makes for a load-time dependency problem in cl-macs.el 2010-06-14 Stephen J. Turnbull <stephen@xemacs.org> * term/vt100.el: Refer to XEmacs, not GNU Emacs, in permissions. * term/bg-mouse.el: * term/sup-mouse.el: Put copyright notice in canonical "Copyright DATE AUTHOR" form. Refer to XEmacs, not GNU Emacs, in permissions. * site-load.el: Add permission boilerplate. * mule/canna-leim.el: * alist.el: Refer to XEmacs, not APEL/this program, in permissions. * mule/canna-leim.el: Remove my copyright, I've assigned it to the FSF. 2010-06-14 Stephen J. Turnbull <stephen@xemacs.org> * gtk.el: * gtk-widget-accessors.el: * gtk-package.el: * gtk-marshal.el: * gtk-compose.el: * gnome.el: Add copyright notice based on internal evidence. 2010-06-14 Stephen J. Turnbull <stephen@xemacs.org> * easymenu.el: Add reference to COPYING to permission notice. * gutter.el: * gutter-items.el: * menubar-items.el: Fix typo "Xmacs" in permissions notice. 2010-06-14 Stephen J. Turnbull <stephen@xemacs.org> * auto-save.el: * font.el: * fontconfig.el: * mule/kinsoku.el: Add "part of XEmacs" text to permission notice. 2010-10-14 Aidan Kehoe <kehoea@parhasard.net> * byte-optimize.el (side-effect-free-fns): * cl-macs.el (remf, getf): * cl-extra.el (tailp, cl-set-getf, cl-do-remf): * cl.el (ldiff, endp): Tighten up Common Lisp compatibility for #'ldiff, #'endp, #'tailp; add circularity checking for the first two. #'cl-set-getf and #'cl-do-remf were Lisp implementations of #'plist-put and #'plist-remprop; change the names to aliases, changes the macros that use them to using #'plist-put and #'plist-remprop directly. 2010-10-12 Aidan Kehoe <kehoea@parhasard.net> * abbrev.el (fundamental-mode-abbrev-table, global-abbrev-table): Create both these abbrev tables using the usual #'define-abbrev-table calls, rather than attempting to special-case them. * cl-extra.el: Force cl-macs to be loaded here, if cl-extra.el is being loaded interpreted. Previously other, later files would redundantly call (load "cl-macs") when interpreted, it's more reasonable to do it here, once. * cmdloop.el (read-quoted-char-radix): Use defcustom here, we don't have any dump-order dependencies that would prevent that. * custom.el (eval-when-compile): Don't load cl-macs when interpreted or when byte-compiling, rely on cl-extra.el in the former case and the appropriate entry in bytecomp-load-hook in the latter. Get rid of custom-declare-variable-list, we have no dump-time dependencies that would require it. * faces.el (eval-when-compile): Don't load cl-macs when interpreted or when byte-compiling. * packages.el: Remove some inaccurate comments. * post-gc.el (cleanup-simple-finalizers): Use #'delete-if-not here, now the order of preloaded-file-list has been changed to make it available. * subr.el (custom-declare-variable-list): Remove. No need for it. Also remove a stub define-abbrev-table from this file, given the current order of preloaded-file-list there's no need for it. 2010-10-10 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el (byte-compile-constp) Forms quoted with FUNCTION are also constant. (byte-compile-initial-macro-environment): In #'the, if FORM is constant and does not match TYPE, warn at byte-compile time. 2010-10-10 Aidan Kehoe <kehoea@parhasard.net> * backquote.el (bq-vector-contents, bq-list*): Remove; the former is equivalent to (append VECTOR nil), the latter to (list* ...). (bq-process-2): Use (append VECTOR nil) instead of using #'bq-vector-contents to convert to a list. (bq-process-1): Now we use list* instead of bq-list * subr.el (list*): Moved from cl.el, since it is now required to be available the first time a backquoted form is encountered. * cl.el (list*): Move to subr.el. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * test-harness.el (Check-Message): Add an omitted comma here, thank you the buildbot. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * hash-table.el (hash-table-key-list, hash-table-value-list) (hash-table-key-value-alist, hash-table-key-value-plist): Remove some useless #'nreverse calls in these files; our hash tables have no order, it's not helpful to pretend they do. * behavior.el (read-behavior): Do the same in this file, in some code evidently copied from hash-table.el. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * info.el (Info-insert-dir): * format.el (format-deannotate-region): * files.el (cd, save-buffers-kill-emacs): Use #'some, #'every and related functions for applying boolean operations to lists, instead of rolling our own ones that cons and don't short-circuit. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el (byte-compile-initial-macro-environment): * cl-macs.el (the): Rephrase the docstring, make its implementation when compiling files a little nicer. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * descr-text.el (unidata-initialize-unicodedata-database) (unidata-initialize-unihan-database, describe-char-unicode-data) (describe-char-unicode-data): Wrap calls to the database functions with (with-fboundp ...), avoiding byte compile warnings on builds without support for the database functions. (describe-char): (reduce #'max ...), not (apply #'max ...), no need to cons needlessly. (describe-char): Remove a redundant lambda wrapping #'extent-properties. (describe-char-unicode-data): Call #'nsubst when replacing "" with nil in the result of #'split-string, instead of consing inside mapcar. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * x-faces.el (x-available-font-sizes): * specifier.el (let-specifier): * package-ui.el (pui-add-required-packages): * msw-faces.el (mswindows-available-font-sizes): * modeline.el (modeline-minor-mode-menu): * minibuf.el (minibuf-directory-files): Replace the O2N (delq nil (mapcar (lambda (W) (and X Y)) Z)) with the ON (mapcan (lambda (W) (and X (list Y))) Z) in these files. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (= < > <= >=): When these functions are handed more than two arguments, and those arguments have no side effects, transform to a series of two argument calls, avoiding funcall in the byte-compiled code. * mule/mule-cmds.el (finish-set-language-environment): Take advantage of this change in a function called 256 times at startup. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el (byte-compile-function-form, byte-compile-quote) (byte-compile-quote-form): Warn at compile time, and error at runtime, if a (quote ...) or a (function ...) form attempts to quote more than one object. 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * byte-optimize.el (byte-optimize-apply): Transform (apply 'nconc (mapcar ...)) to (mapcan ...); warn about use of the first idiom. * update-elc.el (do-autoload-commands): * packages.el (packages-find-package-library-path): * frame.el (frame-list): * extents.el (extent-descendants): * etags.el (buffer-tag-table-files): * dumped-lisp.el (preloaded-file-list): * device.el (device-list): * bytecomp-runtime.el (proclaim-inline, proclaim-notinline) Use #'mapcan, not (apply #'nconc (mapcar ...) in all these files. * bytecomp-runtime.el (eval-when-compile, eval-and-compile): In passing, mention that these macros also evaluate the body when interpreted. tests/ChangeLog addition: 2011-02-07 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: Test lexical scope for `block', `return-from'; add a Known-Bug-Expect-Failure for a contorted example that fails when byte-compiled.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 07 Feb 2011 12:01:24 +0000
parents 99f8ebc082d9
children 62b9ef1ed4ac
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
2492
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
6 @node Functions and Commands, Macros, Variables, Top
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
7 @chapter Functions and Commands
428
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
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
45 specifically to mean a function written in Lisp. Special operators and
428
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
2492
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
48 @item command
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
49 @cindex command
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
50
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
51 A @dfn{command} is a possible definition for a key sequence---we count
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
52 mouse events and menu accesses as key sequences for this purpose. More
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
53 formally, within XEmacs lisp, a command is something that
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
54 @code{command-execute} can invoke.
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
55
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
56 Some functions are commands; a function written in Lisp is a command if
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
57 it contains an interactive declaration. A trivial interactive
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
58 declaration is a line @code{(interactive)} immediately after the
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
59 documentation string. For more complex examples, with prompting and
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
60 completion, see @xref{Defining Commands}. Such a function can be called
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
61 from Lisp expressions like other functions; in this case, the fact that
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
62 the function is a command makes no difference.
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
63
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
64 Keyboard macros (strings and vectors) are commands also, even though
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
65 they are not functions. A symbol is a command if its function
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
66 definition is a command; such symbols can be invoked with @kbd{M-x}.
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
67 The symbol is a function as well if the definition is a function.
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
68
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
69 In the case where you want to call a command in reaction to a
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
70 user-generated event, you'll need to bind it to that event. For how to
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
71 do this, see @xref{Key Binding Commands}.
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
72 @xref{Command Overview}.
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
73
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
74 @item keystroke command
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
75 @cindex keystroke command
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
76 A @dfn{keystroke command} is a command that is bound to a key sequence
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
77 (typically one to three keystrokes). The distinction is made here
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
78 merely to avoid confusion with the meaning of ``command'' in non-Emacs
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
79 editors; for Lisp programs, the distinction is normally unimportant.
6780963faf78 [xemacs-hg @ 2005-01-21 09:43:09 by aidan]
aidan
parents: 444
diff changeset
80
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 @item primitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 @cindex primitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 @cindex subr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 @cindex built-in function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 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
86 such as @code{car} or @code{append}. These functions are also called
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
87 @dfn{built-in} functions or @dfn{subrs}. (Special operators are also
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 considered primitives.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 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
91 fundamental, because it provides a low-level interface to operating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 system services, or because it needs to run fast. Primitives can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 modified or added only by changing the C sources and recompiling the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 editor. See @ref{Writing Lisp Primitives,,, internals, XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 Internals Manual}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 @item lambda expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 A @dfn{lambda expression} is a function written in Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 These are described in the following section.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 @xref{Lambda Expressions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
104 @item special operator
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
105 A @dfn{special operator} is a primitive that is like a function but does not
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 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
107 some of the arguments, or may evaluate them in an unusual order, or
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
108 several times. Many special operators are described in @ref{Control
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 Structures}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 @item macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 @cindex macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 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
114 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
115 write into an equivalent expression to be evaluated instead of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 original expression. Macros enable Lisp programmers to do the sorts of
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
117 things that special operators can do. @xref{Macros}, for how to define and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 use macros.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 @item compiled function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 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
122 byte compiler. @xref{Compiled-Function Type}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 @defun subrp object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 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
127 (i.e., a Lisp primitive).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (subrp 'message) ; @r{@code{message} is a symbol,}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 @result{} nil ; @r{not a subr object.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (subrp (symbol-function 'message))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 @defun compiled-function-p object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 This function returns @code{t} if @var{object} is a compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 function. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (compiled-function-p (symbol-function 'next-line))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 @node Lambda Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 @section Lambda Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 @cindex lambda expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 A function written in Lisp is a list that looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 (lambda (@var{arg-variables}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 @r{[}@var{documentation-string}@r{]}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 @r{[}@var{interactive-declaration}@r{]}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 @var{body-forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 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
168 actually is valid as an expression---it evaluates to itself. In some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 other Lisp dialects, a lambda expression is not a valid expression at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 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
171 expression, but to be called as a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 * Lambda Components:: The parts of a lambda expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 * Simple Lambda:: A simple example.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 * Argument List:: Details and special features of argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 * Function Documentation:: How to put documentation in a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 @node Lambda Components
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 @subsection Components of a Lambda Expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 @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 A function written in Lisp (a ``lambda expression'') is a list that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (lambda (@var{arg-variables}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 [@var{documentation-string}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 [@var{interactive-declaration}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 @var{body-forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 @cindex lambda list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 The first element of a lambda expression is always the symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 @code{lambda}. This indicates that the list represents a function. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 reason functions are defined to start with @code{lambda} is so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 other lists, intended for other uses, will not accidentally be valid as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 The second element is a list of symbols--the argument variable names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 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
205 the argument values are matched up against the variables in the lambda
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 list, which are given local bindings with the values provided.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 @xref{Local Variables}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 The documentation string is a Lisp string object placed within the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 function definition to describe the function for the XEmacs help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 facilities. @xref{Function Documentation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 The interactive declaration is a list of the form @code{(interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 @var{code-string})}. This declares how to provide arguments if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 function is used interactively. Functions with this declaration are called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 @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
217 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
218 declarations. @xref{Defining Commands}, for how to write an interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 declaration.
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 @cindex body of function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 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
223 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
224 ``a list of Lisp forms to evaluate''). The value returned by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 function is the value returned by the last element of the body.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 @node Simple Lambda
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 @subsection A Simple Lambda-Expression Example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 Consider for example the following function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (lambda (a b c) (+ a b c))
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 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
238 expression, like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 ((lambda (a b c) (+ a b c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 1 2 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 This call evaluates the body of the lambda expression with the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 @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
250 Evaluation of the body adds these three numbers, producing the result 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 therefore, this call to the function returns the value 6.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 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
254 this example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 ((lambda (a b c) (+ a b c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 1 (* 2 3) (- 5 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 This evaluates the arguments @code{1}, @code{(* 2 3)}, and @code{(- 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 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
266 argument values 1, 6 and 1 to produce the value 8.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 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
269 a form in this way. You can get the same result, of making local
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
270 variables and giving them values, using the special operator @code{let}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (@pxref{Local Variables}). And @code{let} is clearer and easier to use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 In practice, lambda expressions are either stored as the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 definitions of symbols, to produce named functions, or passed as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 arguments to other functions (@pxref{Anonymous Functions}).
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 However, calls to explicit lambda expressions were very useful in the
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
277 old days of Lisp, before the special operator @code{let} was invented. At
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 that time, they were the only way to bind and initialize local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 variables.
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 @node Argument List
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 @subsection Advanced Features of Argument Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 @kindex wrong-number-of-arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 @cindex argument binding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 @cindex binding arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 Our simple sample function, @code{(lambda (a b c) (+ a b c))},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 specifies three argument variables, so it must be called with three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 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
290 arguments, you get a @code{wrong-number-of-arguments} error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 It is often convenient to write a function that allows certain
5089
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
293 arguments to be omitted. For example, the function @code{subseq}
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
294 accepts three arguments---a sequence, the start index and the end
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 index---but the third argument defaults to the @var{length} of the
5089
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
296 sequence if you omit it. It is also convenient for certain functions to
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 accept an indefinite number of arguments, as the functions @code{list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 and @code{+} do.
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 @cindex optional arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 @cindex rest arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 @kindex &optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 @kindex &rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 To specify optional arguments that may be omitted when a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 is called, simply include the keyword @code{&optional} before the optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 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
307 keyword @code{&rest} before one final argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 Thus, the complete syntax for an argument list is as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (@var{required-vars}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 @r{[}&optional @var{optional-vars}@dots{}@r{]}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 @r{[}&rest @var{rest-var}@r{]})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 The square brackets indicate that the @code{&optional} and @code{&rest}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 clauses, and the variables that follow them, are optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 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
324 @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
325 the @var{optional-vars}, and there cannot be any actual arguments beyond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 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
327 be any number of extra actual arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 If actual arguments for the optional and rest variables are omitted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 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
331 function to distinguish between an explicit argument of @code{nil} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 an omitted argument. However, the body of the function is free to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 consider @code{nil} an abbreviation for some other meaningful value.
5089
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
334 This is what @code{subseq} does; @code{nil} as the third argument to
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
335 @code{subseq} means to use the length of the sequence supplied.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 @cindex CL note---default optional arg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 @quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 @b{Common Lisp note:} Common Lisp allows the function to specify what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 default value to use when an optional argument is omitted; XEmacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 always uses @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 @end quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 For example, an argument list that looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (a b &optional c d &rest e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 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
352 required. If one or two more arguments are provided, @code{c} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 @code{d} are bound to them respectively; any arguments after the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 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
355 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
356 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
357 is @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 There is no way to have required arguments following optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 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
361 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
362 Suppose three actual arguments are given; which variable would the third
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 argument be for? Similarly, it makes no sense to have any more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 arguments (either required or optional) after a @code{&rest} argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 Here are some examples of argument lists and proper calls:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 ((lambda (n) (1+ n)) ; @r{One required:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 1) ; @r{requires exactly one argument.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 @result{} 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 ((lambda (n &optional n1) ; @r{One required and one optional:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 (if n1 (+ n n1) (1+ n))) ; @r{1 or 2 arguments.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 1 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 ((lambda (n &rest ns) ; @r{One required and one rest:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 (+ n (apply '+ ns))) ; @r{1 or more arguments.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 1 2 3 4 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 @result{} 15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 @end smallexample
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 @node Function Documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 @subsection Documentation Strings of Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 @cindex documentation of function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 A lambda expression may optionally have a @dfn{documentation string} just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 after the lambda list. This string does not affect execution of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 function; it is a kind of comment, but a systematized comment which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 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
390 facilities. @xref{Documentation}, for how the @var{documentation-string} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 accessed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 It is a good idea to provide documentation strings for all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 functions in your program, even those that are only called from within
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 your program. Documentation strings are like comments, except that they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 are easier to access.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 The first line of the documentation string should stand on its own,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 because @code{apropos} displays just this first line. It should consist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 of one or two complete sentences that summarize the function's purpose.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 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
403 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
404 the string. Some people make a practice of indenting any additional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 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
406 @emph{This is a mistake.} The indentation of the following lines is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 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
408 when displayed by the help commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 You may wonder how the documentation string could be optional, since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 there are required components of the function that follow it (the body).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 Since evaluation of a string returns that string, without any side effects,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 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
414 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
415 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
416 as the return value and as the documentation.
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 @node Function Names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 @section Naming a Function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 @cindex function definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 @cindex named function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 @cindex function name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 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
425 function without a name is nonsensical. In Lisp, a function in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 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
427 @code{lambda}, or a primitive subr-object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 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
430 when you put the function in the symbol's @dfn{function cell}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (@pxref{Symbol Components}). Then the symbol itself becomes a valid,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 callable function, equivalent to the list or subr-object that its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 function cell refers to. The contents of the function cell are also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 called the symbol's @dfn{function definition}. The procedure of using a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 symbol's function definition in place of the symbol is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 @dfn{symbol function indirection}; see @ref{Function Indirection}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 In practice, nearly all functions are given names in this way and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 referred to through their names. For example, the symbol @code{car} works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 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
441 @code{#<subr car>} is stored in its function cell.
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 give functions names because it is convenient to refer to them by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 their names in Lisp expressions. For primitive subr-objects such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 @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
446 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
447 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
448 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
449 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
450 more convenient than making the function definition point to itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (something that is not impossible but that has various disadvantages in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 practice).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 We often identify functions with the symbols used to name them. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 example, we often speak of ``the function @code{car}'', not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 distinguishing between the symbol @code{car} and the primitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 subr-object that is its function definition. For most purposes, there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 is no need to distinguish.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 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
461 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
462 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
463 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
464 equally well a name for the same function.
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 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
467 these two uses of a symbol are independent and do not conflict.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 @node Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 @section Defining Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 @cindex defining a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 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
474 is called @dfn{defining a function}, and it is done with the
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
475 @code{defun} special operator.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 @defspec defun name argument-list body-forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 @code{defun} is the usual way to define new Lisp functions. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 defines the symbol @var{name} as a function that looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (lambda @var{argument-list} . @var{body-forms})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 @code{defun} stores this lambda expression in the function cell of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 @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
487 value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 As described previously (@pxref{Lambda Expressions}),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 @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
491 keywords @code{&optional} and @code{&rest}. Also, the first two forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 in @var{body-forms} may be a documentation string and an interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 declaration.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 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
496 variable, since the symbol's value cell is independent of the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 cell. @xref{Symbol Components}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 Here are some examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (defun foo () 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 @result{} foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 (foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 (defun bar (a &optional b &rest c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 (list a b c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 (bar 1 2 3 4 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 @result{} (1 2 (3 4 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (bar 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 @result{} (1 nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (bar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 @error{} Wrong number of arguments.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (defun capitalize-backwards ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 "Upcase the last letter of a word."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (backward-word 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (forward-word 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (backward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 (capitalize-word 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 @result{} capitalize-backwards
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 Be careful not to redefine existing functions unintentionally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 @code{defun} redefines even primitive functions such as @code{car}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 without any hesitation or notification. Redefining a function already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 defined is often done deliberately, and there is no way to distinguish
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 deliberate redefinition from unintentional redefinition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 @defun define-function name definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 @defunx defalias name definition
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
550 These equivalent primitives define the symbol @var{name} as a
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 function, with definition @var{definition} (which can be any valid Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 function).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 The proper place to use @code{define-function} or @code{defalias} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 where a specific function name is being defined---especially where that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 name appears explicitly in the source file being loaded. This is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 because @code{define-function} and @code{defalias} record which file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 defined the function, just like @code{defun}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 (@pxref{Unloading}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 By contrast, in programs that manipulate function definitions for other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 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
563 records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 See also @code{defsubst}, which defines a function like @code{defun}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 and tells the Lisp compiler to open-code it. @xref{Inline Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 @node Calling Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 @section Calling Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 @cindex function invocation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 @cindex calling a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 Defining functions is only half the battle. Functions don't do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 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
576 function is also known as @dfn{invocation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 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
579 For example, evaluating the list @code{(concat "a" "b")} calls the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 function @code{concat} with arguments @code{"a"} and @code{"b"}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 @xref{Evaluation}, for a description of evaluation.
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 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
584 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
585 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
586 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
587 run time which function to call. To do that, use the functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 @code{funcall} and @code{apply}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 @defun funcall function &rest arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 @code{funcall} calls @var{function} with @var{arguments}, and returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 whatever @var{function} returns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 Since @code{funcall} is a function, all of its arguments, including
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 @var{function}, are evaluated before @code{funcall} is called. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 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
597 called. It also means that @code{funcall} does not see the expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 you write for the @var{arguments}, only their values. These values are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 @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
600 @code{funcall} enters the normal procedure for calling a function at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 place where the arguments have already been evaluated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 The argument @var{function} must be either a Lisp function or a
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
604 primitive function. Special operators and macros are not allowed, because
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 they make sense only when given the ``unevaluated'' argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 expressions. @code{funcall} cannot provide these because, as we saw
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 above, it never knows them in the first place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 (setq f 'list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 @result{} list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (funcall f 'x 'y 'z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 @result{} (x y z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 (funcall f 'x 'y '(z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 @result{} (x y (z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 (funcall 'and t nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 @error{} Invalid function: #<subr and>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 Compare these example with the examples of @code{apply}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 @defun apply function &rest arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 @code{apply} calls @var{function} with @var{arguments}, just like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 @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
634 list of arguments to give to @var{function}, rather than a single
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 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
636 each individual element becomes an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 @code{apply} returns the result of calling @var{function}. As with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 @code{funcall}, @var{function} must either be a Lisp function or a
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
640 primitive function; special operators and macros do not make sense in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 @code{apply}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (setq f 'list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 @result{} list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 (apply f 'x 'y 'z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 @error{} Wrong type argument: listp, z
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 (apply '+ 1 2 '(3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 @result{} 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 (apply '+ '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 @result{} 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 (apply 'append '((a b c) nil (x y z) nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 @result{} (a b c x y z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 For an interesting example of using @code{apply}, see the description of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 @code{mapcar}, in @ref{Mapping Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 @cindex functionals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 It is common for Lisp functions to accept functions as arguments or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 find them in data structures (especially in hook variables and property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 lists) and call them using @code{funcall} or @code{apply}. Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 that accept function arguments are often called @dfn{functionals}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 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
678 function as the argument. Here are two different kinds of no-op
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 @defun identity arg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 This function returns @var{arg} and has no side effects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
685 @deffn Command ignore &rest args
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 This function ignores any arguments and returns @code{nil}.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
687 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 @node Mapping Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 @section Mapping Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 @cindex mapping functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 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
694 list or other collection. XEmacs Lisp has several such functions;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 @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
696 here. @xref{Creating Symbols}, for the function @code{mapatoms} which
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
697 maps over the symbols in an obarray.
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
698
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
699 Mapping functions should never modify the sequence being mapped over.
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
700 The results are unpredictable.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 @defun mapcar function sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 @code{mapcar} applies @var{function} to each element of @var{sequence}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 in turn, and returns a list of the results.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
706 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
707 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
708 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
709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 @smallexample
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 @exdent @r{For example:}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 (mapcar 'car '((a b) (c d) (e f)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 @result{} (a c e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 (mapcar '1+ [1 2 3])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 @result{} (2 3 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 (mapcar 'char-to-string "abc")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 @result{} ("a" "b" "c")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 ;; @r{Call each function in @code{my-hooks}.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 (mapcar 'funcall my-hooks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 (defun mapcar* (f &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 "Apply FUNCTION to successive cars of all ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 Return the list of results."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 ;; @r{If no list is exhausted,}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
732 (if (not (memq 'nil args))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 ;; @r{apply function to @sc{car}s.}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
734 (cons (apply f (mapcar 'car args))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
735 (apply 'mapcar* f
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 ;; @r{Recurse for rest of elements.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (mapcar 'cdr args)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 (mapcar* 'cons '(a b c) '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 @result{} ((a . 1) (b . 2) (c . 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 @defun mapconcat function sequence separator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 @code{mapconcat} applies @var{function} to each element of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 @var{sequence}: the results, which must be strings, are concatenated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 Between each pair of result strings, @code{mapconcat} inserts the string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 @var{separator}. Usually @var{separator} contains a space or comma or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 other suitable punctuation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 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
755 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
756 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
757
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 (mapconcat 'symbol-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 '(The cat in the hat)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 " ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 @result{} "The cat in the hat"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 (mapconcat (function (lambda (x) (format "%c" (1+ x))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 "HAL-8000"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 @result{} "IBM.9111"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 @end defun
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 @node Anonymous Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 @section Anonymous Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @cindex anonymous function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 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
780 byte-code function compiled from such a list, or alternatively a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 primitive subr-object; names are ``extra''. Although usually functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 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
783 occasionally more concise to use an explicit lambda expression---an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 anonymous function. Such a list is valid wherever a function name is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 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
787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 (setq silly (append '(lambda (x)) (list (list '+ (* 3 4) 'x))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 @result{} (lambda (x) (+ 12 x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 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
797 makes it the value (@emph{not} the function definition!) of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 @code{silly}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 Here is how we might call this function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 (funcall silly 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 @result{} 13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 @end example
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 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 (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
811 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
812 @code{silly} any function definition, just a value as a variable.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 Most of the time, anonymous functions are constants that appear in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 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
816 to the function @code{mapcar}, which applies any given function to each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 element of a list. Here we pass an anonymous function that multiplies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 a number by two:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 (defun double-each (list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 (mapcar '(lambda (x) (* 2 x)) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 @result{} double-each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 (double-each '(2 11))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 @result{} (4 22)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 @noindent
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
833 In such cases, we usually use the special operator @code{function} instead
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 of simple quotation to quote the anonymous function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 @defspec function function-object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 @cindex function quoting
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2492
diff changeset
838 This special operator returns @var{function-object} without evaluating it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 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
840 note to the XEmacs Lisp compiler that @var{function-object} is intended
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 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
842 Contrast this with @code{quote}, in @ref{Quoting}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 Using @code{function} instead of @code{quote} makes a difference
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 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
847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 (defun double-each (list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 (mapcar (function (lambda (x) (* 2 x))) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 @result{} double-each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 (double-each '(2 11))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 @result{} (4 22)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 If this definition of @code{double-each} is compiled, the anonymous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 function is compiled as well. By contrast, in the previous definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 where ordinary @code{quote} is used, the argument passed to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 @code{mapcar} is the precise list shown:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 (lambda (x) (* x 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 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
872 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
873 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
874 element is the symbol @code{*}! The advantage of @code{function} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 that it tells the compiler to go ahead and compile the constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 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 We sometimes write @code{function} instead of @code{quote} when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 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
880 comment.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 (function @var{symbol}) @equiv{} (quote @var{symbol}) @equiv{} '@var{symbol}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 See @code{documentation} in @ref{Accessing Documentation}, for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 realistic example using @code{function} and an anonymous function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 @node Function Cells
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 @section Accessing Function Cell Contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 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
893 function cell of the symbol. The functions described here access, test,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 and set the function cell of symbols.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 See also the function @code{indirect-function} in @ref{Function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 Indirection}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 @defun symbol-function symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 @kindex void-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 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
902 symbol's function cell is void, a @code{void-function} error is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 signaled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 This function does not check that the returned object is a legitimate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 (defun bar (n) (+ n 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 (symbol-function 'bar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 @result{} (lambda (n) (+ n 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 (fset 'baz 'bar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 (symbol-function 'baz)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 @result{} bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 @cindex void function cell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 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
930 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
931 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
932 as a function, it signals a @code{void-function} error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 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
935 @code{void}. The symbols @code{nil} and @code{void} are Lisp objects,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 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
937 (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
938 @code{defun}). A void function cell contains no object whatsoever.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 You can test the voidness of a symbol's function definition with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 @code{fboundp}. After you have given a symbol a function definition, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 can make it void once more using @code{fmakunbound}.
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 @defun fboundp symbol
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 434
diff changeset
945 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
946 function cell, @code{nil} otherwise. It does not check that the object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 is a legitimate function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 @defun fmakunbound symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 This function makes @var{symbol}'s function cell void, so that a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 subsequent attempt to access this cell will cause a @code{void-function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 error. (See also @code{makunbound}, in @ref{Local Variables}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 (defun foo (x) x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 @result{} x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 (foo 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 @result{}1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 (fmakunbound 'foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 @result{} x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 (foo 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 @error{} Symbol's function definition is void: foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 @defun fset symbol object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 This function stores @var{object} in the function cell of @var{symbol}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 The result is @var{object}. Normally @var{object} should be a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 or the name of a function, but this is not checked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 There are three normal uses of this function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 @itemize @bullet
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 Copying one symbol's function definition to another. (In other words,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 making an alternate name for a function.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 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
989 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
990 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
991 @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
992 @var{symbol2} presently has.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 In constructs for defining or altering functions. If @code{defun}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 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
997 @code{fset}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 Here are examples of the first two uses:
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 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 ;; @r{Give @code{first} the same definition @code{car} has.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 (fset 'first (symbol-function 'car))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 @result{} #<subr car>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 (first '(1 2 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 ;; @r{Make the symbol @code{car} the function definition of @code{xfirst}.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 (fset 'xfirst 'car)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 @result{} car
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 (xfirst '(1 2 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 @result{} 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 (symbol-function 'xfirst)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 @result{} car
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 (symbol-function (symbol-function 'xfirst))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 @result{} #<subr car>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 @end group
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 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 ;; @r{Define a named keyboard macro.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 (fset 'kill-two-lines "\^u2\^k")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 @result{} "\^u2\^k"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 See also the related functions @code{define-function} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 @code{defalias}, in @ref{Defining Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 When writing a function that extends a previously defined function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 the following idiom is sometimes used:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 (fset 'old-foo (symbol-function 'foo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 (defun foo ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 "Just like old-foo, except more so."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 (old-foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 (more-so))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 @end example
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 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 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
1057 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
1058 to define @code{old-foo} by loading a file. Since this presumably
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 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
1060 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
1061 file is loaded before moving aside the old definition of @code{foo}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 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
1064 redefine a function defined elsewhere.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 @node Inline Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 @section Inline Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 @cindex inline functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 @findex defsubst
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 You can define an @dfn{inline function} by using @code{defsubst} instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 of @code{defun}. An inline function works just like an ordinary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 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
1074 the function's definition is open-coded into the caller.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 Making a function inline makes explicit calls run faster. But it also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 has disadvantages. For one thing, it reduces flexibility; if you change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 the definition of the function, calls already inlined still use the old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 definition until you recompile them. Since the flexibility of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 redefining functions is an important feature of XEmacs, you should not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 make a function inline unless its speed is really crucial.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 Another disadvantage is that making a large function inline can increase
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 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
1085 advantage of inline functions is greatest for small functions, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 generally should not make large functions inline.
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 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
1089 inline function would execute. But the macro would have a limitation:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 you can use it only explicitly---a macro cannot be called with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 @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
1092 convert an ordinary function into a macro. (@xref{Macros}.) To convert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 it into an inline function is very easy; simply replace @code{defun}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 with @code{defsubst}. Since each argument of an inline function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 evaluated exactly once, you needn't worry about how many times the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 body uses the arguments, as you do for macros. (@xref{Argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 Evaluation}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 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
1100 following the definition, just like macros.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 @c Emacs versions prior to 19 did not have inline 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 @node Related Topics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 @section Other Topics Related to Functions
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 Here is a table of several functions that do things related to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 function calling and function definitions. They are documented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 elsewhere, but we provide cross references here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 @item apply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 See @ref{Calling Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 @item autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 See @ref{Autoload}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 @item call-interactively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 See @ref{Interactive Call}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 @item commandp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 See @ref{Interactive Call}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 @item documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 See @ref{Accessing Documentation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 @item eval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 See @ref{Eval}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 @item funcall
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 See @ref{Calling Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 @item ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 See @ref{Calling Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 @item indirect-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 See @ref{Function Indirection}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 @item interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 See @ref{Using Interactive}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 @item interactive-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 See @ref{Interactive Call}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 @item mapatoms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 See @ref{Creating Symbols}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 @item mapcar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 See @ref{Mapping Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 @item mapconcat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 See @ref{Mapping Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 @item undefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 See @ref{Key Lookup}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157