1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-05 11:45:45 +00:00

(Printed Representation): Clarify read syntax vs print.

(Floating Point Type): Explain meaning better.
(Symbol Type): Explain uniqueness better.
(Cons Cell Type): Explain empty list sooner.  CAR and CDR later.
List examples sooner.
(Box Diagrams): New subnode broken out.
Some examples moved from old Lists as Boxes node.
(Dotted Pair Notation): Clarify intro.
(Array Type): Clarify.
(Type Predicates): Add hash-table-p.
This commit is contained in:
Richard M. Stallman 2005-02-14 10:22:36 +00:00
parent 4182ecfc37
commit 8b480acb35

View File

@ -68,14 +68,30 @@ to use these types can be found in later chapters.
The @dfn{printed representation} of an object is the format of the The @dfn{printed representation} of an object is the format of the
output generated by the Lisp printer (the function @code{prin1}) for output generated by the Lisp printer (the function @code{prin1}) for
that object. The @dfn{read syntax} of an object is the format of the that object. Every data type has a unique printed representation.
input accepted by the Lisp reader (the function @code{read}) for that The @dfn{read syntax} of an object is the format of the input accepted
object. @xref{Read and Print}. by the Lisp reader (the function @code{read}) for that object. This
is not necessarily unique; many kinds of object have more than one
syntax. @xref{Read and Print}.
Most objects have more than one possible read syntax. Some types of @cindex hash notation
object have no read syntax, since it may not make sense to enter objects In most cases, an object's printed representation is also a read
of these types directly in a Lisp program. Except for these cases, the syntax for the object. However, some types have no read syntax, since
printed representation of an object is also a read syntax for it. it does not make sense to enter objects of these types as constants in
a Lisp program. These objects are printed in @dfn{hash notation}: the
characters @samp{#<} followed by a descriptive string (typically the
type name followed by the name of the object), and closed with a
matching @samp{>}. For example:
@example
(current-buffer)
@result{} #<buffer objects.texi>
@end example
@noindent
Hash notation cannot be read at all, so the Lisp reader signals the
error @code{invalid-read-syntax} whenever it encounters @samp{#<}.
@kindex invalid-read-syntax
In other languages, an expression is text; it has no other form. In In other languages, an expression is text; it has no other form. In
Lisp, an expression is primarily a Lisp object and only secondarily the Lisp, an expression is primarily a Lisp object and only secondarily the
@ -83,21 +99,6 @@ text that is the object's read syntax. Often there is no need to
emphasize this distinction, but you must keep it in the back of your emphasize this distinction, but you must keep it in the back of your
mind, or you will occasionally be very confused. mind, or you will occasionally be very confused.
@cindex hash notation
Every type has a printed representation. Some types have no read
syntax---for example, the buffer type has none. Objects of these types
are printed in @dfn{hash notation}: the characters @samp{#<} followed by
a descriptive string (typically the type name followed by the name of
the object), and closed with a matching @samp{>}. Hash notation cannot
be read at all, so the Lisp reader signals the error
@code{invalid-read-syntax} whenever it encounters @samp{#<}.
@kindex invalid-read-syntax
@example
(current-buffer)
@result{} #<buffer objects.texi>
@end example
When you evaluate an expression interactively, the Lisp interpreter When you evaluate an expression interactively, the Lisp interpreter
first reads the textual representation of it, producing a Lisp object, first reads the textual representation of it, producing a Lisp object,
and then evaluates that object (@pxref{Evaluation}). However, and then evaluates that object (@pxref{Evaluation}). However,
@ -204,9 +205,11 @@ leading @samp{+} or a final @samp{.}.
@subsection Floating Point Type @subsection Floating Point Type
Floating point numbers are the computer equivalent of scientific Floating point numbers are the computer equivalent of scientific
notation. The precise number of significant figures and the range of notation; you can think of a floating point number as a fraction
possible exponents is machine-specific; Emacs always uses the C data together with a power of ten. The precise number of significant
type @code{double} to store the value. figures and the range of possible exponents is machine-specific; Emacs
uses the C data type @code{double} to store the value, and internally
this records a power of 2 rather than a power of 10.
The printed representation for floating point numbers requires either The printed representation for floating point numbers requires either
a decimal point (with at least one digit following), an exponent, or a decimal point (with at least one digit following), an exponent, or
@ -474,9 +477,10 @@ following text.)
@node Symbol Type @node Symbol Type
@subsection Symbol Type @subsection Symbol Type
A @dfn{symbol} in GNU Emacs Lisp is an object with a name. The symbol A @dfn{symbol} in GNU Emacs Lisp is an object with a name. The
name serves as the printed representation of the symbol. In ordinary symbol name serves as the printed representation of the symbol. In
use, the name is unique---no two symbols have the same name. ordinary Lisp use, with one single obarray (@pxref{Creating Symbols},
a symbol's name is unique---no two symbols have the same name.
A symbol can serve as a variable, as a function name, or to hold a A symbol can serve as a variable, as a function name, or to hold a
property list. Or it may serve only to be distinct from all other Lisp property list. Or it may serve only to be distinct from all other Lisp
@ -606,9 +610,38 @@ Lisp are implicit.
A @dfn{list} is a series of cons cells, linked together so that the A @dfn{list} is a series of cons cells, linked together so that the
@sc{cdr} slot of each cons cell holds either the next cons cell or the @sc{cdr} slot of each cons cell holds either the next cons cell or the
empty list. @xref{Lists}, for functions that work on lists. Because empty list. The empty list is actually the symbol @code{nil}.
most cons cells are used as part of lists, the phrase @dfn{list @xref{Lists}, for functions that work on lists. Because most cons
structure} has come to refer to any structure made out of cons cells. cells are used as part of lists, the phrase @dfn{list structure} has
come to refer to any structure made out of cons cells.
@cindex atom
Because cons cells are so central to Lisp, we also have a word for
``an object which is not a cons cell''. These objects are called
@dfn{atoms}.
@cindex parenthesis
The read syntax and printed representation for lists are identical, and
consist of a left parenthesis, an arbitrary number of elements, and a
right parenthesis. Here are examples of lists:
@example
(A 2 "A") ; @r{A list of three elements.}
() ; @r{A list of no elements (the empty list).}
nil ; @r{A list of no elements (the empty list).}
("A ()") ; @r{A list of one element: the string @code{"A ()"}.}
(A ()) ; @r{A list of two elements: @code{A} and the empty list.}
(A nil) ; @r{Equivalent to the previous.}
((A B C)) ; @r{A list of one element}
; @r{(which is a list of three elements).}
@end example
Upon reading, each object inside the parentheses becomes an element
of the list. That is, a cons cell is made for each element. The
@sc{car} slot of the cons cell holds the element, and its @sc{cdr}
slot refers to the next cons cell of the list, which holds the next
element in the list. The @sc{cdr} slot of the last cons cell is set to
hold @code{nil}.
The names @sc{car} and @sc{cdr} derive from the history of Lisp. The The names @sc{car} and @sc{cdr} derive from the history of Lisp. The
original Lisp implementation ran on an @w{IBM 704} computer which original Lisp implementation ran on an @w{IBM 704} computer which
@ -619,25 +652,17 @@ the contents of the decrement. By contrast, ``cons cells'' are named
for the function @code{cons} that creates them, which in turn was named for the function @code{cons} that creates them, which in turn was named
for its purpose, the construction of cells. for its purpose, the construction of cells.
@cindex atom @menu
Because cons cells are so central to Lisp, we also have a word for * Box Diagrams:: Drawing pictures of lists.
``an object which is not a cons cell''. These objects are called * Dotted Pair Notation:: A general syntax for cons cells.
@dfn{atoms}. * Association List Type:: A specially constructed list.
@end menu
@cindex parenthesis
The read syntax and printed representation for lists are identical, and
consist of a left parenthesis, an arbitrary number of elements, and a
right parenthesis.
Upon reading, each object inside the parentheses becomes an element
of the list. That is, a cons cell is made for each element. The
@sc{car} slot of the cons cell holds the element, and its @sc{cdr}
slot refers to the next cons cell of the list, which holds the next
element in the list. The @sc{cdr} slot of the last cons cell is set to
hold @code{nil}.
@node Box Diagrams
@subsubsection Drawing Lists as Box Diagrams
@cindex box diagrams, for lists @cindex box diagrams, for lists
@cindex diagrams, boxed, for lists @cindex diagrams, boxed, for lists
A list can be illustrated by a diagram in which the cons cells are A list can be illustrated by a diagram in which the cons cells are
shown as pairs of boxes, like dominoes. (The Lisp reader cannot read shown as pairs of boxes, like dominoes. (The Lisp reader cannot read
such an illustration; unlike the textual notation, which can be such an illustration; unlike the textual notation, which can be
@ -688,19 +713,6 @@ buttercup)}, sketched in a different manner:
to the symbol @code{nil}. In other words, @code{nil} is both a symbol to the symbol @code{nil}. In other words, @code{nil} is both a symbol
and a list. and a list.
Here are examples of lists written in Lisp syntax:
@example
(A 2 "A") ; @r{A list of three elements.}
() ; @r{A list of no elements (the empty list).}
nil ; @r{A list of no elements (the empty list).}
("A ()") ; @r{A list of one element: the string @code{"A ()"}.}
(A ()) ; @r{A list of two elements: @code{A} and the empty list.}
(A nil) ; @r{Equivalent to the previous.}
((A B C)) ; @r{A list of one element}
; @r{(which is a list of three elements).}
@end example
Here is the list @code{(A ())}, or equivalently @code{(A nil)}, Here is the list @code{(A ())}, or equivalently @code{(A nil)},
depicted with boxes and arrows: depicted with boxes and arrows:
@ -715,27 +727,64 @@ depicted with boxes and arrows:
@end group @end group
@end example @end example
@menu Here is a more complex illustration, showing the three-element list,
* Dotted Pair Notation:: An alternative syntax for lists. @code{((pine needles) oak maple)}, the first element of which is a
* Association List Type:: A specially constructed list. two-element list:
@end menu
@example
@group
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
| --> oak --> maple
|
| --- --- --- ---
--> | | |--> | | |--> nil
--- --- --- ---
| |
| |
--> pine --> needles
@end group
@end example
The same list represented in the first box notation looks like this:
@example
@group
-------------- -------------- --------------
| car | cdr | | car | cdr | | car | cdr |
| o | o------->| oak | o------->| maple | nil |
| | | | | | | | | |
-- | --------- -------------- --------------
|
|
| -------------- ----------------
| | car | cdr | | car | cdr |
------>| pine | o------->| needles | nil |
| | | | | |
-------------- ----------------
@end group
@end example
@node Dotted Pair Notation @node Dotted Pair Notation
@comment node-name, next, previous, up
@subsubsection Dotted Pair Notation @subsubsection Dotted Pair Notation
@cindex dotted pair notation @cindex dotted pair notation
@cindex @samp{.} in lists @cindex @samp{.} in lists
@dfn{Dotted pair notation} is an alternative syntax for cons cells @dfn{Dotted pair notation} is a general syntax for cons cells that
that represents the @sc{car} and @sc{cdr} explicitly. In this syntax, represents the @sc{car} and @sc{cdr} explicitly. In this syntax,
@code{(@var{a} .@: @var{b})} stands for a cons cell whose @sc{car} is @code{(@var{a} .@: @var{b})} stands for a cons cell whose @sc{car} is
the object @var{a}, and whose @sc{cdr} is the object @var{b}. Dotted the object @var{a}, and whose @sc{cdr} is the object @var{b}. Dotted
pair notation is therefore more general than list syntax. In the dotted pair notation is more general than list syntax because the @sc{cdr}
pair notation, the list @samp{(1 2 3)} is written as @samp{(1 . (2 . (3 does not have to be a list. However, it is more cumbersome in cases
. nil)))}. For @code{nil}-terminated lists, you can use either where list syntax would work. In dotted pair notation, the list
notation, but list notation is usually clearer and more convenient. @samp{(1 2 3)} is written as @samp{(1 . (2 . (3 . nil)))}. For
When printing a list, the dotted pair notation is only used if the @code{nil}-terminated lists, you can use either notation, but list
@sc{cdr} of a cons cell is not a list. notation is usually clearer and more convenient. When printing a
list, the dotted pair notation is only used if the @sc{cdr} of a cons
cell is not a list.
Here's an example using boxes to illustrate dotted pair notation. Here's an example using boxes to illustrate dotted pair notation.
This example shows the pair @code{(rose . violet)}: This example shows the pair @code{(rose . violet)}:
@ -860,8 +909,9 @@ Once an array is created, its length is fixed.
All Emacs Lisp arrays are one-dimensional. (Most other programming All Emacs Lisp arrays are one-dimensional. (Most other programming
languages support multidimensional arrays, but they are not essential; languages support multidimensional arrays, but they are not essential;
you can get the same effect with an array of arrays.) Each type of you can get the same effect with nested one-dimensional arrays.) Each
array has its own read syntax; see the following sections for details. type of array has its own read syntax; see the following sections for
details.
The array type is contained in the sequence type and The array type is contained in the sequence type and
contains the string type, the vector type, the bool-vector type, and the contains the string type, the vector type, the bool-vector type, and the
@ -1661,6 +1711,9 @@ with references to further information.
@item functionp @item functionp
@xref{Functions, functionp}. @xref{Functions, functionp}.
@item hash-table-p
@xref{Other Hash, hash-table-p}.
@item integer-or-marker-p @item integer-or-marker-p
@xref{Predicates on Markers, integer-or-marker-p}. @xref{Predicates on Markers, integer-or-marker-p}.