Next: , Previous: , Up: Top   [Contents][Index]

Appendix B Common Lisp Compatibility

Following is a list of all known incompatibilities between this package and Common Lisp as documented in Steele (2nd edition).

Certain function names, such as member, assoc, and floor, were already taken by (incompatible) Emacs Lisp functions; this package appends ‘*’ to the names of its Common Lisp versions of these functions.

The word defun* is required instead of defun in order to use extended Common Lisp argument lists in a function. Likewise, defmacro* and function* are versions of those forms which understand full-featured argument lists. The &whole keyword does not work in defmacro argument lists (except inside recursive argument lists).

In order to allow an efficient implementation, keyword arguments use a slightly cheesy parser which may be confused if a keyword symbol is passed as the value of another keyword argument. (Specifically, (memq :keyword rest-of-arguments) is used to scan for :keyword among the supplied keyword arguments.)

The eql and equal predicates do not distinguish between IEEE floating-point plus and minus zero. The equalp predicate has several differences with Common Lisp; see Predicates.

The setf mechanism is entirely compatible, except that setf-methods return a list of five values rather than five values directly. Also, the new “setf function” concept (typified by (defun (setf foo) …)) is not implemented.

The do-all-symbols form is the same as do-symbols with no obarray argument. In Common Lisp, this form would iterate over all symbols in all packages. Since Emacs obarrays are not a first-class package mechanism, there is no way for do-all-symbols to locate any but the default obarray.

The loop macro is complete except that loop-finish and type specifiers are unimplemented.

The multiple-value return facility treats lists as multiple values, since Emacs Lisp cannot support multiple return values directly. The macros will be compatible with Common Lisp if values or values-list is always used to return to a multiple-value-bind or other multiple-value receiver; if values is used without multiple-value-… or vice-versa the effect will be different from Common Lisp.

Many Common Lisp declarations are ignored, and others match the Common Lisp standard in concept but not in detail. For example, local special declarations, which are purely advisory in Emacs Lisp, do not rigorously obey the scoping rules set down in Steele’s book.

The variable *gensym-counter* starts out with a pseudo-random value rather than with zero. This is to cope with the fact that generated symbols become interned when they are written to and loaded back from a file.

The defstruct facility is compatible, except that structures are of type :type vector :named by default rather than some special, distinct type. Also, the :type slot option is ignored.

The second argument of check-type is treated differently.

Next: , Previous: , Up: Top   [Contents][Index]