cl: Common Lisp Compatibility
Appendix B Common Lisp Compatibility
************************************
The following is a list of some of the most important incompatibilities
between this package and Common Lisp as documented in Steele (2nd
edition).
The word ‘cl-defun’ is required instead of ‘defun’ in order to use
extended Common Lisp argument lists in a function. Likewise,
‘cl-defmacro’ and ‘cl-function’ are versions of those forms which
understand full-featured argument lists. The ‘&whole’ keyword does not
work in ‘cl-defmacro’ argument lists (except inside recursive argument
lists).
The ‘equal’ predicate does not distinguish between IEEE
floating-point plus and minus zero. The ‘cl-equalp’ predicate has
several differences with Common Lisp; Predicates.
The ‘cl-do-all-symbols’ form is the same as ‘cl-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 ‘cl-do-all-symbols’ to locate any
but the default obarray.
The ‘cl-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 ‘cl-values’ or
‘cl-values-list’ is always used to return to a ‘cl-multiple-value-bind’
or other multiple-value receiver; if ‘cl-values’ is used without
‘cl-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 ‘cl--gensym-counter’ starts out with zero.
The ‘cl-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 ‘cl-check-type’ is treated differently.