klisp

an open source interpreter for the Kernel Programming Language.
git clone http://git.hanabi.in/repos/klisp.git
Log | Files | Refs | README

commit 5a41ccb081715f8e13cc7b0dac52a5eb3416d90f
parent 38e25e17874ca8ebc41902dc46d494efe73c156b
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Tue, 31 May 2011 17:36:46 -0300

First batch of content of the Pairs and lists & Pair mutation module for the manual.

Diffstat:
Mmanual/html/Index.html | 17+++++++++++++++--
Mmanual/html/index.html | 3++-
Mmanual/klisp.info | 172++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
Mmanual/src/control.texi | 2+-
Mmanual/src/index.texi | 2+-
Mmanual/src/klisp.texi | 2++
Amanual/src/pairs_lists.texi | 147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 321 insertions(+), 24 deletions(-)

diff --git a/manual/html/Index.html b/manual/html/Index.html @@ -5,7 +5,7 @@ <meta name="description" content="klisp Reference Manual"> <meta name="generator" content="makeinfo 4.13"> <link title="Top" rel="start" href="index.html#Top"> -<link rel="prev" href="Control.html#Control" title="Control"> +<link rel="prev" href="Pairs-and-lists.html#Pairs-and-lists" title="Pairs and lists"> <link rel="next" href="../index.html#dir" title="(dir)"> <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> <meta http-equiv="Content-Style-Type" content="text/css"> @@ -26,7 +26,7 @@ <a name="Index"></a> <p> Next:&nbsp;<a rel="next" accesskey="n" href="../index.html#dir">(dir)</a>, -Previous:&nbsp;<a rel="previous" accesskey="p" href="Control.html#Control">Control</a>, +Previous:&nbsp;<a rel="previous" accesskey="p" href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a>, Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a> <hr> </div> @@ -40,13 +40,17 @@ Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a> <li><a href="Control.html#index-g_t_0024if-28"><code>$if</code></a>: <a href="Control.html#Control">Control</a></li> <li><a href="Booleans.html#index-g_t_0024or_003f-18"><code>$or?</code></a>: <a href="Booleans.html#Booleans">Booleans</a></li> <li><a href="Control.html#index-g_t_0024sequence-29"><code>$sequence</code></a>: <a href="Control.html#Control">Control</a></li> +<li><a href="Pairs-and-lists.html#index-g_t_0028-42"><code>(</code></a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="Booleans.html#index-and_003f-15"><code>and?</code></a>: <a href="Booleans.html#Booleans">Booleans</a></li> <li><a href="A-Sample-Applicative-Description.html#index-applicative-descriptions-8">applicative descriptions</a>: <a href="A-Sample-Applicative-Description.html#A-Sample-Applicative-Description">A Sample Applicative Description</a></li> <li><a href="Booleans.html#index-boolean_003f-13"><code>boolean?</code></a>: <a href="Booleans.html#Booleans">Booleans</a></li> <li><a href="Booleans.html#index-booleans-12">booleans</a>: <a href="Booleans.html#Booleans">Booleans</a></li> +<li><a href="Pairs-and-lists.html#index-cons-38"><code>cons</code></a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="Control.html#index-control-26">control</a>: <a href="Control.html#Control">Control</a></li> +<li><a href="Pairs-and-lists.html#index-copy_002des_002dimmutable_0021-41"><code>copy-es-immutable!</code></a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="Format-of-Descriptions.html#index-description-format-7">description format</a>: <a href="Format-of-Descriptions.html#Format-of-Descriptions">Format of Descriptions</a></li> <li><a href="Evaluation-Notation.html#index-documentation-notation-4">documentation notation</a>: <a href="Evaluation-Notation.html#Evaluation-Notation">Evaluation Notation</a></li> +<li><a href="Pairs-and-lists.html#index-empty-list-34">empty list</a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="Equivalence.html#index-eq_003f-20"><code>eq?</code></a>: <a href="Equivalence.html#Equivalence">Equivalence</a></li> <li><a href="Equivalence.html#index-equal_003f-21"><code>equal?</code></a>: <a href="Equivalence.html#Equivalence">Equivalence</a></li> <li><a href="Equivalence.html#index-equivalence-19">equivalence</a>: <a href="Equivalence.html#Equivalence">Equivalence</a></li> @@ -57,11 +61,18 @@ Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a> <li><a href="Control.html#index-for_002deach-31"><code>for-each</code></a>: <a href="Control.html#Control">Control</a></li> <li><a href="Control.html#index-inert_003f-27"><code>inert?</code></a>: <a href="Control.html#Control">Control</a></li> <li><a href="Kernel-History.html#index-Kernel-history-1">Kernel history</a>: <a href="Kernel-History.html#Kernel-History">Kernel History</a></li> +<li><a href="Pairs-and-lists.html#index-lists-35">lists</a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> +<li><a href="Pairs-and-lists.html#index-nil-33">nil</a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="Booleans.html#index-not_003f-14"><code>not?</code></a>: <a href="Booleans.html#Booleans">Booleans</a></li> +<li><a href="Pairs-and-lists.html#index-null_003f-37"><code>null?</code></a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="A-Sample-Applicative-Description.html#index-object-descriptions-10">object descriptions</a>: <a href="A-Sample-Applicative-Description.html#A-Sample-Applicative-Description">A Sample Applicative Description</a></li> <li><a href="A-Sample-Applicative-Description.html#index-operative-descriptions-9">operative descriptions</a>: <a href="A-Sample-Applicative-Description.html#A-Sample-Applicative-Description">A Sample Applicative Description</a></li> <li><a href="Booleans.html#index-or_003f-16"><code>or?</code></a>: <a href="Booleans.html#Booleans">Booleans</a></li> +<li><a href="Pairs-and-lists.html#index-pair_003f-36"><code>pair?</code></a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> +<li><a href="Pairs-and-lists.html#index-pairs-32">pairs</a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="Printing-Notation.html#index-printing-notation-5">printing notation</a>: <a href="Printing-Notation.html#Printing-Notation">Printing Notation</a></li> +<li><a href="Pairs-and-lists.html#index-set_002dcar_0021-39"><code>set-car!</code></a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> +<li><a href="Pairs-and-lists.html#index-set_002dcdr_0021-40"><code>set-cdr!</code></a>: <a href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a></li> <li><a href="Symbols.html#index-string_002d_003esymbol-25"><code>string-&gt;symbol</code></a>: <a href="Symbols.html#Symbols">Symbols</a></li> <li><a href="Symbols.html#index-symbol_002d_003estring-24"><code>symbol-&gt;string</code></a>: <a href="Symbols.html#Symbols">Symbols</a></li> <li><a href="Symbols.html#index-symbol_003f-23"><code>symbol?</code></a>: <a href="Symbols.html#Symbols">Symbols</a></li> @@ -77,6 +88,7 @@ Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a> <li><a href="Index.html#toc_Equivalence">3 Equivalence</a></li> <li><a href="Index.html#toc_Symbols">4 Symbols</a></li> <li><a href="Index.html#toc_Control">5 Control</a></li> +<li><a href="Index.html#toc_Pairs-and-lists">6 Pairs and lists</a></li> <li><a href="Index.html#toc_Index">Index</a></li> </ul> </div> @@ -106,6 +118,7 @@ Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a> <li><a name="toc_Equivalence" href="Equivalence.html#Equivalence">3 Equivalence</a> <li><a name="toc_Symbols" href="Symbols.html#Symbols">4 Symbols</a> <li><a name="toc_Control" href="Control.html#Control">5 Control</a> +<li><a name="toc_Pairs-and-lists" href="Pairs-and-lists.html#Pairs-and-lists">6 Pairs and lists</a> <li><a name="toc_Index" href="Index.html#Index">Index</a> </li></ul> </div> diff --git a/manual/html/index.html b/manual/html/index.html @@ -42,8 +42,9 @@ Up:&nbsp;<a rel="up" accesskey="u" href="../index.html#dir">(dir)</a> mutation module features. <li><a accesskey="5" href="Symbols.html#Symbols">Symbols</a>: Symbol module features. <li><a accesskey="6" href="Control.html#Control">Control</a>: Control module features. +<li><a accesskey="7" href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a>: Pairs and lists and Pair mutation module features. <!-- TODO complete --> -<li><a accesskey="7" href="Index.html#Index">Index</a>: Index including concepts, functions, variables, +<li><a accesskey="8" href="Index.html#Index">Index</a>: Index including concepts, functions, variables, and other terms. <!-- Appendices --> diff --git a/manual/klisp.info b/manual/klisp.info @@ -31,6 +31,7 @@ in part. mutation module features. * Symbols:: Symbol module features. * Control:: Control module features. +* Pairs and lists:: Pairs and lists and Pair mutation module features. * Index:: Index including concepts, functions, variables, and other terms. @@ -455,7 +456,7 @@ symbols with other external representations may be created. R7RS Scheme.  -File: klisp.info, Node: Control, Next: Index, Prev: Symbols, Up: Top +File: klisp.info, Node: Control, Next: Pairs and lists, Prev: Symbols, Up: Top 5 Control ********* @@ -507,7 +508,128 @@ consists of a single immutable value, having external representation discarded and the result returned by `for-each' is inert.  -File: klisp.info, Node: Index, Next: (dir), Prev: Control, Up: Top +File: klisp.info, Node: Pairs and lists, Next: Index, Prev: Control, Up: Top + +6 Pairs and lists +***************** + +A pair is an object that refers to two other objects, called its car +and cdr. The Kernel data type pair is encapsulated. + + The null data type consists of a single immutable value, called nil +or the empty list and having external representation `()', with or +without whitespace between the parentheses. It is immutable, and the +null type is encapsulated. + + If `a' and `d' are external representations of respectively the car +and cdr of a pair `p', then `(a . d)' is an external representation of +`p'. If the cdr of `p' is nil, then `(a)' is also an external +representation of `p'. If the cdr of `p' is a pair `p2', and `(r)' is +an external representation of `p2', then `(a r)' is an external +representation of `p'. When a pair is output (as by write), an +external representation with the fewest parentheses is used; in the +case of a finite list, only one set of parentheses is required beyond +those used in representing the elements of the list. For example, an +object with external representation `(1 . (2 . (3 . ())))' would be +output using, modulo whitespace, external representation `(1 2 3)'. + + -- Applicative: pair? (pair? . objects) + The primitive type predicate for type pair. `pair?' returns true + iff all the objects in `objects' are of type pair. + + -- Applicative: null? (null? . objects) + The primitive type predicate for type null. `null?' returns true + iff all the objects in `objects' are of type null. + + -- Applicative: cons (cons object1 object2) + A new mutable pair object is constructed and returned, whose car + and cdr referents are respectively `object1' and `object2'. No + two objects returned by different calls to cons are `eq?' to each + other. + + -- Applicative: set-car! (set-car! pair object) + -- Applicative: set-cdr! (set-cdr! pair object) + `pair' should be a mutable pair. + + These applicatives set the referent of, respectively, the car + reference or the cdr reference of `pair' to `object'. The result + of the expression is inert. + + -- Applicative: copy-es-immutable! (copy-es-immutable object) + The short description of this applicative is that it returns an + object `equal?' to `object' with an immutable evaluation + structure. The "-es-" in the name is short for "evaluation + structure". + + The evaluation structure of an object `o' is defined to be the set + of all pairs that can be reached by following chains of references + from `o' without ever passing through a non-pair object. The + evaluation structure of a non-pair object is empty. + + If `object' is not a pair, the applicative returns `object'. + Otherwise (if `object' is a pair), the applicative returns an + immutable pair whose car and cdr would be suitable results for + `(copy-es-immutable (car object))' and `(copy-es-immutable (cdr + object))', respectively. Further, the evaluation structure of the + returned value is isomorphic to that of `object' at the time of + copying, with corresponding non-pair referents being `eq?'. + + In Kernel it's undefined whether immutable pairs are copied or + left "as is" in the result. klisp doesn't copy immutable pairs, + but that behaviour should not be depended upon. + + -- list: (list . objects) + The `list' applicative returns `objects'. + + The underlying operative of `list' returns its undifferentiated + operand tree, regardless of whether that tree is or is not a list. + + -- list*: (list* . objects) + `objects' should be a finite nonempty list of arguments. The + following equivalences hold: + (list* arg1) == arg1 + (list* arg1 arg2 . args) == (cons arg1 (list* arg2 . args)) + + -- car: (car pair) + -- cdr: (cdr pair) + These applicatives return, respectively, the car and cdr of `pair'. + + -- caar: (caar pair) + -- cadr: (cadr pair) + -- cdar: (cdar pair) + -- cddr: (cddr pair) + -- caaar: (caaar pair) + -- caadr: (caadr pair) + -- cadar: (cadar pair) + -- caddr: (caddr pair) + -- cdaar: (cdaar pair) + -- cdadr: (cdadr pair) + -- cddar: (cddar pair) + -- cdddr: (cdddr pair) + -- caaaar: (caaaar pair) + -- caaadr: (caaadr pair) + -- caadar: (caadar pair) + -- caaddr: (caaddr pair) + -- cadaar: (cadaar pair) + -- cadadr: (cadadr pair) + -- caddar: (caddar pair) + -- cadddr: (cadddr pair) + -- cdaaar: (cdaaar pair) + -- cdaadr: (cdaadr pair) + -- cdadar: (cdadar pair) + -- cdaddr: (cdaddr pair) + -- cddaar: (cddaar pair) + -- cddadr: (cddadr pair) + -- cdddar: (cdddar pair) + -- cddddr: (cddddr pair) + These applicatives are compositions of `car' and `cdr', with the + "a’s" and "d’s" in the same order as they would appear if all the + individual "car"’s and "cdr"’s were written out in prefix order. + Arbitrary compositions up to four deep are provided. There are + twenty-eight of these applicatives in all. + + +File: klisp.info, Node: Index, Next: (dir), Prev: Pairs and lists, Up: Top Index ***** @@ -520,15 +642,19 @@ Index * $if: Control. (line 15) * $or?: Booleans. (line 41) * $sequence: Control. (line 23) +* (: Pairs and lists. (line 72) * and?: Booleans. (line 20) * applicative descriptions: A Sample Applicative Description. (line 6) * boolean?: Booleans. (line 12) * booleans: Booleans. (line 6) +* cons: Pairs and lists. (line 35) * control: Control. (line 6) +* copy-es-immutable!: Pairs and lists. (line 49) * description format: Format of Descriptions. (line 6) * documentation notation: Evaluation Notation. (line 6) +* empty list: Pairs and lists. (line 6) * eq?: Equivalence. (line 12) * equal?: Equivalence. (line 16) * equivalence: Equivalence. (line 6) @@ -540,13 +666,20 @@ Index * for-each: Control. (line 42) * inert?: Control. (line 11) * Kernel history: Kernel History. (line 6) +* lists: Pairs and lists. (line 6) +* nil: Pairs and lists. (line 6) * not?: Booleans. (line 16) +* null?: Pairs and lists. (line 31) * object descriptions: A Sample Applicative Description. (line 6) * operative descriptions: A Sample Applicative Description. (line 6) * or?: Booleans. (line 24) +* pair?: Pairs and lists. (line 27) +* pairs: Pairs and lists. (line 6) * printing notation: Printing Notation. (line 6) +* set-car!: Pairs and lists. (line 41) +* set-cdr!: Pairs and lists. (line 42) * string->symbol: Symbols. (line 20) * symbol->string: Symbols. (line 16) * symbol?: Symbols. (line 12) @@ -556,22 +689,23 @@ Index  Tag Table: Node: Top302 -Node: License1130 -Node: Introduction2801 -Node: Caveats5624 -Node: Kernel History6410 -Node: Conventions7855 -Node: Some Terms8526 -Node: Evaluation Notation9197 -Node: Printing Notation10218 -Node: Error Messages10694 -Node: Format of Descriptions11342 -Node: A Sample Applicative Description11906 -Node: Acknowledgements13566 -Node: Booleans13952 -Node: Equivalence16494 -Node: Symbols17287 -Node: Control18652 -Node: Index20959 +Node: License1209 +Node: Introduction2880 +Node: Caveats5703 +Node: Kernel History6489 +Node: Conventions7934 +Node: Some Terms8605 +Node: Evaluation Notation9276 +Node: Printing Notation10297 +Node: Error Messages10773 +Node: Format of Descriptions11421 +Node: A Sample Applicative Description11985 +Node: Acknowledgements13645 +Node: Booleans14031 +Node: Equivalence16573 +Node: Symbols17366 +Node: Control18731 +Node: Pairs and lists21048 +Node: Index25996  End Tag Table diff --git a/manual/src/control.texi b/manual/src/control.texi @@ -1,7 +1,7 @@ @c -*-texinfo-*- @setfilename ../src/control -@node Control, Index, Symbols, Top +@node Control, Pairs and lists, Symbols, Top @comment node-name, next, previous, up @chapter Control diff --git a/manual/src/index.texi b/manual/src/index.texi @@ -2,7 +2,7 @@ @setfilename ../src/index @c TODO correct prev node -@node Index, (dir), Control, Top +@node Index, (dir), Pairs and lists, Top @c this is from the elisp manual... Should read a little about this. @unnumbered Index diff --git a/manual/src/klisp.texi b/manual/src/klisp.texi @@ -77,6 +77,7 @@ in part. mutation module features. * Symbols:: Symbol module features. * Control:: Control module features. +* Pairs and lists:: Pairs and lists and Pair mutation module features. @c TODO complete * Index:: Index including concepts, functions, variables, and other terms. @@ -92,6 +93,7 @@ mutation module features. @include equivalence.texi @include symbols.texi @include control.texi +@include pairs_lists.texi @c appendices @c TODO diff --git a/manual/src/pairs_lists.texi b/manual/src/pairs_lists.texi @@ -0,0 +1,147 @@ +@c -*-texinfo-*- +@setfilename ../src/pairs_lists + +@node Pairs and lists, Index, Control, Top +@comment node-name, next, previous, up + +@chapter Pairs and lists +@cindex pairs +@cindex nil +@cindex empty list +@cindex lists + +A pair is an object that refers to two other objects, called its car +and cdr. The Kernel data type pair is encapsulated. + + The null data type consists of a single immutable value, called nil +or the empty list and having external representation @code{()}, with +or without whitespace between the parentheses. It is immutable, and +the null type is encapsulated. + + If @code{a} and @code{d} are external representations of +respectively the car and cdr of a pair @code{p}, then @code{(a . d)} +is an external representation of @code{p}. If the cdr of @code{p} is +nil, then @code{(a)} is also an external representation of +@code{p}. If the cdr of @code{p} is a pair @code{p2}, and @code{(r)} +is an external representation of @code{p2}, then @code{(a r)} is an +external representation of @code{p}. +@c add xref for write + When a pair is output (as by write), an external representation with +the fewest parentheses is used; in the case of a finite list, only one +set of parentheses is required beyond those used in representing the +elements of the list. For example, an object with external +representation @code{(1 . (2 . (3 . ())))} would be output using, +modulo whitespace, external representation @code{(1 2 3)}. + +@deffn Applicative pair? (pair? . objects) + The primitive type predicate for type pair. @code{pair?} +returns true iff all the objects in @code{objects} are of type pair. +@end deffn + +@deffn Applicative null? (null? . objects) + The primitive type predicate for type null. @code{null?} +returns true iff all the objects in @code{objects} are of type null. +@end deffn + +@deffn Applicative cons (cons object1 object2) + A new mutable pair object is constructed and returned, whose car and +cdr referents are respectively @code{object1} and @code{object2}. No +two objects returned by different calls to cons are @code{eq?} to each +other. +@end deffn + +@deffn Applicative set-car! (set-car! pair object) +@deffnx Applicative set-cdr! (set-cdr! pair object) + @code{pair} should be a mutable pair. + + These applicatives set the referent of, respectively, the car +reference or the cdr reference of @code{pair} to @code{object}. The +result of the expression is inert. +@end deffn + +@deffn Applicative copy-es-immutable! (copy-es-immutable object) + The short description of this applicative is that it returns an object +@code{equal?} to @code{object} with an immutable evaluation structure. The +``-es-'' in the name is short for ``evaluation structure''. + +@c TODO move the evaluation structure description to the intro + The evaluation structure of an object @code{o} is defined to be the +set of all pairs that can be reached by following chains of references +from @code{o} without ever passing through a non-pair object. The +evaluation structure of a non-pair object is empty. + + If @code{object} is not a pair, the applicative returns @code{object}. +Otherwise (if @code{object} is a pair), the applicative returns an +immutable pair whose car and cdr would be suitable results for +@code{(copy-es-immutable (car object))} and @code{(copy-es-immutable +(cdr object))}, respectively. Further, the evaluation structure of +@c TODO add xref for isomorphic (and add isomorphic to the intro) +the returned value is isomorphic to that of @code{object} at the time +of copying, with corresponding non-pair referents being @code{eq?}. + + In Kernel it's undefined whether immutable pairs are copied or left ``as +is'' in the result. klisp doesn't copy immutable pairs, but that +behaviour should not be depended upon. +@end deffn + +@deffn list (list . objects) +The @code{list} applicative returns @code{objects}. + + The underlying operative of @code{list} returns its undifferentiated +operand tree, regardless of whether that tree is or is not a list. +@end deffn + +@deffn list* (list* . objects) +@code{objects} should be a finite nonempty list of arguments. The +following equivalences hold: +@example +(list* arg1) @equiv{} arg1 +(list* arg1 arg2 . args) @equiv{} (cons arg1 (list* arg2 . args)) +@end example +@end deffn + +@deffn car (car pair) +@deffnx cdr (cdr pair) +These applicatives return, respectively, the car and cdr of @code{pair}. +@end deffn +@c 2 levels +@deffn caar (caar pair) +@deffnx cadr (cadr pair) +@deffnx cdar (cdar pair) +@deffnx cddr (cddr pair) +@c 3 levels +@deffnx caaar (caaar pair) +@deffnx caadr (caadr pair) +@deffnx cadar (cadar pair) +@deffnx caddr (caddr pair) +@deffnx cdaar (cdaar pair) +@deffnx cdadr (cdadr pair) +@deffnx cddar (cddar pair) +@deffnx cdddr (cdddr pair) +@c 3 levels +@deffnx caaaar (caaaar pair) +@deffnx caaadr (caaadr pair) +@deffnx caadar (caadar pair) +@deffnx caaddr (caaddr pair) +@deffnx cadaar (cadaar pair) +@deffnx cadadr (cadadr pair) +@deffnx caddar (caddar pair) +@deffnx cadddr (cadddr pair) + +@deffnx cdaaar (cdaaar pair) +@deffnx cdaadr (cdaadr pair) +@deffnx cdadar (cdadar pair) +@deffnx cdaddr (cdaddr pair) +@deffnx cddaar (cddaar pair) +@deffnx cddadr (cddadr pair) +@deffnx cdddar (cdddar pair) +@deffnx cddddr (cddddr pair) + +@c TODO add note about pronunciation +These applicatives are compositions of @code{car} and @code{cdr}, with +the ``a’s'' and ``d’s'' in the same order as they would appear if all +the individual ``car’s'' and ``cdr’s'' were written out in prefix +order. Arbitrary compositions up to four deep are provided. There are +twenty-eight of these applicatives in all. +@end deffn +