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:
parent
4182ecfc37
commit
8b480acb35
@ -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}.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user