Annotation of 43BSDReno/contrib/emacs-18.55/man/cl.texinfo, revision 1.1

1.1     ! root        1: \input texinfo    @c -*-texinfo-*-
        !             2: @setfilename ../info/cl
        !             3: @settitle Common Lisp Extensions
        !             4: 
        !             5: @iftex
        !             6: @finalout
        !             7: @end iftex
        !             8: 
        !             9: Copyright (C) 1987 Cesar Quiroz
        !            10: 
        !            11: @node Top, Generalities,,(DIR)
        !            12: @chapter Common Lisp Extensions
        !            13: 
        !            14: The routines described in this chapter provide some of the functionality of
        !            15: Common Lisp inside Emacs Lisp.
        !            16: 
        !            17: @menu
        !            18: * gen: Generalities.           Things you need to know.
        !            19: * sym: Symbols.                Gensym, gentemp, keyword-p, @dots{}
        !            20: * lis: Lists.                  List*, pairlis, acons, @dots{}
        !            21: * seq: Sequences.              Every, any, notevery, notany, @dots{}
        !            22: * con: Conditionals.           When, unless, case, ecase.
        !            23: * ite: Iterations.             Do, do*, dolist, dotimes, @dots{}
        !            24: * mul: Multiple Values.        Values, values-list, @dots{}
        !            25: * ari: Integer Arithmetic.     Floor, ceiling, round, truncate, @dots{}
        !            26: * stf: Generalized Variables.  Setf and friends.
        !            27: * str: Structures.             Like Pascal records or C structs.
        !            28: * mis: Miscellanea.            Odds and ends that didn't fit elsewhere.
        !            29: * tod: To Do.                  Suggestions for future hackery.
        !            30: @end menu
        !            31: 
        !            32: @node Generalities, Symbols, Top, Top
        !            33: @section Generalities
        !            34: 
        !            35: This section tells you want you need to know about the routines in the file
        !            36: @file{cl.el}, so that you can use them.  The distribution also includes
        !            37: this documentation and perhaps a few example files.
        !            38: 
        !            39: @subsection License, Availability, Maintenance
        !            40: 
        !            41: These files are covered by the GNU Emacs General Public License (if you
        !            42: don't know its terms, try @kbd{@key{C-h} @key{C-c}}) and the statement of
        !            43: no warranty (again, you can type @kbd{@key{C-h} @key{C-w}} if you don't
        !            44: know its terms) also applies to them. @refill
        !            45: 
        !            46: I, Cesar Quiroz, the original author of the software described here, will
        !            47: appreciate hearing about bug reports (and fixes), suggestions and comments,
        !            48: applying both to the code and to this documentation.  I don't promise to
        !            49: act on those communications, but whenever they might conduce to
        !            50: improvements of this software, I will make those improvements available to
        !            51: the general community through the Free Software Foundation.  You can reach
        !            52: me at the following net addresses:
        !            53: @quotation
        !            54: quiroz@@seneca.cs.rochester.edu
        !            55: quiroz@@rochester.arpa
        !            56: @{allegra | seismo | @dots{} @} ! rochester ! quiroz
        !            57: CSNET: Cesar Quiroz at node Rochester
        !            58: @end quotation
        !            59: 
        !            60: @subsection Purpose and Limitations
        !            61: 
        !            62: These routines were written with two purposes in mind:
        !            63: 
        !            64: @enumerate
        !            65: @item
        !            66: To make programming in Emacs Lisp even more compatible with Common Lisp.
        !            67: Indeed, my original motivation was to have a @code{do} macro.
        !            68: @item
        !            69: To facilitate to novice Lisp programmers a chance to practice with
        !            70: features commonly found only in expensive implementations of Lisp. 
        !            71: @end enumerate
        !            72: 
        !            73: In order to satisfy these purposes, the routines were written in such a way
        !            74: that it is practical to use them inside Emacs: no effort was given to
        !            75: implement features that could slow down the host Emacs unnecessarily nor
        !            76: require recoding of the Emacs Lisp interpreter.
        !            77: 
        !            78: For instance, no support is given to floating point arithmetic.
        !            79: 
        !            80: So, I have tried to implement a subset of the functionality of Common Lisp.
        !            81: Whatever is implemented, has syntactic and semantic properties like the
        !            82: equally named features of Common Lisp, but not all the relevant features
        !            83: have been implemented (@pxref{To Do}, for some suggestions).  When
        !            84: deciding what to include, I have tried to strike a balance between these
        !            85: constraints:
        !            86: 
        !            87: @enumerate
        !            88: @item
        !            89: Keep it simple, I didn't want to spend much time in this idea.
        !            90: @item
        !            91: Keep it compatible with Common Lisp.
        !            92: @item
        !            93: Keep it flexible, so my code doesn't oppose a better implementation (when
        !            94: this looked hard, I just didn't implement the feature).
        !            95: @item
        !            96: Keep an eye on the intended use of Emacs Lisp: to support an advanced
        !            97: editor.  I don't expect that more arithmetic support will be as conducive
        !            98: to this goal as having better iterations and conditionals will.
        !            99: @end enumerate
        !           100: 
        !           101: For background, the reference is ``Common Lisp: The Language'' by Guy
        !           102: Steele Jr. (Digital Press, 1984).  For all the features described here
        !           103: you can assume that the intent has been to provide the syntax and
        !           104: semantics of the features of like name in the book.  For the most part,
        !           105: this documentation will concentrate on how my routines @i{fail} to
        !           106: implement Common Lisp faithfully.
        !           107: 
        !           108: @subsubsection Specific Limitations
        !           109: 
        !           110: Emacs Lisp and Common Lisp differ enough to make some of the emulation
        !           111: difficult, expensive or nearly impractical.  Some specific limitations are
        !           112: stated here:
        !           113: 
        !           114: @enumerate
        !           115: @item
        !           116: Common Lisp is lexically scoped (mostly), while Emacs Lisp is dynamically
        !           117: scoped.  Things like @code{block}, @code{return}, @code{tagbody} are then
        !           118: practically impossible to imitate correctly (in principle, rewriting
        !           119: @code{eval}, @code{apply} and a couple of other functions would suffice,
        !           120: problem is that such rewriting amounts to  a new interpreter on top
        !           121: of the old.)  Things like @samp{implicit-blocks},
        !           122: @samp{implicit-tagbodies} and the like have not been implemented at all.
        !           123: Where they are needed, the most you can assume is that I tried to put
        !           124: @samp{implicit-progns} around places where it made sense. @refill
        !           125: 
        !           126: @item
        !           127: Emacs Lisp's @code{lambda} does not support all the possible argument
        !           128: markers.  Similarly, @code{defmacro} doesn't support automatic
        !           129: destructuring of the calls.  An approximation to a keyword-based calling
        !           130: style was implemented, mainly for the sake of @code{defstruct}, but is
        !           131: not general enough.  @refill
        !           132: 
        !           133: @item
        !           134: Emacs Lisp supports arithmetic only on integers.
        !           135: 
        !           136: @item
        !           137: Emacs Lisp doesn't support many of the basic types of Common Lisp.  In
        !           138: particular, there are no arrays beyond vectors and strings (although these
        !           139: ones are compatible), characters are essentially small
        !           140: integers, etc. @refill
        !           141: 
        !           142: @item
        !           143: There are no declarations in Emacs Lisp (in the sense of Common Lisp's
        !           144: @code{declare}, @code{proclaim}, @dots{}) nor there is a explicit lattice
        !           145: of types.  These limitations could be effectively overcome from Lisp code
        !           146: (to a extent), but I don't see them as a very pressing need, if a need at
        !           147: all in Emacs Lisp.  @code{defstruct} can be used to generate new types
        !           148: that can be recognized at runtime. @refill
        !           149: 
        !           150: @item
        !           151: The Emacs Lisp reader is not programmable.  The syntax it accepts is
        !           152: almost standard, but it preempts '?' as a dispatching macro of sorts.
        !           153: The @code{format} function is incompatible with Common Lisp.  There
        !           154: isn't a `quasi-constant' notation (the usual @code{backquote} of Common
        !           155: Lisp).  None of these differences causes any problems when writing Emacs
        !           156: Lisp (although the lack of backquoting is felt sorely), but they oppose
        !           157: a Common Lisp emulation. @refill
        !           158: 
        !           159: @end enumerate
        !           160: 
        !           161: @subsection Loading and Compiling
        !           162: 
        !           163: The file @file{cl.el} provides the @samp{cl} feature, you can use this to
        !           164: test whether these routines have been loaded, or to load them from your
        !           165: code (by means of @code{(require 'cl)}).  The compiled file is a little
        !           166: larger than 50K bytes.
        !           167: 
        !           168: If you need to recompile the sources, make sure you load them first on the
        !           169: Emacs that will do the recompilation.  This is because many syntactic
        !           170: characteristics (like the special forms) have been implemented as macros
        !           171: and you need to make sure that macros are known to the compiler before they
        !           172: are used.
        !           173: 
        !           174: These extensions work correctly when interpreted in a GNU Emacs of
        !           175: version 17.64 or beyond.  Compiling them requires a more recent byte
        !           176: compiler, preferably one strictly younger than version 18.XX.
        !           177: 
        !           178: @subsection On Line Help
        !           179: 
        !           180: The routines in this file have documentation strings, so you can (and
        !           181: should) consult them for the exact syntax allowed.  That information is
        !           182: not repeated in this manual.  Some of the routines are also documented
        !           183: explicitly in the Common Lisp reference, their doc-strings begin with
        !           184: @samp{[cl]} to represent this fact.
        !           185: 
        !           186: The rest (those without the @samp{[cl]} mark) are auxiliary functions or
        !           187: macros used by the rest of the implementation.  They are not constrained
        !           188: by any standard and are advertised only in as much as they can be useful
        !           189: in other applications. @refill
        !           190: 
        !           191: Each of the following sections contains a subsection called `Features
        !           192: Provided'.  It lists briefly the user-visible features of this
        !           193: implementation.  In its entries, names by themselves refer to functions.
        !           194: Macros and variables are identified by a `MACRO' or a `VARIABLE' ahead
        !           195: of their names.
        !           196: 
        !           197: @node Symbols, Lists, Generalities, Top
        !           198: @section Symbols
        !           199: 
        !           200: The most important omission is that of a @var{packages} mechanism.
        !           201: (For a possible implementation, @pxref{To Do})  Whenever a Common Lisp
        !           202: function expects a package, I have substituted an obarray.  There is a
        !           203: hack to have pseudo-keywords, see below. @refill
        !           204: 
        !           205: There are two other notorious omissions over which I haven't lost any
        !           206: sleep.  The first is the lack of a @code{remprop} function, which could be
        !           207: easily provided if needed.  The second is the lack of ways to modify the
        !           208: print name of a symbol.  This one would probably be good only to
        !           209: introduce strange bugs, so I don't miss it. @refill
        !           210: 
        !           211: @subsection Features Provided
        !           212: 
        !           213: @table @code
        !           214: @item VARIABLE *gensym-index*
        !           215: @itemx VARIABLE *gensym-prefix*
        !           216: @itemx VARIABLE *gentemp-index*
        !           217: @itemx VARIABLE *gentemp-prefix*
        !           218: These variables are used to keep the state of the generator of new names.
        !           219: Better leave them alone.
        !           220: @item gensym
        !           221: @itemx gentemp
        !           222: These do the same as the Common Lisp names of like names.
        !           223: @item MACRO defkeyword 
        !           224: @itemx keyword-of
        !           225: @item keywordp
        !           226: These provide the pseudo-keywords implementation.
        !           227: @end table
        !           228: 
        !           229: @subsection Keywords
        !           230: 
        !           231: The lack of packages makes it difficult to implement keywords correctly.
        !           232: I have provided a macro @code{defkeyword} that takes a symbol and makes
        !           233: sure it evaluates to itself.  (So, it is like @code{defconst}.)  If your
        !           234: programs ever need keywords, put a bunch of calls to @code{defkeyword} at
        !           235: the beginning of your code, so when loaded they will be in effect. @refill
        !           236: 
        !           237: The (standard) predicate @code{keywordp} tests to see if the given
        !           238: symbol's name begins with a colon and then ensures that it evaluates to
        !           239: itself. @refill
        !           240: 
        !           241: The function @code{keyword-of} takes a symbol and returns a keyword of
        !           242: like name. @refill
        !           243: 
        !           244: @example
        !           245:  (keyword-of 'foo)
        !           246: :foo
        !           247:  (keyword-of ':bar)
        !           248: :bar
        !           249: @end example
        !           250: 
        !           251: This feature was added mainly to support @code{defstruct} and the tests of
        !           252: the sequence functions.  It is fragile and easy to fool.
        !           253: 
        !           254: @subsection New Symbols
        !           255: 
        !           256: A common need (especially when writing macros) is to be able to invent new
        !           257: names for things.  I provide the @code{gensym} and @code{gentemp}
        !           258: functions.  The global state needed is kept in the variables
        !           259: @code{*gentemp-index*}, @code{*gentemp-prefix*}, @code{*gensym-index*} and
        !           260: @code{*gensym-prefix*}.  Changing them, especially the index ones, is a
        !           261: very bad idea.  I am not providing the Common Lisp default prefixes ('G'
        !           262: for @code{gensym} and 'T' for @code{gentemp}) because of debugging
        !           263: paranoia.  My default prefixes are harder to come by when giving sane
        !           264: names to things. @refill
        !           265: 
        !           266: @node Lists, Sequences, Symbols, Top
        !           267: @section Lists
        !           268: 
        !           269: Lists (indeed, conses) are so deeply involved in Lisp that there seems
        !           270: to be little need to justify improving the list handling of a Lisp.
        !           271: 
        !           272: Common Lisp, however, is a rather huge Lisp.  I haven't provided all the
        !           273: functions in the chapter of lists, mainly because some of them could be
        !           274: implemented correctly only if keyword arguments were supported.
        !           275: That explains why I haven't rushed to provide
        !           276: @code{subst}, @code{sublis}, etc.  Also, that explains the rather
        !           277: temporary nature of the implementation of @code{member} and
        !           278: @code{adjoin}.  I will welcome any efforts to extend
        !           279: this work. @refill
        !           280: 
        !           281: @subsection Features Provided
        !           282: 
        !           283: @table @code
        !           284: @item endp
        !           285: @itemx list*
        !           286: @itemx list-length
        !           287: Very standard utilities.  List* has proven especially useful to
        !           288: overcome the lack of a real @code{backquote}.  In addition, things that
        !           289: usually required the relatively clumsy
        !           290: @example
        !           291: (cons 'a (cons 'b oldlist))
        !           292: (append (list a b) oldlist)
        !           293: @end example
        !           294: can now be simply put:
        !           295: @example
        !           296: (list* 'a 'b oldlist)
        !           297: @end example
        !           298: See also @code{acons}.
        !           299: 
        !           300: @item member
        !           301: Another well known function.  Supports test with @code{eql} only.
        !           302: 
        !           303: @item acons
        !           304: @itemx pairlis
        !           305: These two are part of the standards association lists implementation.  I
        !           306: am leaving @code{sublis} as an exercise for the reader.
        !           307: 
        !           308: @item adjoin
        !           309: Done mainly for the sake of @code{pushnew}.
        !           310: 
        !           311: @item butlast
        !           312: @itemx last
        !           313: @itemx ldiff
        !           314: Occasionally useful ways to access the last cons or a specified tail of
        !           315: a list.  I don't remember why there isn't a @code{tailp} here.
        !           316: 
        !           317: @item c[ad][ad][ad][ad]r, up to four a's or d's
        !           318: These 28 functions (and their setf inverses) have been provided once and
        !           319: for all.  Many packages contributed to Emacs Lisp contain macros that
        !           320: implement some of these, I think this code will make most of them
        !           321: unnecessary. 
        !           322: 
        !           323: @item first
        !           324: @itemx rest
        !           325: @itemx second
        !           326: @itemx third
        !           327: @itemx fourth
        !           328: @itemx fifth
        !           329: @itemx sixth
        !           330: @itemx seventh
        !           331: @itemx eighth
        !           332: @itemx ninth
        !           333: @itemx tenth
        !           334: More standard accessors (and their setf inverses).  Not particularly
        !           335: useful but easy to provide.
        !           336: 
        !           337: @item setnth
        !           338: @itemx setnthcdr
        !           339: These functions are non-standard.  They are here for @code{defsetf}
        !           340: purposes only, but they might be useful on their own.
        !           341: 
        !           342: @end table
        !           343: 
        !           344: @node Sequences, Conditionals, Lists, Top
        !           345: @section Sequences
        !           346: 
        !           347: Sequences are partly supported in Emacs Lisp (see, for instance, the
        !           348: @code{elt} function).  This limited support is compatible with Common
        !           349: Lisp, so it should be easy to extend.  However, the lack of
        !           350: keyword arguments makes many of the functions impossible so far (but, as
        !           351: mentioned below, a basic framework for that extension
        !           352: is provided here). @refill
        !           353: 
        !           354: The functionality really provided here is given by the functions
        !           355: (essentially, predicates) @code{every}, @code{some}, @code{notevery},
        !           356: @code{notany}.  I have found them useful countless times, so I thought
        !           357: to provide them before anything else. @refill
        !           358: 
        !           359: That still leaves many omissions, though.
        !           360: 
        !           361: @subsection Features Provided
        !           362: 
        !           363: @table @code
        !           364: @item every
        !           365: @itemx notany
        !           366: @itemx notevery
        !           367: @itemx some
        !           368: Extremely useful functions.  If your favorite Lisp doesn't have them,
        !           369: you are missing a lot.
        !           370: 
        !           371: @item setelt
        !           372: A setf-inverse to @code{elt}.
        !           373: 
        !           374: @item add-to-klist
        !           375: @itemx build-klist
        !           376: @itemx extract-from-klist
        !           377: A @dfn{klist} is just an alist whose keys are keywords.  I based the
        !           378: pseudo-keyword argument support of @code{defstruct} on this idea, but
        !           379: their best fit is here, as they could help to write the remaining
        !           380: sequence-handling functions (@code{find}, @code{substitute}, @dots{})
        !           381: that I didn't provide for the lack of a good keyword
        !           382: arguments mechanism. @refill
        !           383: 
        !           384: @item elt-satisfies-if-not-p
        !           385: @itemx elt-satisfies-if-p
        !           386: @itemx elt-satisfies-test-p
        !           387: @itemx elts-match-under-klist-p
        !           388: The Common Lisp book defines some of the semantics of sequence functions
        !           389: in terms of satisfaction of certain tests.  These predicates provide
        !           390: that functionality, but I haven't integrated them with the rest of the
        !           391: extensions.  However, I thought it was better to include them anyway, as
        !           392: they can serve somebody else as a starting point.
        !           393: 
        !           394: @end table
        !           395: 
        !           396: 
        !           397: @node Conditionals, Iterations, Sequences, Top
        !           398: @section Conditionals
        !           399: 
        !           400: An elementary incompatibility prevents us from producing true Common
        !           401: Lisp here.  The @code{if} forms are different.  In Emacs Lisp, @code{if}
        !           402: can take any number of subforms, there being a @var{condition} form, a
        !           403: @var{then} form, and after them any number of @var{else} subforms,
        !           404: which are executed in an implicit @code{progn}.  Moreover, that style is
        !           405: widely used in the Emacs sources, so I thought most impractical to break
        !           406: with 
        !           407: it to support Common Lisp's @code{if} (where only one @var{else} form is
        !           408: tolerated).  For the most part, I use @code{cond} almost always, so it
        !           409: doesn't bother me much.  If you use single-branch @code{if}s often,
        !           410: consider @code{when} or @code{unless} as alternatives.  @refill
        !           411: 
        !           412: @code{case} and @code{ecase} are a convenient way to write things that
        !           413: usually end up in a very baroque @code{cond}.  
        !           414: 
        !           415: @subsection Features Provided
        !           416: 
        !           417: @table @code
        !           418: @item MACRO case
        !           419: @itemx MACRO ecase
        !           420: @itemx MACRO unless
        !           421: @itemx MACRO when
        !           422: The standard stuff, completely implemented.
        !           423: @end table
        !           424: 
        !           425: @node Iterations, Multiple Values, Conditionals, Top
        !           426: @section Iterations
        !           427: 
        !           428: Having a @code{do} macro was my original motivation.  The alternatives
        !           429: in standard Emacs Lisp are either expensive (recursion) or correspond
        !           430: directly to the expansion of my macros:
        !           431: @example
        !           432:  (macroexpand '
        !           433:   (do ((i 0) (j 1 (+ 1 j)))
        !           434:       ((> j (foo i)) (cons i bar))
        !           435:     (setq i (baz i j))))
        !           436: 
        !           437: (let ((i 0) (j 1))
        !           438:   (while (not (> j (foo i)))
        !           439:     (setq i (baz i j))
        !           440:     (psetq j (+ 1 j)))
        !           441:   (cons i bar))
        !           442: @end example
        !           443: So I prefer to leave to the macros the problem of remembering the
        !           444: details right.
        !           445: 
        !           446: The incompatibilities are due to the problems already discussed
        !           447: (@pxref{Generalities}, for more details). @refill
        !           448: 
        !           449: If you write Emacs Lisp code often, you will find enough uses for these.
        !           450: Examples are cooking up a translation table to move @key{C-s} out of the
        !           451: way of multiplexers, switches, concentrators and similar fauna, or
        !           452: building keymaps.  @refill
        !           453: 
        !           454: @subsection Features Provided
        !           455: 
        !           456: @table @code
        !           457: @item MACRO do
        !           458: @itemx MACRO do*
        !           459: @itemx MACRO dolist
        !           460: @itemx MACRO dotimes
        !           461: The standard, but for the lack of implicit blocks.
        !           462: 
        !           463: @item MACRO loop
        !           464: The basic standard one, not the fancy one.  As per the book, warns you
        !           465: about atomic entries at the surface of the macro (to guarantee that the
        !           466: fancy @code{loop} macros can be made standard later).
        !           467: 
        !           468: @item MACRO do-all-symbols
        !           469: @itemx MACRO do-symbols
        !           470: These operate on obarrays, the default is the current one.
        !           471: 
        !           472: @end table
        !           473: 
        !           474: @node Multiple Values, Integer Arithmetic, Iterations, Top
        !           475: @section Multiple Values
        !           476: 
        !           477: The multiple values mechanism covers (simply and elegantly, in my
        !           478: opinion) various common needs:
        !           479: 
        !           480: @enumerate
        !           481: @item
        !           482: The case where a function returns a composite value, that has to be
        !           483: assembled in the callee and disassembled in the caller.  An example is
        !           484: @code{pair-with-newsyms}.
        !           485: @item
        !           486: The case where a function might cheaply compute redundant information
        !           487: that is useful to the caller only eventually.  For instance, routines
        !           488: that compute quotients and remainders together, whose callers might be
        !           489: more often interested in just receiving the quotient.
        !           490: @item
        !           491: The case of functions that usually return a useful value, but might need
        !           492: to elaborate on occasion (say, returning a reason code too).
        !           493: @end enumerate
        !           494: 
        !           495: The general idea is that one such function @i{always} returns the extra
        !           496: values, but only callers that are aware of this ability receive them.
        !           497: Unaware callers just receive the first value.
        !           498: 
        !           499: I think my implementation is pretty much complete.  I am imposing no
        !           500: limits on the number of multiple values a function may return, so
        !           501: I am not providing the constant @code{multiple-values-limit}.  You can
        !           502: assume multiple values are bound by the memory 
        !           503: size only. @refill
        !           504: 
        !           505: @subsection Features Provided
        !           506: 
        !           507: @table @code
        !           508: @item values
        !           509: @itemx values-list
        !           510: These are the forms that produce multiple values.
        !           511: 
        !           512: @item MACRO multiple-value-bind
        !           513: @itemx MACRO multiple-value-call
        !           514: @itemx MACRO multiple-value-list
        !           515: @itemx MACRO multiple-value-prog1
        !           516: @itemx MACRO multiple-value-setq
        !           517: These are the forms that receive multiple values.
        !           518: 
        !           519: @item VARIABLE *mvalues-count*
        !           520: @itemx VARIABLE *mvalues-values*
        !           521: Used by the implementation.  Don't touch them!
        !           522: 
        !           523: @end table
        !           524: 
        !           525: @node Integer Arithmetic, Generalized Variables, Multiple Values, Top
        !           526: @section Integer Arithmetic
        !           527: 
        !           528: I have provided most of the functions that are supposed to act on
        !           529: integers.  Of those that take arbitrary numbers, I have implemented
        !           530: those that have a reasonable implementation if restricted to integers
        !           531: only, although some more could be added (like a restricted form of
        !           532: @code{expt}).
        !           533: 
        !           534: Being a little worried about the bad fame that affects some
        !           535: implementations of the '%' C operator, I have taken perhaps unnecessary
        !           536: precautions whenever integer division is concerned (see the function
        !           537: @code{safe-idiv}).  This should be of interest only when dividing
        !           538: numbers that might be negative, but I have preferred here to be safe
        !           539: rather than fast.  @refill
        !           540: 
        !           541: @subsection Features Provided
        !           542: 
        !           543: @table @code
        !           544: @item abs
        !           545: @itemx signum
        !           546: The usual.
        !           547: 
        !           548: @item gcd
        !           549: @itemx lcm
        !           550: The usual.
        !           551: 
        !           552: @item isqrt
        !           553: A rather annoying function.  Only use I can think of: to cut short a
        !           554: prime number sieve.
        !           555: 
        !           556: @item evenp
        !           557: @itemx oddp
        !           558: @itemx plusp
        !           559: @itemx minusp
        !           560: A few predicates that use to come handy.
        !           561: 
        !           562: @item ceiling
        !           563: @itemx floor
        !           564: @itemx round
        !           565: @itemx truncate
        !           566: @itemx mod
        !           567: @itemx rem
        !           568: The intention is to give everybody his preferred way to divide integers.
        !           569: I have tried not to depend on the unreliable semantics of C's integer
        !           570: division, I hope I got it right.  Read the code when in doubt.
        !           571: 
        !           572: @end table
        !           573: 
        !           574: @node Generalized Variables, Structures, Integer Arithmetic, Top
        !           575: @section Generalized Variables
        !           576: 
        !           577: This implementation has many limitations.  Take a look to see if you
        !           578: want to overcome them, the fixes might prove unnecessarily expensive for
        !           579: Emacs purposes.  The ones I am clearly aware of:
        !           580: 
        !           581: @enumerate
        !           582: @item
        !           583: Common Lisp suggests an underlying mechanism (the setf-methods) to
        !           584: implement generalized variables.  I have used ad-hoc ideas that gave me
        !           585: a rather trivial implementation 
        !           586: that suffers from some inflexibility.  As a result, @code{defsetf}
        !           587: only admits the simplest form and there is no @code{define-modify-macro}
        !           588: nor there are functions to handle the (nonexistent) setf-methods. @refill
        !           589: @item
        !           590: I haven't implemented (I was uninterested) @code{getf} and friends.
        !           591: This shouldn't be hard.
        !           592: @end enumerate
        !           593: 
        !           594: In addition to providing this mechanism, I have written @code{defsetf}s
        !           595: for almost every accessor I thought of.  There is room for improvement
        !           596: here, as Emacs Lisp provides many types of its own (buffers, windows,
        !           597: keymaps, syntax tables, @dots{}) for which pairs of accessors and
        !           598: mutators could be defined.
        !           599: 
        !           600: If you want to check whether a function has a setf-inversor, look at the
        !           601: property `:setf-update-fn' of its name.  This is a characteristic of my
        !           602: implementation, not mandated by Common Lisp, so you
        !           603: shouldn't use it in code, but only to determine interactively what can
        !           604: be setf'd.  @refill
        !           605: 
        !           606: @subsection Features Provided
        !           607: 
        !           608: @table @code
        !           609: @item MACRO setf
        !           610: @itemx MACRO psetf
        !           611: Almost complete implementation.  @code{Setf} should handle @code{apply}
        !           612: inside itself and not in a @code{defsetf}, but the difference is so
        !           613: minute I feel lazy about fixing this. @code{Psetf} is the version where
        !           614: the assignments occur in parallel. @refill
        !           615: 
        !           616: @item MACRO defsetf
        !           617: Very sketchy implementation.  I will appreciate if somebody puts some
        !           618: time in implementing the whole works of setf-methods and such.
        !           619: 
        !           620: @itemx MACRO incf
        !           621: @itemx MACRO decf
        !           622: The usual and standard.
        !           623: 
        !           624: @item MACRO pop
        !           625: @itemx MACRO push
        !           626: @itemx MACRO pushnew
        !           627: Should be the usual, but I haven't had the time to test them properly. 
        !           628: 
        !           629: @item MACRO rotatef
        !           630: @itemx MACRO shiftf
        !           631: Very fancy.  Good for implementing history rings and such.
        !           632: To swap two values, the following forms are equivalent:
        !           633: @example
        !           634: (rotatef a b)
        !           635: (psetf a b b a)
        !           636: (psetq a b b a)  ;not good for anything but variables
        !           637: @end example
        !           638: 
        !           639: @end table
        !           640: 
        !           641: @node Structures, Miscellanea, Generalized Variables, Top
        !           642: @section Structures
        !           643: 
        !           644: I haven't had the time to construct a complete implementation of
        !           645: structures, but the part provided should stand on its own for many
        !           646: purposes.  I am not supporting `BOA constructors', nor typed slots (the
        !           647: @code{:type}, @code{:named} and @code{:initial-offset} options), nor
        !           648: explicit representational types.  The rest should be
        !           649: pretty much complete.  See the example file @file{fractions.el} for an
        !           650: idea of how complete the implementation is, and for exercises. @refill
        !           651: 
        !           652: When writing these functions, I noticed I was incurring in lots of
        !           653: auxiliaries.  I used dollar signs in their names, in the hope that this
        !           654: could prevent clashes with user functions.  In retrospect, I should have
        !           655: done it in the other sections, too.
        !           656: 
        !           657: 
        !           658: @subsection Features Provided
        !           659: 
        !           660: @table @code
        !           661: @item MACRO defstruct
        !           662: Create records (a la C structs) and use them as types in your programs.
        !           663: Almost completely standard.
        !           664: 
        !           665: @item make$structure$instance
        !           666: This non-standard function implements most of the `guts' of the `make-'
        !           667: constructors.  It can be used as an example of the pseudo
        !           668: keyword-arguments.  
        !           669: @end table
        !           670: 
        !           671: @node Miscellanea, To Do, Structures, Top
        !           672: @section Miscellanea
        !           673: 
        !           674: @subsection Features Provided
        !           675: 
        !           676: @table @code
        !           677: @item MACRO psetq
        !           678: A parallel-assignments version of @code{setq}, makes the expansions of
        !           679: @code{do} and @code{do*} be very similar, as they should.  Otherwise
        !           680: used to swap two values, now superseded by @code{rotatef}. @refill
        !           681: 
        !           682: @item duplicate-symbols-p
        !           683: @itemx pair-with-newsyms
        !           684: @itemx reassemble-argslists
        !           685: @itemx unzip-list
        !           686: @itemx zip-lists
        !           687: These are utilities I find useful when parsing a call or generating code
        !           688: inside a macro.  Non standard.
        !           689: @end table
        !           690: 
        !           691: @node To Do, , Miscellanea, Top
        !           692: @section To Do
        !           693: 
        !           694: No doubt many people will like to extend the functionality of these
        !           695: routines.  When considering doing so, please try and do it in such a way
        !           696: that your implementation of a subset of the functionality of Common Lisp
        !           697: is not inimical with a more extensive or more correct one.  For
        !           698: definiteness, ask yourself the questions:
        !           699: 
        !           700: @itemize @bullet
        !           701: @item
        !           702: Will my code run under a correct implementation of Common Lisp?
        !           703: @item
        !           704: Will a correct implementation of Common Lisp run if my code is loaded?
        !           705: @end itemize
        !           706: @noindent
        !           707: 
        !           708: The first question tests the pertinence of your extensions.  The second
        !           709: tries to discover ``extensions'' that prevent correct implementations of
        !           710: other features.  Please tell me if you notice a case in which my code
        !           711: fails to pass any of those tests.
        !           712: 
        !           713: The next subsections propose some more extensions.  I hope that they are
        !           714: attempted by people learning Lisp, as a way to enhance their
        !           715: understanding.  Of course, experts are also admitted. @refill
        !           716: 
        !           717: @subsection Keyword Arguments
        !           718: 
        !           719: Some effort has been done to handle keywords almost right.  For
        !           720: instance, a structure constructor (@pxref{Structures}) can be invoked
        !           721: with keyword arguments.
        !           722: 
        !           723: Look for the functions whose names have a @samp{klist} in them.  They
        !           724: were written to facilitate parsing calls with keyword arguments, but I
        !           725: haven't done a complete implementation yet.  (Note that @code{member},
        !           726: @code{assoc} and perhaps some other function, have to be implemented
        !           727: independently of the general framework.  More details by Email if you
        !           728: want to try 
        !           729: your hand at this.) @refill
        !           730: 
        !           731: @subsection Mapping Functions
        !           732: 
        !           733: There is enough support to write @code{maplist}, @code{mapl}, etc.  Emacs
        !           734: Lisp already provides some of the mapping functions, the trick now is to
        !           735: code the rest in a very efficient manner, so there will be an incentive
        !           736: to use @code{maplist} over an explicit iteration.  I have a draft
        !           737: implementation, but I don't have the time to test it now.
        !           738: 
        !           739: @subsection Complete the current implementation
        !           740: 
        !           741: Some of the features described above are only a partial implementation
        !           742: of the Common Lisp features.  Things that cry for a more complete form:
        !           743: 
        !           744: @table @code
        !           745: @item defsetf
        !           746: Only the simplest format is supported.  The most general one is needed
        !           747: too.  Also, try to get @code{define-setf-method} and
        !           748: @code{get-setf-method} to work. @refill
        !           749: @item define-modify-macro
        !           750: Same as above.  The modify-macros provided are all ad hoc.
        !           751: @item defstruct
        !           752: I think my version recognizes all the options and then proceeds to
        !           753: ignore most of them.  Making sure that at least good error messages are
        !           754: produced would be nice.  Also, what about BOA constructors?
        !           755: @end table
        !           756: 
        !           757: There are other places where your programming ingenuity would help us
        !           758: all.  For instance, @code{subst}, @code{sublis} and the like could be
        !           759: easily provided in the @var{lists} section.  (I haven't done it because
        !           760: I wanted to have the keyword arguments stuff first.) @refill
        !           761: 
        !           762: @subsection Hash Tables
        !           763: 
        !           764: A very simple implementation of hash tables would admit only strings as
        !           765: keys.  For each string and a given number of buckets (a prime is
        !           766: desirable here), add the numeric values of all (or of a reasonable
        !           767: subset) of the characters and assign the bucket whose index is the
        !           768: remainder of the sum modulo the (prime) number of buckets.
        !           769: 
        !           770: A more convenient implementation can then be based on using
        !           771: @code{prin1-to-string} on an arbitrary Lisp object and using the output
        !           772: string as a key. This should make it easy to write @code{sxhash}.
        !           773: Remember that one needs to ensure that @code{(equal x y)} should imply
        !           774: that @w{@code{(= (sxhash x) (sxhash y))}}; and also that the keys are
        !           775: state-less (so you can write them to a 
        !           776: file and read them back later). @refill
        !           777: 
        !           778: Don't forget to provide a @code{defsetf} for @code{gethash}.
        !           779: 
        !           780: @subsection Packages
        !           781: 
        !           782: Packages should be easy to implement on top of a good hash table
        !           783: implementation, either by using it directly or by reusing some shared
        !           784: code.  Don't worry too much about efficiency: package qualification has
        !           785: no run-time cost, only read- and print-time costs.
        !           786: 
        !           787: The difficult thing is to integrate it correctly.  You have to replace
        !           788: the built-in functions @code{read} and @code{write}.  This is not as bad
        !           789: as writing a programmable reader, but still a pain.  For starters, your
        !           790: routines could remember the default definitions of the above mentioned
        !           791: functions: @refill
        !           792: 
        !           793: @example
        !           794: (setf def-reader  (symbol-function 'read))
        !           795: (setf def-printer (symbol-function 'print))
        !           796: @dots{}
        !           797: @end example
        !           798: 
        !           799: And then your specialized functions could just use @code{apply} to
        !           800: exercise the default ones, intercepting their activity in time to do the
        !           801: package qualification.  You might have to do this to @code{prin1},
        !           802: @code{prin1-to-string} and friends. @refill
        !           803: 
        !           804: @subsection Streams and Files
        !           805: 
        !           806: This is the first ``To Do'' that might require doing some C programming.
        !           807: The purpose is to construct an efficient byte stream abstraction that
        !           808: will allow Streams and Files to be handled.  Think of stdio, not Unix
        !           809: I/O, because Emacs already runs under other operating systems.  Also,
        !           810: think of doing it in a way that can be generalized easily (for instance,
        !           811: streams kept in memory without a file behind, streams as an interface to
        !           812: a windowing system, etc.)  Of course, the intended syntax is that of
        !           813: Common Lisp.
        !           814: 
        !           815: @subsection Reader and Printer
        !           816: 
        !           817: The Emacs Lisp reader (the C function @code{Fread}) is not reentrant nor
        !           818: programmable.  It could be fixed as Lisp Code, but that is probably
        !           819: uglily expensive (as bad as redoing @code{eval} and @code{apply} to
        !           820: support lexical scoping).  Doing this  extension is probably a bad
        !           821: idea: a Common Lisp reader is incompatible with Emacs Lisp code (because
        !           822: of the @samp{?\} constructions) and the most important rule to keep in
        !           823: mind is that this code is running under Emacs, so the host shouldn't be
        !           824: burdened too much with these emulations.  Same goes for a more complete
        !           825: printer (a Common Lisp @code{format} would be incompatible with the
        !           826: Emacs Lisp one). @refill
        !           827: 
        !           828: @subsection Backquote
        !           829: Even if the reader is not made programmable nor reentrant, a backquoting
        !           830: mechanism could come handy.  You need to study the way the current
        !           831: reader does @code{quote} and hack from there.  This might be a more
        !           832: worthwhile extension than the complete rewrite of the reader.
        !           833: 
        !           834: @subsection Wild Ideas
        !           835: Perhaps there is a way to implement @code{block}, @code{tagbody},
        !           836: @code{return} and friends in spite of the dynamic scoping of Emacs Lisp.
        !           837: By this, I mean an adequate definition that preserves remotely the
        !           838: original intent and still provides a sensible set of constructs.  Other
        !           839: dynamically scoped Lisps have these features, so implementing them is
        !           840: not necessarily impossible.
        !           841: 
        !           842: In the same spirit of these extensions would be to provide a port of
        !           843: something like Flavors 
        !           844: (was there a PD version from Maryland, for Franz perhaps?) and then
        !           845: rephrase the language of major and minor modes in an Object Oriented
        !           846: paradigm. @refill
        !           847: 
        !           848: Also, the rather gross @code{loop} macros that are out there in many
        !           849: Lisp systems could be helpful to some
        !           850: people (but then think of a @code{lisp-indent-hook} that handles them
        !           851: properly). @refill
        !           852: 
        !           853: @bye

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.