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:
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: <a rel="next" accesskey="n" href="../index.html#dir">(dir)</a>,
-Previous: <a rel="previous" accesskey="p" href="Control.html#Control">Control</a>,
+Previous: <a rel="previous" accesskey="p" href="Pairs-and-lists.html#Pairs-and-lists">Pairs and lists</a>,
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
<hr>
</div>
@@ -40,13 +40,17 @@ Up: <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: <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->symbol</code></a>: <a href="Symbols.html#Symbols">Symbols</a></li>
<li><a href="Symbols.html#index-symbol_002d_003estring-24"><code>symbol->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: <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: <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: <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
+