This is Info file ../info/cl.info, produced by Makeinfo version 1.68 from the input file cl.texi. INFO-DIR-SECTION XEmacs Editor START-INFO-DIR-ENTRY * Common Lisp: (cl). GNU Emacs Common Lisp emulation package. END-INFO-DIR-ENTRY This file documents the GNU Emacs Common Lisp emulation package. Copyright (C) 1993 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled "GNU General Public License" is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled "GNU General Public License" may be included in a translation approved by the author instead of in the original English.  File: cl.info, Node: Top, Next: Overview, Up: (dir) Common Lisp Extensions ********************** This document describes a set of Emacs Lisp facilities borrowed from Common Lisp. All the facilities are described here in detail; for more discussion and examples, Guy L. Steele's `Common Lisp, the Language', second edition, is the definitive book on Common Lisp. While this document does not assume any prior knowledge of Common Lisp, it does assume a basic familiarity with Emacs Lisp. * Menu: * Overview:: Installation, usage, etc. * Program Structure:: Arglists, `eval-when', `defalias' * Predicates:: `typep', `eql', and `equalp' * Control Structure:: `setf', `when', `do', `loop', etc. * Macros:: Destructuring, `define-compiler-macro' * Declarations:: `proclaim', `declare', etc. * Symbols:: Property lists, `gensym' * Numbers:: Predicates, functions, random numbers * Sequences:: Mapping, functions, searching, sorting * Lists:: `cadr', `sublis', `member*', `assoc*', etc. * Hash Tables:: `make-hash-table', `gethash', etc. * Structures:: `defstruct' * Assertions:: `check-type', `assert', `ignore-errors'. * Efficiency Concerns:: Hints and techniques * Common Lisp Compatibility:: All known differences with Steele * Old CL Compatibility:: All known differences with old cl.el * Porting Common Lisp:: Hints for porting Common Lisp code * Function Index:: * Variable Index::  File: cl.info, Node: Overview, Next: Program Structure, Prev: Top, Up: Top Overview ******** Common Lisp is a huge language, and Common Lisp systems tend to be massive and extremely complex. Emacs Lisp, by contrast, is rather minimalist in the choice of Lisp features it offers the programmer. As Emacs Lisp programmers have grown in number, and the applications they write have grown more ambitious, it has become clear that Emacs Lisp could benefit from many of the conveniences of Common Lisp. The "CL" package adds a number of Common Lisp functions and control structures to Emacs Lisp. While not a 100% complete implementation of Common Lisp, "CL" adds enough functionality to make Emacs Lisp programming significantly more convenient. Some Common Lisp features have been omitted from this package for various reasons: * Some features are too complex or bulky relative to their benefit to Emacs Lisp programmers. CLOS and Common Lisp streams are fine examples of this group. * Other features cannot be implemented without modification to the Emacs Lisp interpreter itself, such as multiple return values, lexical scoping, case-insensitive symbols, and complex numbers. The "CL" package generally makes no attempt to emulate these features. * Some features conflict with existing things in Emacs Lisp. For example, Emacs' `assoc' function is incompatible with the Common Lisp `assoc'. In such cases, this package usually adds the suffix `*' to the function name of the Common Lisp version of the function (e.g., `assoc*'). The package described here was written by Dave Gillespie, `daveg@synaptics.com'. It is a total rewrite of the original 1986 `cl.el' package by Cesar Quiroz. Most features of the Quiroz package have been retained; any incompatibilities are noted in the descriptions below. Care has been taken in this version to ensure that each function is defined efficiently, concisely, and with minimal impact on the rest of the Emacs environment. * Menu: * Usage:: How to use the CL package * Organization:: The package's five component files * Installation:: Compiling and installing CL * Naming Conventions:: Notes on CL function names  File: cl.info, Node: Usage, Next: Organization, Prev: Overview, Up: Overview Usage ===== Lisp code that uses features from the "CL" package should include at the beginning: (require 'cl) If you want to ensure that the new (Gillespie) version of "CL" is the one that is present, add an additional `(require 'cl-19)' call: (require 'cl) (require 'cl-19) The second call will fail (with "`cl-19.el' not found") if the old `cl.el' package was in use. It is safe to arrange to load "CL" at all times, e.g., in your `.emacs' file. But it's a good idea, for portability, to `(require 'cl)' in your code even if you do this.  File: cl.info, Node: Organization, Next: Installation, Prev: Usage, Up: Overview Organization ============ The Common Lisp package is organized into four files: `cl.el' This is the "main" file, which contains basic functions and information about the package. This file is relatively compact--about 700 lines. `cl-extra.el' This file contains the larger, more complex or unusual functions. It is kept separate so that packages which only want to use Common Lisp fundamentals like the `cadr' function won't need to pay the overhead of loading the more advanced functions. `cl-seq.el' This file contains most of the advanced functions for operating on sequences or lists, such as `delete-if' and `assoc*'. `cl-macs.el' This file contains the features of the packages which are macros instead of functions. Macros expand when the caller is compiled, not when it is run, so the macros generally only need to be present when the byte-compiler is running (or when the macros are used in uncompiled code such as a `.emacs' file). Most of the macros of this package are isolated in `cl-macs.el' so that they won't take up memory unless you are compiling. The file `cl.el' includes all necessary `autoload' commands for the functions and macros in the other three files. All you have to do is `(require 'cl)', and `cl.el' will take care of pulling in the other files when they are needed. There is another file, `cl-compat.el', which defines some routines from the older `cl.el' package that are no longer present in the new package. This includes internal routines like `setelt' and `zip-lists', deprecated features like `defkeyword', and an emulation of the old-style multiple-values feature. *Note Old CL Compatibility::.  File: cl.info, Node: Installation, Next: Naming Conventions, Prev: Organization, Up: Overview Installation ============ Installation of the "CL" package is simple: Just put the byte-compiled files `cl.elc', `cl-extra.elc', `cl-seq.elc', `cl-macs.elc', and `cl-compat.elc' into a directory on your `load-path'. There are no special requirements to compile this package: The files do not have to be loaded before they are compiled, nor do they need to be compiled in any particular order. You may choose to put the files into your main `lisp/' directory, replacing the original `cl.el' file there. Or, you could put them into a directory that comes before `lisp/' on your `load-path' so that the old `cl.el' is effectively hidden. Also, format the `cl.texinfo' file and put the resulting Info files in the `info/' directory or another suitable place. You may instead wish to leave this package's components all in their own directory, and then add this directory to your `load-path' and (Emacs 19 only) `Info-directory-list'. Add the directory to the front of the list so the old "CL" package and its documentation are hidden.  File: cl.info, Node: Naming Conventions, Prev: Installation, Up: Overview Naming Conventions ================== Except where noted, all functions defined by this package have the same names and calling conventions as their Common Lisp counterparts. Following is a complete list of functions whose names were changed from Common Lisp, usually to avoid conflicts with Emacs. In each case, a `*' has been appended to the Common Lisp name to obtain the Emacs name: defun* defsubst* defmacro* function* member* assoc* rassoc* get* remove* delete* mapcar* sort* floor* ceiling* truncate* round* mod* rem* random* Internal function and variable names in the package are prefixed by `cl-'. Here is a complete list of functions *not* prefixed by `cl-' which were not taken from Common Lisp: member delete remove remq rassoc floatp-safe lexical-let lexical-let* callf callf2 letf letf* defsubst* defalias add-hook eval-when-compile (Most of these are Emacs 19 features provided to Emacs 18 users, or introduced, like `remq', for reasons of symmetry with similar features.) The following simple functions and macros are defined in `cl.el'; they do not cause other components like `cl-extra' to be loaded. eql floatp-safe abs endp evenp oddp plusp minusp last butlast nbutlast caar .. cddddr list* ldiff rest first .. tenth member [1] copy-list subst mapcar* [2] adjoin [3] acons pairlis when unless pop [4] push [4] pushnew [3,4] incf [4] decf [4] proclaim declaim add-hook [1] This is the Emacs 19-compatible function, not `member*'. [2] Only for one sequence argument or two list arguments. [3] Only if `:test' is `eq', `equal', or unspecified, and `:key' is not used. [4] Only when PLACE is a plain variable name.  File: cl.info, Node: Program Structure, Next: Predicates, Prev: Overview, Up: Top Program Structure ***************** This section describes features of the "CL" package which have to do with programs as a whole: advanced argument lists for functions, and the `eval-when' construct. * Menu: * Argument Lists:: `&key', `&aux', `defun*', `defmacro*'. * Time of Evaluation:: The `eval-when' construct. * Function Aliases:: The `defalias' function.  File: cl.info, Node: Argument Lists, Next: Time of Evaluation, Prev: Program Structure, Up: Program Structure Argument Lists ============== Emacs Lisp's notation for argument lists of functions is a subset of the Common Lisp notation. As well as the familiar `&optional' and `&rest' markers, Common Lisp allows you to specify default values for optional arguments, and it provides the additional markers `&key' and `&aux'. Since argument parsing is built-in to Emacs, there is no way for this package to implement Common Lisp argument lists seamlessly. Instead, this package defines alternates for several Lisp forms which you must use if you need Common Lisp argument lists. - Special Form: defun* NAME ARGLIST BODY... This form is identical to the regular `defun' form, except that ARGLIST is allowed to be a full Common Lisp argument list. Also, the function body is enclosed in an implicit block called NAME; *note Blocks and Exits::.. - Special Form: defsubst* NAME ARGLIST BODY... This is just like `defun*', except that the function that is defined is automatically proclaimed `inline', i.e., calls to it may be expanded into in-line code by the byte compiler. This is analogous to the `defsubst' form in Emacs 19; `defsubst*' uses a different method (compiler macros) which works in all version of Emacs, and also generates somewhat more efficient inline expansions. In particular, `defsubst*' arranges for the processing of keyword arguments, default values, etc., to be done at compile-time whenever possible. - Special Form: defmacro* NAME ARGLIST BODY... This is identical to the regular `defmacro' form, except that ARGLIST is allowed to be a full Common Lisp argument list. The `&environment' keyword is supported as described in Steele. The `&whole' keyword is supported only within destructured lists (see below); top-level `&whole' cannot be implemented with the current Emacs Lisp interpreter. The macro expander body is enclosed in an implicit block called NAME. - Special Form: function* SYMBOL-OR-LAMBDA This is identical to the regular `function' form, except that if the argument is a `lambda' form then that form may use a full Common Lisp argument list. Also, all forms (such as `defsetf' and `flet') defined in this package that include ARGLISTs in their syntax allow full Common Lisp argument lists. Note that it is *not* necessary to use `defun*' in order to have access to most "CL" features in your function. These features are always present; `defun*''s only difference from `defun' is its more flexible argument lists and its implicit block. The full form of a Common Lisp argument list is (VAR... &optional (VAR INITFORM SVAR)... &rest VAR &key ((KEYWORD VAR) INITFORM SVAR)... &aux (VAR INITFORM)...) Each of the five argument list sections is optional. The SVAR, INITFORM, and KEYWORD parts are optional; if they are omitted, then `(VAR)' may be written simply `VAR'. The first section consists of zero or more "required" arguments. These arguments must always be specified in a call to the function; there is no difference between Emacs Lisp and Common Lisp as far as required arguments are concerned. The second section consists of "optional" arguments. These arguments may be specified in the function call; if they are not, INITFORM specifies the default value used for the argument. (No INITFORM means to use `nil' as the default.) The INITFORM is evaluated with the bindings for the preceding arguments already established; `(a &optional (b (1+ a)))' matches one or two arguments, with the second argument defaulting to one plus the first argument. If the SVAR is specified, it is an auxiliary variable which is bound to `t' if the optional argument was specified, or to `nil' if the argument was omitted. If you don't use an SVAR, then there will be no way for your function to tell whether it was called with no argument, or with the default value passed explicitly as an argument. The third section consists of a single "rest" argument. If more arguments were passed to the function than are accounted for by the required and optional arguments, those extra arguments are collected into a list and bound to the "rest" argument variable. Common Lisp's `&rest' is equivalent to that of Emacs Lisp. Common Lisp accepts `&body' as a synonym for `&rest' in macro contexts; this package accepts it all the time. The fourth section consists of "keyword" arguments. These are optional arguments which are specified by name rather than positionally in the argument list. For example, (defun* foo (a &optional b &key c d (e 17))) defines a function which may be called with one, two, or more arguments. The first two arguments are bound to `a' and `b' in the usual way. The remaining arguments must be pairs of the form `:c', `:d', or `:e' followed by the value to be bound to the corresponding argument variable. (Symbols whose names begin with a colon are called "keywords", and they are self-quoting in the same way as `nil' and `t'.) For example, the call `(foo 1 2 :d 3 :c 4)' sets the five arguments to 1, 2, 4, 3, and 17, respectively. If the same keyword appears more than once in the function call, the first occurrence takes precedence over the later ones. Note that it is not possible to specify keyword arguments without specifying the optional argument `b' as well, since `(foo 1 :c 2)' would bind `b' to the keyword `:c', then signal an error because `2' is not a valid keyword. If a KEYWORD symbol is explicitly specified in the argument list as shown in the above diagram, then that keyword will be used instead of just the variable name prefixed with a colon. You can specify a KEYWORD symbol which does not begin with a colon at all, but such symbols will not be self-quoting; you will have to quote them explicitly with an apostrophe in the function call. Ordinarily it is an error to pass an unrecognized keyword to a function, e.g., `(foo 1 2 :c 3 :goober 4)'. You can ask Lisp to ignore unrecognized keywords, either by adding the marker `&allow-other-keys' after the keyword section of the argument list, or by specifying an `:allow-other-keys' argument in the call whose value is non-`nil'. If the function uses both `&rest' and `&key' at the same time, the "rest" argument is bound to the keyword list as it appears in the call. For example: (defun* find-thing (thing &rest rest &key need &allow-other-keys) (or (apply 'member* thing thing-list :allow-other-keys t rest) (if need (error "Thing not found")))) This function takes a `:need' keyword argument, but also accepts other keyword arguments which are passed on to the `member*' function. `allow-other-keys' is used to keep both `find-thing' and `member*' from complaining about each others' keywords in the arguments. As a (significant) performance optimization, this package implements the scan for keyword arguments by calling `memq' to search for keywords in a "rest" argument. Technically speaking, this is incorrect, since `memq' looks at the odd-numbered values as well as the even-numbered keywords. The net effect is that if you happen to pass a keyword symbol as the *value* of another keyword argument, where that keyword symbol happens to equal the name of a valid keyword argument of the same function, then the keyword parser will become confused. This minor bug can only affect you if you use keyword symbols as general-purpose data in your program; this practice is strongly discouraged in Emacs Lisp. The fifth section of the argument list consists of "auxiliary variables". These are not really arguments at all, but simply variables which are bound to `nil' or to the specified INITFORMS during execution of the function. There is no difference between the following two functions, except for a matter of stylistic taste: (defun* foo (a b &aux (c (+ a b)) d) BODY) (defun* foo (a b) (let ((c (+ a b)) d) BODY)) Argument lists support "destructuring". In Common Lisp, destructuring is only allowed with `defmacro'; this package allows it with `defun*' and other argument lists as well. In destructuring, any argument variable (VAR in the above diagram) can be replaced by a list of variables, or more generally, a recursive argument list. The corresponding argument value must be a list whose elements match this recursive argument list. For example: (defmacro* dolist ((var listform &optional resultform) &rest body) ...) This says that the first argument of `dolist' must be a list of two or three items; if there are other arguments as well as this list, they are stored in `body'. All features allowed in regular argument lists are allowed in these recursive argument lists. In addition, the clause `&whole VAR' is allowed at the front of a recursive argument list. It binds VAR to the whole list being matched; thus `(&whole all a b)' matches a list of two things, with `a' bound to the first thing, `b' bound to the second thing, and `all' bound to the list itself. (Common Lisp allows `&whole' in top-level `defmacro' argument lists as well, but Emacs Lisp does not support this usage.) One last feature of destructuring is that the argument list may be dotted, so that the argument list `(a b . c)' is functionally equivalent to `(a b &rest c)'. If the optimization quality `safety' is set to 0 (*note Declarations::.), error checking for wrong number of arguments and invalid keyword arguments is disabled. By default, argument lists are rigorously checked.  File: cl.info, Node: Time of Evaluation, Next: Function Aliases, Prev: Argument Lists, Up: Program Structure Time of Evaluation ================== Normally, the byte-compiler does not actually execute the forms in a file it compiles. For example, if a file contains `(setq foo t)', the act of compiling it will not actually set `foo' to `t'. This is true even if the `setq' was a top-level form (i.e., not enclosed in a `defun' or other form). Sometimes, though, you would like to have certain top-level forms evaluated at compile-time. For example, the compiler effectively evaluates `defmacro' forms at compile-time so that later parts of the file can refer to the macros that are defined. - Special Form: eval-when (SITUATIONS...) FORMS... This form controls when the body FORMS are evaluated. The SITUATIONS list may contain any set of the symbols `compile', `load', and `eval' (or their long-winded ANSI equivalents, `:compile-toplevel', `:load-toplevel', and `:execute'). The `eval-when' form is handled differently depending on whether or not it is being compiled as a top-level form. Specifically, it gets special treatment if it is being compiled by a command such as `byte-compile-file' which compiles files or buffers of code, and it appears either literally at the top level of the file or inside a top-level `progn'. For compiled top-level `eval-when's, the body FORMS are executed at compile-time if `compile' is in the SITUATIONS list, and the FORMS are written out to the file (to be executed at load-time) if `load' is in the SITUATIONS list. For non-compiled-top-level forms, only the `eval' situation is relevant. (This includes forms executed by the interpreter, forms compiled with `byte-compile' rather than `byte-compile-file', and non-top-level forms.) The `eval-when' acts like a `progn' if `eval' is specified, and like `nil' (ignoring the body FORMS) if not. The rules become more subtle when `eval-when's are nested; consult Steele (second edition) for the gruesome details (and some gruesome examples). Some simple examples: ;; Top-level forms in foo.el: (eval-when (compile) (setq foo1 'bar)) (eval-when (load) (setq foo2 'bar)) (eval-when (compile load) (setq foo3 'bar)) (eval-when (eval) (setq foo4 'bar)) (eval-when (eval compile) (setq foo5 'bar)) (eval-when (eval load) (setq foo6 'bar)) (eval-when (eval compile load) (setq foo7 'bar)) When `foo.el' is compiled, these variables will be set during the compilation itself: foo1 foo3 foo5 foo7 ; `compile' When `foo.elc' is loaded, these variables will be set: foo2 foo3 foo6 foo7 ; `load' And if `foo.el' is loaded uncompiled, these variables will be set: foo4 foo5 foo6 foo7 ; `eval' If these seven `eval-when's had been, say, inside a `defun', then the first three would have been equivalent to `nil' and the last four would have been equivalent to the corresponding `setq's. Note that `(eval-when (load eval) ...)' is equivalent to `(progn ...)' in all contexts. The compiler treats certain top-level forms, like `defmacro' (sort-of) and `require', as if they were wrapped in `(eval-when (compile load eval) ...)'. Emacs 19 includes two special forms related to `eval-when'. One of these, `eval-when-compile', is not quite equivalent to any `eval-when' construct and is described below. This package defines a version of `eval-when-compile' for the benefit of Emacs 18 users. The other form, `(eval-and-compile ...)', is exactly equivalent to `(eval-when (compile load eval) ...)' and so is not itself defined by this package. - Special Form: eval-when-compile FORMS... The FORMS are evaluated at compile-time; at execution time, this form acts like a quoted constant of the resulting value. Used at top-level, `eval-when-compile' is just like `eval-when (compile eval)'. In other contexts, `eval-when-compile' allows code to be evaluated once at compile-time for efficiency or other reasons. This form is similar to the `#.' syntax of true Common Lisp. - Special Form: load-time-value FORM The FORM is evaluated at load-time; at execution time, this form acts like a quoted constant of the resulting value. Early Common Lisp had a `#,' syntax that was similar to this, but ANSI Common Lisp replaced it with `load-time-value' and gave it more well-defined semantics. In a compiled file, `load-time-value' arranges for FORM to be evaluated when the `.elc' file is loaded and then used as if it were a quoted constant. In code compiled by `byte-compile' rather than `byte-compile-file', the effect is identical to `eval-when-compile'. In uncompiled code, both `eval-when-compile' and `load-time-value' act exactly like `progn'. (defun report () (insert "This function was executed on: " (current-time-string) ", compiled on: " (eval-when-compile (current-time-string)) ;; or '#.(current-time-string) in real Common Lisp ", and loaded on: " (load-time-value (current-time-string)))) Byte-compiled, the above defun will result in the following code (or its compiled equivalent, of course) in the `.elc' file: (setq --temp-- (current-time-string)) (defun report () (insert "This function was executed on: " (current-time-string) ", compiled on: " '"Wed Jun 23 18:33:43 1993" ", and loaded on: " --temp--))  File: cl.info, Node: Function Aliases, Prev: Time of Evaluation, Up: Program Structure Function Aliases ================ This section describes a feature from GNU Emacs 19 which this package makes available in other versions of Emacs. - Function: defalias SYMBOL FUNCTION This function sets SYMBOL's function cell to FUNCTION. It is equivalent to `fset', except that in GNU Emacs 19 it also records the setting in `load-history' so that it can be undone by a later `unload-feature'. In other versions of Emacs, `defalias' is a synonym for `fset'.  File: cl.info, Node: Predicates, Next: Control Structure, Prev: Program Structure, Up: Top Predicates ********** This section describes functions for testing whether various facts are true or false. * Menu: * Type Predicates:: `typep', `deftype', and `coerce' * Equality Predicates:: `eql' and `equalp'  File: cl.info, Node: Type Predicates, Next: Equality Predicates, Prev: Predicates, Up: Predicates Type Predicates =============== The "CL" package defines a version of the Common Lisp `typep' predicate. - Function: typep OBJECT TYPE Check if OBJECT is of type TYPE, where TYPE is a (quoted) type name of the sort used by Common Lisp. For example, `(typep foo 'integer)' is equivalent to `(integerp foo)'. The TYPE argument to the above function is either a symbol or a list beginning with a symbol. * If the type name is a symbol, Emacs appends `-p' to the symbol name to form the name of a predicate function for testing the type. (Built-in predicates whose names end in `p' rather than `-p' are used when appropriate.) * The type symbol `t' stands for the union of all types. `(typep OBJECT t)' is always true. Likewise, the type symbol `nil' stands for nothing at all, and `(typep OBJECT nil)' is always false. * The type symbol `null' represents the symbol `nil'. Thus `(typep OBJECT 'null)' is equivalent to `(null OBJECT)'. * The type symbol `real' is a synonym for `number', and `fixnum' is a synonym for `integer'. * The type symbols `character' and `string-char' match characters. In Emacs-19 and XEmacs-19, characters are the same thing as integers in the range 0-255. In XEmacs-20, where characters are a first-class data type, this checks for actual characters, and `(typep 8BIT-INTEGER 'character)' will return `nil'. * The type symbol `float' uses the `floatp-safe' predicate defined by this package rather than `floatp', so it will work correctly even in Emacs versions without floating-point support. * The type list `(integer LOW HIGH)' represents all integers between LOW and HIGH, inclusive. Either bound may be a list of a single integer to specify an exclusive limit, or a `*' to specify no limit. The type `(integer * *)' is thus equivalent to `integer'. * Likewise, lists beginning with `float', `real', or `number' represent numbers of that type falling in a particular range. * Lists beginning with `and', `or', and `not' form combinations of types. For example, `(or integer (float 0 *))' represents all objects that are integers or non-negative floats. * Lists beginning with `member' or `member*' represent objects `eql' to any of the following values. For example, `(member 1 2 3 4)' is equivalent to `(integer 1 4)', and `(member nil)' is equivalent to `null'. * Lists of the form `(satisfies PREDICATE)' represent all objects for which PREDICATE returns true when called with that object as an argument. The following function and macro (not technically predicates) are related to `typep'. - Function: coerce OBJECT TYPE This function attempts to convert OBJECT to the specified TYPE. If OBJECT is already of that type as determined by `typep', it is simply returned. Otherwise, certain types of conversions will be made: If TYPE is any sequence type (`string', `list', etc.) then OBJECT will be converted to that type if possible. If TYPE is `character', then strings of length one and symbols with one-character names can be coerced. If TYPE is `float', then integers can be coerced in versions of Emacs that support floats. In all other circumstances, `coerce' signals an error. - Special Form: deftype NAME ARGLIST FORMS... This macro defines a new type called NAME. It is similar to `defmacro' in many ways; when NAME is encountered as a type name, the body FORMS are evaluated and should return a type specifier that is equivalent to the type. The ARGLIST is a Common Lisp argument list of the sort accepted by `defmacro*'. The type specifier `(NAME ARGS...)' is expanded by calling the expander with those arguments; the type symbol `NAME' is expanded by calling the expander with no arguments. The ARGLIST is processed the same as for `defmacro*' except that optional arguments without explicit defaults use `*' instead of `nil' as the "default" default. Some examples: (deftype null () '(satisfies null)) ; predefined (deftype list () '(or null cons)) ; predefined (deftype unsigned-byte (&optional bits) (list 'integer 0 (if (eq bits '*) bits (1- (lsh 1 bits))))) (unsigned-byte 8) == (integer 0 255) (unsigned-byte) == (integer 0 *) unsigned-byte == (integer 0 *) The last example shows how the Common Lisp `unsigned-byte' type specifier could be implemented if desired; this package does not implement `unsigned-byte' by default. The `typecase' and `check-type' macros also use type names. *Note Conditionals::. *Note Assertions::. The `map', `concatenate', and `merge' functions take type-name arguments to specify the type of sequence to return. *Note Sequences::.  File: cl.info, Node: Equality Predicates, Prev: Type Predicates, Up: Predicates Equality Predicates =================== This package defines two Common Lisp predicates, `eql' and `equalp'. - Function: eql A B This function is almost the same as `eq', except that if A and B are numbers of the same type, it compares them for numeric equality (as if by `equal' instead of `eq'). This makes a difference only for versions of Emacs that are compiled with floating-point support, such as Emacs 19. Emacs floats are allocated objects just like cons cells, which means that `(eq 3.0 3.0)' will not necessarily be true--if the two `3.0's were allocated separately, the pointers will be different even though the numbers are the same. But `(eql 3.0 3.0)' will always be true. The types of the arguments must match, so `(eql 3 3.0)' is still false. Note that Emacs integers are "direct" rather than allocated, which basically means `(eq 3 3)' will always be true. Thus `eq' and `eql' behave differently only if floating-point numbers are involved, and are indistinguishable on Emacs versions that don't support floats. There is a slight inconsistency with Common Lisp in the treatment of positive and negative zeros. Some machines, notably those with IEEE standard arithmetic, represent `+0' and `-0' as distinct values. Normally this doesn't matter because the standard specifies that `(= 0.0 -0.0)' should always be true, and this is indeed what Emacs Lisp and Common Lisp do. But the Common Lisp standard states that `(eql 0.0 -0.0)' and `(equal 0.0 -0.0)' should be false on IEEE-like machines; Emacs Lisp does not do this, and in fact the only known way to distinguish between the two zeros in Emacs Lisp is to `format' them and check for a minus sign. - Function: equalp A B This function is a more flexible version of `equal'. In particular, it compares strings and characters case-insensitively, and it compares numbers without regard to type (so that `(equalp 3 3.0)' is true). Vectors and conses are compared recursively. All other objects are compared as if by `equal'. This function differs from Common Lisp `equalp' in several respects. In keeping with the idea that strings are less vector-like in Emacs Lisp, this package's `equalp' also will not compare strings against vectors of integers. Also note that the Common Lisp functions `member' and `assoc' use `eql' to compare elements, whereas Emacs Lisp follows the MacLisp tradition and uses `equal' for these two functions. In Emacs, use `member*' and `assoc*' to get functions which use `eql' for comparisons.  File: cl.info, Node: Control Structure, Next: Macros, Prev: Predicates, Up: Top Control Structure ***************** The features described in the following sections implement various advanced control structures, including the powerful `setf' facility and a number of looping and conditional constructs. * Menu: * Assignment:: The `psetq' form * Generalized Variables:: `setf', `incf', `push', etc. * Variable Bindings:: `progv', `lexical-let', `flet', `macrolet' * Conditionals:: `when', `unless', `case', `typecase' * Blocks and Exits:: `block', `return', `return-from' * Iteration:: `do', `dotimes', `dolist', `do-symbols' * Loop Facility:: The Common Lisp `loop' macro * Multiple Values:: `values', `multiple-value-bind', etc.  File: cl.info, Node: Assignment, Next: Generalized Variables, Prev: Control Structure, Up: Control Structure Assignment ========== The `psetq' form is just like `setq', except that multiple assignments are done in parallel rather than sequentially. - Special Form: psetq [SYMBOL FORM]... This special form (actually a macro) is used to assign to several variables simultaneously. Given only one SYMBOL and FORM, it has the same effect as `setq'. Given several SYMBOL and FORM pairs, it evaluates all the FORMs in advance and then stores the corresponding variables afterwards. (setq x 2 y 3) (setq x (+ x y) y (* x y)) x => 5 y ; `y' was computed after `x' was set. => 15 (setq x 2 y 3) (psetq x (+ x y) y (* x y)) x => 5 y ; `y' was computed before `x' was set. => 6 The simplest use of `psetq' is `(psetq x y y x)', which exchanges the values of two variables. (The `rotatef' form provides an even more convenient way to swap two variables; *note Modify Macros::..) `psetq' always returns `nil'.  File: cl.info, Node: Generalized Variables, Next: Variable Bindings, Prev: Assignment, Up: Control Structure Generalized Variables ===================== A "generalized variable" or "place form" is one of the many places in Lisp memory where values can be stored. The simplest place form is a regular Lisp variable. But the cars and cdrs of lists, elements of arrays, properties of symbols, and many other locations are also places where Lisp values are stored. The `setf' form is like `setq', except that it accepts arbitrary place forms on the left side rather than just symbols. For example, `(setf (car a) b)' sets the car of `a' to `b', doing the same operation as `(setcar a b)' but without having to remember two separate functions for setting and accessing every type of place. Generalized variables are analogous to "lvalues" in the C language, where `x = a[i]' gets an element from an array and `a[i] = x' stores an element using the same notation. Just as certain forms like `a[i]' can be lvalues in C, there is a set of forms that can be generalized variables in Lisp. * Menu: * Basic Setf:: `setf' and place forms * Modify Macros:: `incf', `push', `rotatef', `letf', `callf', etc. * Customizing Setf:: `define-modify-macro', `defsetf', `define-setf-method'  File: cl.info, Node: Basic Setf, Next: Modify Macros, Prev: Generalized Variables, Up: Generalized Variables Basic Setf ---------- The `setf' macro is the most basic way to operate on generalized variables. - Special Form: setf [PLACE FORM]... This macro evaluates FORM and stores it in PLACE, which must be a valid generalized variable form. If there are several PLACE and FORM pairs, the assignments are done sequentially just as with `setq'. `setf' returns the value of the last FORM. The following Lisp forms will work as generalized variables, and so may legally appear in the PLACE argument of `setf': * A symbol naming a variable. In other words, `(setf x y)' is exactly equivalent to `(setq x y)', and `setq' itself is strictly speaking redundant now that `setf' exists. Many programmers continue to prefer `setq' for setting simple variables, though, purely for stylistic or historical reasons. The macro `(setf x y)' actually expands to `(setq x y)', so there is no performance penalty for using it in compiled code. * A call to any of the following Lisp functions: car cdr caar .. cddddr nth rest first .. tenth aref elt nthcdr symbol-function symbol-value symbol-plist get get* getf gethash subseq Note that for `nthcdr' and `getf', the list argument of the function must itself be a valid PLACE form. For example, `(setf (nthcdr 0 foo) 7)' will set `foo' itself to 7. Note that `push' and `pop' on an `nthcdr' place can be used to insert or delete at any position in a list. The use of `nthcdr' as a PLACE form is an extension to standard Common Lisp. * The following Emacs-specific functions are also `setf'-able. (Some of these are defined only in Emacs 19 or only in XEmacs.) buffer-file-name marker-position buffer-modified-p match-data buffer-name mouse-position buffer-string overlay-end buffer-substring overlay-get current-buffer overlay-start current-case-table point current-column point-marker current-global-map point-max current-input-mode point-min current-local-map process-buffer current-window-configuration process-filter default-file-modes process-sentinel default-value read-mouse-position documentation-property screen-height extent-data screen-menubar extent-end-position screen-width extent-start-position selected-window face-background selected-screen face-background-pixmap selected-frame face-font standard-case-table face-foreground syntax-table face-underline-p window-buffer file-modes window-dedicated-p frame-height window-display-table frame-parameters window-height frame-visible-p window-hscroll frame-width window-point get-register window-start getenv window-width global-key-binding x-get-cut-buffer keymap-parent x-get-cutbuffer local-key-binding x-get-secondary-selection mark x-get-selection mark-marker Most of these have directly corresponding "set" functions, like `use-local-map' for `current-local-map', or `goto-char' for `point'. A few, like `point-min', expand to longer sequences of code when they are `setf''d (`(narrow-to-region x (point-max))' in this case). * A call of the form `(substring SUBPLACE N [M])', where SUBPLACE is itself a legal generalized variable whose current value is a string, and where the value stored is also a string. The new string is spliced into the specified part of the destination string. For example: (setq a (list "hello" "world")) => ("hello" "world") (cadr a) => "world" (substring (cadr a) 2 4) => "rl" (setf (substring (cadr a) 2 4) "o") => "o" (cadr a) => "wood" a => ("hello" "wood") The generalized variable `buffer-substring', listed above, also works in this way by replacing a portion of the current buffer. * A call of the form `(apply 'FUNC ...)' or `(apply (function FUNC) ...)', where FUNC is a `setf'-able function whose store function is "suitable" in the sense described in Steele's book; since none of the standard Emacs place functions are suitable in this sense, this feature is only interesting when used with places you define yourself with `define-setf-method' or the long form of `defsetf'. * A macro call, in which case the macro is expanded and `setf' is applied to the resulting form. * Any form for which a `defsetf' or `define-setf-method' has been made. Using any forms other than these in the PLACE argument to `setf' will signal an error. The `setf' macro takes care to evaluate all subforms in the proper left-to-right order; for example, (setf (aref vec (incf i)) i) looks like it will evaluate `(incf i)' exactly once, before the following access to `i'; the `setf' expander will insert temporary variables as necessary to ensure that it does in fact work this way no matter what setf-method is defined for `aref'. (In this case, `aset' would be used and no such steps would be necessary since `aset' takes its arguments in a convenient order.) However, if the PLACE form is a macro which explicitly evaluates its arguments in an unusual order, this unusual order will be preserved. Adapting an example from Steele, given (defmacro wrong-order (x y) (list 'aref y x)) the form `(setf (wrong-order A B) 17)' will evaluate B first, then A, just as in an actual call to `wrong-order'.