@c -*-texinfo-*-@c This is part of the GNU Emacs Lisp Reference Manual.@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2002, 2003,@c 2004, 2005, 2006 Free Software Foundation, Inc.@c See the file elisp.texi for copying conditions.@setfilename ../info/sequences@node Sequences Arrays Vectors, Hash Tables, Lists, Top@chapter Sequences, Arrays, and Vectors@cindex sequence Recall that the @dfn{sequence} type is the union of two other Lisptypes: lists and arrays. In other words, any list is a sequence, andany array is a sequence. The common property that all sequences have isthat each is an ordered collection of elements. An @dfn{array} is a single primitive object that has a slot for eachof its elements. All the elements are accessible in constant time, butthe length of an existing array cannot be changed. Strings, vectors,char-tables and bool-vectors are the four types of arrays. A list is a sequence of elements, but it is not a single primitiveobject; it is made of cons cells, one cell per element. Finding the@var{n}th element requires looking through @var{n} cons cells, soelements farther from the beginning of the list take longer to access.But it is possible to add elements to the list, or remove elements. The following diagram shows the relationship between these types:@example@group _____________________________________________ | | | Sequence | | ______ ________________________________ | | | | | | | | | List | | Array | | | | | | ________ ________ | | | |______| | | | | | | | | | | Vector | | String | | | | | |________| |________| | | | | ____________ _____________ | | | | | | | | | | | | | Char-table | | Bool-vector | | | | | |____________| |_____________| | | | |________________________________| | |_____________________________________________|@end group@end example The elements of vectors and lists may be any Lisp objects. Theelements of strings are all characters.@menu* Sequence Functions:: Functions that accept any kind of sequence.* Arrays:: Characteristics of arrays in Emacs Lisp.* Array Functions:: Functions specifically for arrays.* Vectors:: Special characteristics of Emacs Lisp vectors.* Vector Functions:: Functions specifically for vectors.* Char-Tables:: How to work with char-tables.* Bool-Vectors:: How to work with bool-vectors.@end menu@node Sequence Functions@section Sequences In Emacs Lisp, a @dfn{sequence} is either a list or an array. Thecommon property of all sequences is that they are ordered collections ofelements. This section describes functions that accept any kind ofsequence.@defun sequencep objectReturns @code{t} if @var{object} is a list, vector, string,bool-vector, or char-table, @code{nil} otherwise.@end defun@defun length sequence@cindex string length@cindex list length@cindex vector length@cindex sequence length@cindex char-table lengthThis function returns the number of elements in @var{sequence}. If@var{sequence} is a dotted list, a @code{wrong-type-argument} error issignaled. Circular lists may cause an infinite loop. For achar-table, the value returned is always one more than the maximumEmacs character code.@xref{Definition of safe-length}, for the related function @code{safe-length}.@example@group(length '(1 2 3)) @result{} 3@end group@group(length ()) @result{} 0@end group@group(length "foobar") @result{} 6@end group@group(length [1 2 3]) @result{} 3@end group@group(length (make-bool-vector 5 nil)) @result{} 5@end group@end example@end defun@defun string-bytes string@cindex string, number of bytesThis function returns the number of bytes in @var{string}.If @var{string} is a multibyte string, this is greater than@code{(length @var{string})}.@end defun@defun elt sequence index@cindex elements of sequencesThis function returns the element of @var{sequence} indexed by@var{index}. Legitimate values of @var{index} are integers rangingfrom 0 up to one less than the length of @var{sequence}. If@var{sequence} is a list, out-of-range values behave as for@code{nth}. @xref{Definition of nth}. Otherwise, out-of-range valuestrigger an @code{args-out-of-range} error.@example@group(elt [1 2 3 4] 2) @result{} 3@end group@group(elt '(1 2 3 4) 2) @result{} 3@end group@group;; @r{We use @code{string} to show clearly which character @code{elt} returns.}(string (elt "1234" 2)) @result{} "3"@end group@group(elt [1 2 3 4] 4) @error{} Args out of range: [1 2 3 4], 4@end group@group(elt [1 2 3 4] -1) @error{} Args out of range: [1 2 3 4], -1@end group@end exampleThis function generalizes @code{aref} (@pxref{Array Functions}) and@code{nth} (@pxref{Definition of nth}).@end defun@defun copy-sequence sequence@cindex copying sequencesReturns a copy of @var{sequence}. The copy is the same type of objectas 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 newsequence are not copies; they are identical (@code{eq}) to the elementsof the original. Therefore, changes made within these elements, asfound via the copied sequence, are also visible in the originalsequence.If the sequence is a string with text properties, the property list inthe copy is itself a copy, not shared with the original's propertylist. However, the actual values of the properties are shared.@xref{Text Properties}.This function does not work for dotted lists. Trying to copy acircular list may cause an infinite loop.See also @code{append} in @ref{Building Lists}, @code{concat} in@ref{Creating Strings}, and @code{vconcat} in @ref{Vector Functions},for other ways to copy sequences.@example@group(setq bar '(1 2)) @result{} (1 2)@end group@group(setq x (vector 'foo bar)) @result{} [foo (1 2)]@end group@group(setq y (copy-sequence x)) @result{} [foo (1 2)]@end group@group(eq x y) @result{} nil@end group@group(equal x y) @result{} t@end group@group(eq (elt x 1) (elt y 1)) @result{} t@end group@group;; @r{Replacing an element of one sequence.}(aset x 0 'quux)x @result{} [quux (1 2)]y @result{} [foo (1 2)]@end group@group;; @r{Modifying the inside of a shared element.}(setcar (aref x 1) 69)x @result{} [quux (69 2)]y @result{} [foo (69 2)]@end group@end example@end defun@node Arrays@section Arrays@cindex array An @dfn{array} object has slots that hold a number of other Lispobjects, called the elements of the array. Any element of an array maybe accessed in constant time. In contrast, an element of a listrequires access time that is proportional to the position of the elementin the list. Emacs defines four types of array, all one-dimensional: @dfn{strings},@dfn{vectors}, @dfn{bool-vectors} and @dfn{char-tables}. A vector is ageneral array; its elements can be any Lisp objects. A string is aspecialized array; its elements must be characters. Each type of arrayhas its own read syntax.@xref{String Type}, and @ref{Vector Type}. All four kinds of array share these characteristics:@itemize @bullet@itemThe first element of an array has index zero, the second element hasindex 1, and so on. This is called @dfn{zero-origin} indexing. Forexample, an array of four elements has indices 0, 1, 2, @w{and 3}.@itemThe length of the array is fixed once you create it; you cannotchange the length of an existing array.@itemFor purposes of evaluation, the array is a constant---in other words,it evaluates to itself.@itemThe elements of an array may be referenced or changed with the functions@code{aref} and @code{aset}, respectively (@pxref{Array Functions}).@end itemize When you create an array, other than a char-table, you must specifyits length. You cannot specify the length of a char-table, because thatis determined by the range of character codes. In principle, if you want an array of text characters, you could useeither a string or a vector. In practice, we always choose strings forsuch applications, for four reasons:@itemize @bullet@itemThey occupy one-fourth the space of a vector of the same elements.@itemStrings are printed in a way that shows the contents more clearlyas text.@itemStrings can hold text properties. @xref{Text Properties}.@itemMany of the specialized editing and I/O facilities of Emacs accept onlystrings. For example, you cannot insert a vector of characters into abuffer the way you can insert a string. @xref{Strings and Characters}.@end itemize By contrast, for an array of keyboard input characters (such as a keysequence), a vector may be necessary, because many keyboard inputcharacters are outside the range that will fit in a string. @xref{KeySequence Input}.@node Array Functions@section Functions that Operate on Arrays In this section, we describe the functions that accept all types ofarrays.@defun arrayp objectThis function returns @code{t} if @var{object} is an array (i.e., avector, a string, a bool-vector or a char-table).@example@group(arrayp [a]) @result{} t(arrayp "asdf") @result{} t(arrayp (syntax-table)) ;; @r{A char-table.} @result{} t@end group@end example@end defun@defun aref array index@cindex array elementsThis function returns the @var{index}th element of @var{array}. Thefirst element is at index zero.@example@group(setq primes [2 3 5 7 11 13]) @result{} [2 3 5 7 11 13](aref primes 4) @result{} 11@end group@group(aref "abcdefg" 1) @result{} 98 ; @r{@samp{b} is @acronym{ASCII} code 98.}@end group@end exampleSee also the function @code{elt}, in @ref{Sequence Functions}.@end defun@defun aset array index objectThis function sets the @var{index}th element of @var{array} to be@var{object}. It returns @var{object}.@example@group(setq w [foo bar baz]) @result{} [foo bar baz](aset w 0 'fu) @result{} fuw @result{} [fu bar baz]@end group@group(setq x "asdfasfd") @result{} "asdfasfd"(aset x 3 ?Z) @result{} 90x @result{} "asdZasfd"@end group@end exampleIf @var{array} is a string and @var{object} is not a character, a@code{wrong-type-argument} error results. The function converts aunibyte string to multibyte if necessary to insert a character.@end defun@defun fillarray array objectThis function fills the array @var{array} with @var{object}, so thateach element of @var{array} is @var{object}. It returns @var{array}.@example@group(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]@end group@group(setq s "When in the course") @result{} "When in the course"(fillarray s ?-) @result{} "------------------"@end group@end exampleIf @var{array} is a string and @var{object} is not a character, a@code{wrong-type-argument} error results.@end defunThe general sequence functions @code{copy-sequence} and @code{length}are often useful for objects known to be arrays. @xref{Sequence Functions}.@node Vectors@section Vectors@cindex vector Arrays in Lisp, like arrays in most languages, are blocks of memorywhose elements can be accessed in constant time. A @dfn{vector} is ageneral-purpose array of specified length; its elements can be any Lispobjects. (By contrast, a string can hold only characters as elements.)Vectors in Emacs are used for obarrays (vectors of symbols), and as partof keymaps (vectors of commands). They are also used internally as partof the representation of a byte-compiled function; if you print such afunction, you will see a vector in it. In Emacs Lisp, the indices of the elements of a vector start from zeroand count up from there. Vectors are printed with square brackets surrounding the elements.Thus, a vector whose elements are the symbols @code{a}, @code{b} and@code{a} is printed as @code{[a b a]}. You can write vectors in thesame way in Lisp input. A vector, like a string or a number, is considered a constant forevaluation: the result of evaluating it is the same vector. This doesnot evaluate or even examine the elements of the vector.@xref{Self-Evaluating Forms}. Here are examples illustrating these principles:@example@group(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 group@end example@node Vector Functions@section Functions for Vectors Here are some functions that relate to vectors:@defun vectorp objectThis function returns @code{t} if @var{object} is a vector.@example@group(vectorp [a]) @result{} t(vectorp "asdf") @result{} nil@end group@end example@end defun@defun vector &rest objectsThis function creates and returns a vector whose elements are thearguments, @var{objects}.@example@group(vector 'foo 23 [bar baz] "rats") @result{} [foo 23 [bar baz] "rats"](vector) @result{} []@end group@end example@end defun@defun make-vector length objectThis function returns a new vector consisting of @var{length} elements,each initialized to @var{object}.@example@group(setq sleepy (make-vector 9 'Z)) @result{} [Z Z Z Z Z Z Z Z Z]@end group@end example@end defun@defun vconcat &rest sequences@cindex copying vectorsThis function returns a new vector containing all the elements of the@var{sequences}. The arguments @var{sequences} may be true lists,vectors, strings or bool-vectors. If no @var{sequences} are given, anempty vector is returned.The value is a newly constructed vector that is not @code{eq} to anyexisting vector.@example@group(setq a (vconcat '(A B C) '(D E F))) @result{} [A B C D E F](eq a (vconcat a)) @result{} nil@end group@group(vconcat) @result{} [](vconcat [A B C] "aa" '(foo (6 7))) @result{} [A B C 97 97 foo (6 7)]@end group@end exampleThe @code{vconcat} function also allows byte-code function objects asarguments. This is a special feature to make it easy to access the entirecontents of a byte-code function object. @xref{Byte-Code Objects}.In Emacs versions before 21, the @code{vconcat} function allowedintegers as arguments, converting them to strings of digits, but thatfeature has been eliminated. The proper way to convert an integer toa decimal number in this way is with @code{format} (@pxref{FormattingStrings}) or @code{number-to-string} (@pxref{String Conversion}).For other concatenation functions, see @code{mapconcat} in @ref{MappingFunctions}, @code{concat} in @ref{Creating Strings}, and @code{append}in @ref{Building Lists}.@end defun The @code{append} function provides a way to convert a vector into alist with the same elements (@pxref{Building Lists}):@example@group(setq avector [1 two (quote (three)) "four" [five]]) @result{} [1 two (quote (three)) "four" [five]](append avector nil) @result{} (1 two (quote (three)) "four" [five])@end group@end example@node Char-Tables@section Char-Tables@cindex char-tables@cindex extra slots of char-table A char-table is much like a vector, except that it is indexed bycharacter codes. Any valid character code, without modifiers, can beused as an index in a char-table. You can access a char-table'selements with @code{aref} and @code{aset}, as with any array. Inaddition, a char-table can have @dfn{extra slots} to hold additionaldata not associated with particular character codes. Char-tables areconstants when evaluated.@cindex subtype of char-table Each char-table has a @dfn{subtype} which is a symbol. The subtypehas two purposes: to distinguish char-tables meant for different uses,and to control the number of extra slots. For example, display tablesare char-tables with @code{display-table} as the subtype, and syntaxtables are char-tables with @code{syntax-table} as the subtype. A validsubtype must have a @code{char-table-extra-slots} property which is aninteger between 0 and 10. This integer specifies the number of@dfn{extra slots} in the char-table.@cindex parent of char-table A char-table can have a @dfn{parent}, which is another char-table. Ifit does, then whenever the char-table specifies @code{nil} for aparticular character @var{c}, it inherits the value specified in theparent. In other words, @code{(aref @var{char-table} @var{c})} returnsthe value from the parent of @var{char-table} if @var{char-table} itselfspecifies @code{nil}.@cindex default value of char-table A char-table can also have a @dfn{default value}. If so, then@code{(aref @var{char-table} @var{c})} returns the default valuewhenever the char-table does not specify any other non-@code{nil} value.@defun make-char-table subtype &optional initReturn a newly created char-table, with subtype @var{subtype}. Eachelement is initialized to @var{init}, which defaults to @code{nil}. Youcannot alter the subtype of a char-table after the char-table iscreated.There is no argument to specify the length of the char-table, becauseall char-tables have room for any valid character code as an index.@end defun@defun char-table-p objectThis function returns @code{t} if @var{object} is a char-table,otherwise @code{nil}.@end defun@defun char-table-subtype char-tableThis function returns the subtype symbol of @var{char-table}.@end defun@defun set-char-table-default char-table char new-defaultThis function sets the default value of generic character @var{char}in @var{char-table} to @var{new-default}.There is no special function to access default values in a char-table.To do that, use @code{char-table-range} (see below).@end defun@defun char-table-parent char-tableThis function returns the parent of @var{char-table}. The parent isalways either @code{nil} or another char-table.@end defun@defun set-char-table-parent char-table new-parentThis function sets the parent of @var{char-table} to @var{new-parent}.@end defun@defun char-table-extra-slot char-table nThis function returns the contents of extra slot @var{n} of@var{char-table}. The number of extra slots in a char-table isdetermined by its subtype.@end defun@defun set-char-table-extra-slot char-table n valueThis function stores @var{value} in extra slot @var{n} of@var{char-table}.@end defun A char-table can specify an element value for a single character code;it can also specify a value for an entire character set.@defun char-table-range char-table rangeThis returns the value specified in @var{char-table} for a range ofcharacters @var{range}. Here are the possibilities for @var{range}:@table @asis@item @code{nil}Refers to the default value.@item @var{char}Refers to the element for character @var{char}(supposing @var{char} is a valid character code).@item @var{charset}Refers to the value specified for the whole character set@var{charset} (@pxref{Character Sets}).@item @var{generic-char}A generic character stands for a character set, or a row of acharacter set; specifying the generic character as argument isequivalent to specifying the character set name. @xref{SplittingCharacters}, for a description of generic characters.@end table@end defun@defun set-char-table-range char-table range valueThis function sets the value in @var{char-table} for a range ofcharacters @var{range}. Here are the possibilities for @var{range}:@table @asis@item @code{nil}Refers to the default value.@item @code{t}Refers to the whole range of character codes.@item @var{char}Refers to the element for character @var{char}(supposing @var{char} is a valid character code).@item @var{charset}Refers to the value specified for the whole character set@var{charset} (@pxref{Character Sets}).@item @var{generic-char}A generic character stands for a character set; specifying the genericcharacter as argument is equivalent to specifying the character setname. @xref{Splitting Characters}, for a description of generic characters.@end table@end defun@defun map-char-table function char-tableThis function calls @var{function} for each element of @var{char-table}.@var{function} is called with two arguments, a key and a value. The keyis a possible @var{range} argument for @code{char-table-range}---eithera valid character or a generic character---and the value is@code{(char-table-range @var{char-table} @var{key})}.Overall, the key-value pairs passed to @var{function} describe all thevalues stored in @var{char-table}.The return value is always @code{nil}; to make this function useful,@var{function} should have side effects. For example,here is how to examine each element of the syntax table:@example(let (accumulator) (map-char-table #'(lambda (key value) (setq accumulator (cons (list key value) accumulator))) (syntax-table)) accumulator)@result{}((475008 nil) (474880 nil) (474752 nil) (474624 nil) ... (5 (3)) (4 (3)) (3 (3)) (2 (3)) (1 (3)) (0 (3)))@end example@end defun@node Bool-Vectors@section Bool-vectors@cindex Bool-vectors A bool-vector is much like a vector, except that it stores only thevalues @code{t} and @code{nil}. If you try to store any non-@code{nil}value into an element of the bool-vector, the effect is to store@code{t} there. As with all arrays, bool-vector indices start from 0,and the length cannot be changed once the bool-vector is created.Bool-vectors are constants when evaluated. There are two special functions for working with bool-vectors; asidefrom that, you manipulate them with same functions used for other kindsof arrays.@defun make-bool-vector length initialReturn a new bool-vector of @var{length} elements,each one initialized to @var{initial}.@end defun@defun bool-vector-p objectThis returns @code{t} if @var{object} is a bool-vector,and @code{nil} otherwise.@end defun Here is an example of creating, examining, and updating abool-vector. Note that the printed form represents up to 8 booleanvalues as a single character.@example(setq bv (make-bool-vector 5 t)) @result{} #&5"^_"(aref bv 1) @result{} t(aset bv 3 nil) @result{} nilbv @result{} #&5"^W"@end example@noindentThese results make sense because the binary codes for control-_ andcontrol-W are 11111 and 10111, respectively.@ignore arch-tag: fcf1084a-cd29-4adc-9f16-68586935b386@end ignore