DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T s

⟦bc5f78530⟧ TextFile

    Length: 11564 (0x2d2c)
    Types: TextFile
    Names: »sequences.texinfo«

Derivation

└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
    └─⟦c06c473ab⟧ »./UNRELEASED/lispref.tar.Z« 
        └─⟦1b57a2ffe⟧ 
            └─⟦this⟧ »sequences.texinfo« 

TextFile

@setfilename ../info/sequences
@node Sequences Arrays Vectors, Symbols, Lists, Top
@chapter Sequences, Arrays, and Vectors
@cindex sequence

@c name problem: node names cannot have commas.  There is also
@c a section named Sequences below.  What is the chapter to be called??

  Two supertypes are described in this chapter, sequences and arrays.
The primitive type, vector, is also described here.

  Recall that the @dfn{sequence} type is a supertype of three other Lisp
types: lists, vectors, and strings.  In other words, any list is a
sequence, any vector is a sequence, and any string is a sequence.  The
common property that all sequences have is that each is an ordered
collection of elements.

  An @dfn{array} is a sequence in which all element is accessible in
constant time, and whose length cannot be changed.  Both strings and
vectors are arrays.  A list is not an array because the elements of a
list are not all accessible in constant time; in fact, the access time
of an element of a list is proportional to its position in the list.

  The following diagram shows the relationship between all these types.

@example
            ___________________________________
           |                                   |
           |          Sequence                 |
           |  ______   ______________________  |
           | |      | |                      | |
           | | List | |         Array        | |
           | |      | |  ________   _______  | |   
           | |______| | |        | |       | | |
           |          | | String | | Vector| | |
           |          | |________| |_______| | |
           |          |______________________| |
           |___________________________________|

@center @r{The Relationship between Sequences, Arrays, and Vectors}
@end example

  The elements of vectors and lists may be any Lisp objects.  The elements
of strings are all characters.

@menu
* Sequence Functions::  
* Arrays::      
* Vectors::     
@end menu

@node Sequence Functions, Arrays, Sequences Arrays Vectors, Sequences Arrays Vectors
@section Sequences

  In Emacs Lisp, a @dfn{sequence} is either a list, a vector or a
string.  The common property that all sequences have is that each is an
ordered collection of elements.

  This section describes functions that accept any kind of sequence.

@defun sequencep object
Returns @code{t} if @var{object} is a list, vector, or
string, @code{nil} otherwise.
@end defun

@defun copy-sequence sequence
@cindex copying sequences
Returns a copy of @var{sequence}.  The copy is the same type of object
as the original sequence, and it has the same elements in the same order.

Storing a new element into the copy does not affect the original
@var{sequence}, and vice versa.  However, the elements of the new
sequence are not copies; they are identical (@code{eq}) to the elements
of the original.  Therefore, changes made within these elements, as
found via the copied sequence, are also visible in the original
sequence.

See also @code{append} in @ref{Building Cons Cells and Lists}, and
@code{concat} in @ref{Creating Strings}, for others ways to copy
sequences.

@example
(setq bar '(1 2))
     @result{} (1 2)
(setq x (vector 'foo bar))
     @result{} [foo (1 2)]
(setq y (copy-sequence x))
     @result{} [foo (1 2)]

(eq x y)
     @result{} nil
(equal x y)
     @result{} t
(eq (elt x 1) (elt y 1))
     @result{} t

;; @r{Replacing an element of one sequence.}
(aset x 0 'quux)
x @result{} [quux (1 2)]
y @result{} [foo (1 2)]

;; @r{Modifying the inside of a shared element.}
(setcar (aref x 1) 69)
x @result{} [quux (69 2)]
y @result{} [foo (69 2)]
@end example
@end defun

@defun length sequence
@cindex string length
@cindex list length
@cindex vector length
@cindex sequence length
Returns the number of elements in @var{sequence}.  If @var{sequence}
is a cons that is not a list (the final @sc{cdr} is not @code{nil}), a
@code{wrong-type-argument} error results.

@example
(length '(1 2 3))
    @result{} 3
(length nil)
    @result{} 0
(length "foobar")
    @result{} 6
(length [1 2 3])
    @result{} 3
@end example
@end defun

@defun elt sequence integer
@cindex elements of sequences
This function returns the element of @var{sequence} indexed by
@var{integer}.  Legitimate values of @var{integer} range from 0 up to one
less than the length of @var{sequence}; other values produce an
@code{args-out-of-range} error.

@example
(elt [1 2 3 4] 2)
     @result{} 3
(elt '(1 2 3 4) 2)
     @result{} 3
(char-to-string (elt "1234" 2))
     @result{} "3"
(elt [1 2 3 4] 4)
     @error{}Args out of range: [1 2 3 4], 4
(elt [1 2 3 4] -1)
     @error{}Args out of range: [1 2 3 4], -1
@end example

This function duplicates @code{aref} (@pxref{Arrays}) and @code{nth}
(@pxref{List Elements, , Accessing Elements of Lists}), except that it
works for any kind of sequence.
@end defun

@node Arrays, Vectors, Sequence Functions, Sequences Arrays Vectors
@section Arrays
@cindex array

  Arrays in Lisp, like arrays in most languages, are blocks of memory
whose elements can be accessed in equal time.  All Emacs Lisp arrays are
single dimensional and zero-based (their first element is indexed with
zero).

  Emacs Lisp provides two kinds of arrays, distinguished by what kinds
of element they can contain.  A @dfn{vector} is a general array; its
elements can be any Lisp objects.  A @dfn{string} is a specialized
array; its elements must be characters (i.e., integers between 0 and
255).

  In principle, if you wish to have an array of characters, you could use
either a string or a vector.  In practice, we always choose strings for
such applications, for three reasons:

@itemize @bullet
@item
They occupy one fourth the space of a vector.

@item
Strings are printed in a way that shows the contents more clearly
as characters.

@item
Many of the specialized editing and I/O facilities of Emacs accept only
strings.  For example, you cannot insert a vector of characters into a
buffer the way you can insert a string.  @xref{Strings and Characters}.
@end itemize

  In this section, we describe the functions that accept both strings
and vectors.

@defun arrayp object
This function returns @code{t} if the object is an array (i.e., either a
vector or a string).

@example
(arrayp [a])
@result{} t
(arrayp "asdf")
@result{} t
@end example
@end defun

@defun aref array integer
@cindex array elements
This function returns the @var{integer}'th element of the @var{array}
The first element is indexed with zero.  In the example, the character
@kbd{b} is @sc{ASCII} code 98.

@example
(setq primes [2 3 5 7 11 13])
     @result{} [2 3 5 7 11 13]
(aref primes 4)
     @result{} 11
(aref "abcdefg" 1)
     @result{} 98
(elt primes 4)
     @result{} 11
@end example

See also the function @code{elt}, in @ref{Sequence Functions}.
@end defun

@defun aset array integer object
This function sets the @var{integer}'th element of @var{array} to be
@var{object}.  It returns @var{object}.

@example
(setq w [foo bar baz])
     @result{} [foo bar baz]
(aset w 0 'fu)
     @result{} fu
w
     @result{} [fu bar baz]

(setq x "asdfasfd")
     @result{} "asdfasfd"
(aset x 3 ?Z)
     @result{} 90
x
     @result{} "asdZasfd"
@end example

If @var{array} is a string and @var{object} is not a character, a
@code{wrong-type-argument} error results.
@end defun

@defun fillarray array object
This function fills the array with pointers to @var{object}, replacing
any previous values.  It returns @var{array}.

@example
(setq a [a b c d e f g])
     @result{} [a b c d e f g]
(fillarray a 0)
     @result{} [0 0 0 0 0 0 0]
a
     @result{} [0 0 0 0 0 0 0]
(setq s "When in the course")
     @result{} "When in the course"
(fillarray s ?-)
     @result{} "------------------"
@end example

If @var{array} is a string and @var{object} is not a character, a
@code{wrong-type-argument} error results.
@end defun

The general sequence functions @code{copy-sequence} and @code{length}
are often useful for objects known to be arrays.  @xref{Sequence Functions}.

@node Vectors,  , Arrays, Sequences Arrays Vectors
@section Vectors

  Arrays in Lisp, like arrays in most languages, are blocks of memory
whose elements can be accessed in constant time.  A @dfn{vector} is a
general-purpose array; its elements can be any Lisp objects.  (The other
kind of array provided in Emacs Lisp is the @dfn{string}, whose elements
must be characters.)  The main uses of vectors in Emacs are as syntax
tables (vectors of integers), keymaps (vectors of commands), and inside
of compiled functions.

  The elements of a vector are numbered starting with zero in Emacs Lisp.

  Vectors are printed with square brackets surrounding the elements
in their order.  Thus, a vector containing the symbols @code{a},
@code{b} and @code{c} is printed as @code{[a b c]}.  You can write
vectors in the same way in Lisp input.

@cindex vector evaluation
  A vector, like a string or a number, is considered a constant:
the result of evaluating it is the same vector.  The elements of the
vector are not evaluated.

  Here are examples of these principles:

@example
(setq avector
      [1 two '(three) "four" [five]])
     @result{} [1 two (quote (three)) "four" [five]]
(eval avector)
     @result{} [1 two (quote (three)) "four" [five]]
(eq avector (eval avector))
     @result{} t
@end example

Here are some functions that relate specifically to vectors:

@defun vectorp object
This function returns @code{t} if the object is a vector.

@example
(vectorp [a])
     @result{} t
(vectorp "asdf")
     @result{} nil
@end example
@end defun

@defun vector &rest objects
This function returns a vector whose elements are the arguments,
@var{objects}.

@example
(vector 'foo 23 [bar baz] "rats")
     @result{} [foo 23 [bar baz] "rats"]
(vector)
     @result{} []
@end example
@end defun

@defun make-vector integer object
This function returns a new vector consisting of @var{integer} elements,
all initialized to @var{object}.

@example
(setq sleepy (make-vector 9 'Z))
     @result{} [Z Z Z Z Z Z Z Z Z]
@end example
@end defun

@defun vconcat &rest sequences
@cindex copying vectors
@cindex copying sequences
This function returns a new vector containing all the elements of the
arguments, @var{sequences}.  These arguments may be lists, vectors, or
strings; they may also be integers.  If no @var{sequences} are given, an
empty vector is returned.

The value is a newly constructed vector which is not @code{eq} to any
existing vector.

@example
(setq a (vconcat '(A B C) '(D E F)))
     @result{} [A B C D E F]
(eq a (vconcat a))
     @result{} nil
(vconcat)
     @result{} []
@end example

@cindex integer to decimal
As a special feature, if one of the @var{sequences} is an integer (not a
sequence of integers), it is first converted to the string of digits
making up the decimal print representation of the integer.  In the
second example below, the number 123 is divided into three digits.  Note
that the @sc{ASCII} code of the character @samp{1} is 49, and that of
@samp{a} is 97.

@example
(vconcat [A B C] 123 "aa" '(foo (6 7)))
     @result{} [A B C 49 50 51 97 97 foo (6 7)]
@end example

For other concatenation functions, @code{mapconcat} in @ref{Mapping Functions}, @code{concat} in @ref{Creating Strings}, and @code{append}
in @ref{Building Cons Cells and Lists}.
@end defun

  The @code{append} function may be used to convert a vector into a list
with the same elements (@pxref{Building Cons Cells and Lists}):

@example
(append avector nil)
     @result{} (1 two (quote (three)) "four" [five])
@end example