Chapter 11
The Built-In Classes
Collections
This section describes the built-in collections, Dylan's aggregate data structures.
Collections are used to hold groups of objects. Collections support iteration as well as
random access through collection keys. An overview of collections is given
in Chapter 8, Collections.
Figure 11-4 shows the built-in collection classes and some of their characteristics.
Figure 11-4 The Collection Classes
S | – Sealed | P | – Primary | C | – Concrete | I | – Instantiable |
O | – Open | F | – Free | A | – Abstract | U | – Uninstantiable |
Errata: In the published book,
the inheritance line descending from <vector>
incorrectly originates
from <empty-list>
in Figure 11-4.
General Collections
<collection>
[Open Abstract Class]
The class of collections, aggregate data structures.
- Superclasses:
<object>
- Init-keywords:
None.
- Description:
-
The class of collections.
<collection>
is the root class of the collection class hierarchy. It provides a set of basic operations on all collections.The element type of
<collection>
isindefinite ⇐ <object>
. - Operations:
-
The class
<collection>
provides the following operations:Table 11-16 Functions on <collection> Function
Description
Page
do
map
Iterates over one or more collections and collects the results in a freshly allocated collection.
map-as
map-into
Iterates over one or more collections and collects the results in an existing mutable collection.
any?
Returns the first true value obtained by iterating over one or more collections.
every?
Table 11-17 Generic Functions on <collection> Function
Description
Page
element
Returns the collection element associated with a particular key.
key-sequence
Returns a sequence containing the keys of its collection argument.
reduce
reduce1
member?
find-key
key-test
Returns the function used by its collection argument to compare keys.
forward-iteration-protocol
Returns a group of functions used to iterate over the elements of a collection.
backward-iteration-protocol
Returns a group of functions used to iterate over the elements of a collection in reverse order.
Table 11-18 Methods on <collection> Function
Description
Page
=
empty?
size
shallow-copy
Table 11-19 Methods on singleton(<collection>) Function
Description
Page
limited
Explicit Key Collections
<explicit-key-collection>
[Open Abstract Class]
The class of all collections that are not sequences.
- Superclasses:
<collection>
- Init-keywords:
None.
- Description:
-
The class of all collections that are not sequences.
This class is disjoint from
<sequence>
becausekey-test
is sealed over the domain<sequence>
.The element type of
<explicit-key-collection>
isindefinite ⇐ <object>
. - Operations:
-
The class
<explicit-key-collection>
provides the following operation:Table 11-20 Methods on singleton(<explicit-key-collection>) Function
Description
Page
limited
Sequences
<sequence>
[Open Abstract Class]
The class of collections whose keys are consecutive integers starting from zero.
- Superclasses:
<collection>
- Init-keywords:
None.
- Description:
-
The class of collections whose keys are consecutive integers starting from zero.
Sequences must be stable under iteration, and the iteration order must match the order of keys. Thus, the key associated with a sequence's iteration state can be determined by keeping a counter in parallel with the iteration state.
The default methods for
add
,add-new
,remove
,choose
,choose-by
,intersection
,union
,remove-duplicates
,copy-sequence
,concatenate
,reverse
, andsort
all return new sequences that are instances of thetype-for-copy
of their primary sequence argument. However, more specialized methods are permitted to choose a more appropriate result class; for example,copy-sequence
of a range returns another range, even though thetype-for-copy
value of a range is the<list>
class.<sequence>
is disjoint from<explicit-key-collection>
because of the sealed domain over the functionkey-test
for<sequence>
.The element type of
<sequence>
isindefinite ⇐ <object>
. - Operations:
-
The class
<sequence>
provides the following operations:Table 11-21 Functions on <sequence> Function
Description
Page
concatenate
concatenate-as
Returns the concatenation of one or more sequences in a sequence of a specified type.
first
second
third
Table 11-22 Generic Functions on <sequence> Function
Description
Page
add
add!
add-new
add-new!
remove
remove!
choose
Returns those elements of a sequence that satisfy a predicate.
choose-by
intersection
union
remove-duplicates
remove-duplicates!
copy-sequence
Returns a freshly allocated copy of some subsequence of a sequence.
replace-subsequence!
Replaces a portion of a sequence with the elements of another sequence.
reverse
Returns a sequence with elements in the reverse order of its argument sequence.
reverse!
Returns a sequence with elements in the reverse order of its argument sequence.
sort
Returns a sequence containing the elements of its argument sequence, sorted.
sort!
Returns a sequence containing the elements of its argument sequence, sorted.
last
subsequence-position
Table 11-23 Methods on <sequence> Function
Description
Page
=
key-test
Returns the function used by its collection argument to compare keys.
Table 11-24 Methods on singleton(<sequence>) Function
Description
Page
limited
Mutable Collections
<mutable-collection>
[Open Abstract Class]
The class of collections that may be modified.
- Superclasses:
<collection>
- Init-keywords:
None.
- Description:
-
The class of collections that may be modified.
Every mutable collection is required to allow modification by implementing
element-setter
.The element type of
<mutable-collection>
isindefinite ⇐ <object>
. - Operations:
-
The class
<mutable-collection>
provides the following operations:Table 11-25 Functions on <mutable-collection> Function
Description
Page
map-into
Iterates over one or more collections and collects the results in an existing mutable collection.
Table 11-26 Generic Functions on <mutable-collection> Function
Description
Page
element-setter
Sets the collection element associated with a particular key.
Table 11-27 Methods on <mutable-collection> Function
Description
Page
type-for-copy
Returns an appropriate type for creating mutable copies of its argument.
Table 11-28 Methods on singleton(<mutable-collection>) Function
Description
Page
limited
<mutable-explicit-key-collection>
[Open Abstract Class]
The class of explicit-key-collections that can have elements replaced.
- Superclasses:
<explicit-key-collection> <mutable-collection>
- Init-keywords:
None.
- Description:
-
The class of explicit-key-collections that can have elements replaced.
The element type of
<mutable-explicit-key-collection>
isindefinite ⇐ <object>
. - Operations:
-
The class
<mutable-explicit-key-collection>
provides the following operations:Table 11-29 Generic Functions on <mutable-explicit-key-collection> Function
Description
Page
remove-key!
Modifies an explicit key collection so it no longer has a particular key.
Table 11-30 Methods on singleton(<mutable-explicit-key-collection>) Function
Description
Page
limited
<mutable-sequence>
[Open Abstract Class]
The class of sequences that may be modified.
- Superclasses:
<sequence> <mutable-collection>
- Init-keywords:
None.
- Description:
-
The class of sequences that may be modified.
The element type of
<mutable-sequence>
isindefinite ⇐ <object>
. - Operations:
-
The class
<mutable-sequence>
provides the following operations:Table 11-31 Functions on <mutable-sequence> Function
Description
Page
first-setter
second-setter
third-setter
Table 11-32 Generic Functions on <mutable-sequence> Function
Description
Page
last-setter
Table 11-33 Methods on singleton(<mutable-sequence>) Function
Description
Page
limited
Stretchy Collections
<stretchy-collection>
[Open Abstract Class]
The class of collections that may grow or shrink to accommodate adding or removing elements.
- Superclasses:
<collection>
- Init-keywords:
None.
- Description:
-
The class of collections that may grow or shrink to accommodate adding or removing elements.
Stretchy collections allow
element-setter
to be called with a key that is not present in the collection, expanding the collection as necessary to add a new element in that case. Each concrete subclass of<stretchy-collection>
must provide or inherit a method forelement-setter
that behaves as follows when there is not already an element present for the indicated key:- If the class is a subclass of
<explicit-key-collection>,
adds a new element to the collection with the indicated key. - If the class is a subclass of
<sequence>,
first callssize-setter
on the key + 1 and the collection to expand the sequence. The key must be a non-negative integer.
The element type of
<stretchy-collection>
isindefinite ⇐ <object>
. - If the class is a subclass of
- Operations:
-
The class
<stretchy-collection>
provides the following operations:Table 11-34 Methods on singleton(<stretchy-collection>) Function
Description
Page
limited
Arrays
<array>
[Open Abstract Instantiable Class]
The class of sequences whose elements are arranged according to a Cartesian coordinate system.
- Superclasses:
<mutable-sequence>
- Init-keywords:
The make method on
singleton(<array>)
accepts the following keyword arguments. Note that these are not inherited by subclasses of<array>
.-
dimensions:
An instance of
<sequence>
with elements that are instances of<integer>
. This argument specifies the dimensions of the array. The size of the sequence specifies the rank (number of dimensions) of the array, and each integer in the sequence specifies the size of a dimension. This argument is required.fill:
An instance of
<object>
specifying an initial value for each element of the array. The default value is#f
.
- Description:
-
The class of collections whose elements are arranged according to a Cartesian coordinate system.
An array element is referred to by a (possibly empty) series of indices. The length of the series must equal the rank of the array. Each index must be a non-negative integer less than the corresponding dimension. An array element may alternatively be referred to by an integer, which is interpreted as a row-major index.
Arrays typically use space efficient representations, and the average time required to access a randomly chosen element is typically sublinear to the number of elements.
When a multi-dimensional array is created, the concrete class that is actually instantiated cannot be any of the specified subclasses of
<array>
, which are all one-dimensional. Every implementation must have one or more concrete subclasses of<array>
that are used for this purpose. These concrete subclasses have no specified names, and their names are not exported by the Dylan module.When a single-dimensional array is created, the array created will be an instance of
<vector>
.Each concrete subclass of
<array>
must either provide or inherit implementations of the functionselement
,element-setter
, anddimensions
.The element type of
<array>
isindefinite ⇐ <object>
. - Operations:
-
The class
<array>
provides the following operations:Table 11-35 Generic Functions on <array> Function
Description
Page
rank
row-major-index
aref
aref-setter
dimensions
dimension
Table 11-36 Methods on <array> Function
Description
Page
size
rank
row-major-index
aref
aref-setter
dimension
Table 11-37 Methods on singleton(<array>) Function
Description
Page
make
limited
Vectors
<vector>
[Open Abstract Instantiable Class]
The class of arrays of rank one (i.e., exactly one dimension).
- Superclasses:
<array>
- Init-keywords:
The make method on
singleton(<vector>)
accepts the following keyword arguments. Note that these are not inherited by subclasses of<vector>
.-
size:
An instance of
<integer>
specifying the size of the vector. The default value is0
.fill:
An instance of
<object>
specifying an initial value for each element of the vector. The default value is#f
.
- Description:
-
The class of one-dimensional arrays.
<vector>
has no direct instances; callingmake
on<vector>
returns an instance of<simple-object-vector>
.Each concrete subclass of
<vector>
must either provide or inherit an implementation ofsize
that shadows the method provided by<array>
.The element type of
<vector>
isindefinite ⇐ <object>
. - Operations:
-
The class
<vector>
provides the following operations:Table 11-38 Constructors for <vector> Function
Description
Page
vector
Table 11-39 Methods on <vector> Function
Description
Page
dimensions
element
Returns the collection element associated with a particular key.
Table 11-40 Methods on singleton(<vector>) Function
Description
Page
make
limited
<simple-vector>
[Sealed Abstract Instantiable Class]
A predefined subclass of <vector>
that provides an efficient
implementation of fixed-length vectors.
- Superclasses:
<vector>
- Init-keywords:
The make method on
singleton(<simple-vector>)
accepts the following keyword arguments. Note that these are not inherited by subclasses of<simple-vector>
.size:
An instance of
<integer>
specifying the size of the vector. The default value is0
.fill:
An instance of
<object>
specifying an initial value for each element of the vector. The default value is#f
.
- Description:
-
The class of simple and efficient vectors.
Calling
make
on a<simple-vector>
returns an instance of<simple-object-vector>
. The size of a simple vector cannot be changed after the simple vector has been created.Vector literals (created with the
#[
…]
syntax) are general instances of<simple-vector>
.The element type of
<simple-vector>
isindefinite ⇐ <object>
.The class
<simple-object-vector>
and the typelimited(<simple-vector>, of: <object>)
have exactly the same instances, but neither is a subtype of the other. The relationship between them is simply that themake
method for the type returns an instance of the class. - Operations:
-
The class
<simple-vector>
provides the following operations:Table 11-41 Methods on <simple-vector> Function
Description
Page
element
Returns the collection element associated with a particular key.
element-setter
Sets the collection element associated with a particular key.
Table 11-42 Methods on singleton(<simple-vector>) Function
Description
Page
make
limited
<simple-object-vector>
[Sealed Instantiable Class]
The class of simple vectors that may have elements of any type.
- Superclasses:
<simple-vector>
- Init-keywords:
The class
<simple-object-vector>
supports the following init-keywords:size:
An instance of
<integer>
specifying the size of the vector. The default value is0
.fill:
An instance of
<object>
specifying the initial value for each element. The default value is#f
.
- Description:
-
The class
<simple-object-vector>
represents vectors that may have elements of any type. It provides a constant time implementation for theelement
andelement-setter
functions.The element type of
<simple-object-vector>
is<object>
. - Operations:
None.
<stretchy-vector>
[Open Abstract Instantiable Primary Class]
The class of vectors that are stretchy.
- Superclasses:
<vector> <stretchy-collection>
- Init-keywords:
The class
<stretchy-vector>
supports the following init-keywords:size:
An instance of
<integer>
specifying the initial size of the stretchy vector. The default value is0
.fill:
An instance of
<object>
specifying the initial value for each element. The default value is#f
.
- Description:
-
The class of vectors that are stretchy.
Because
<stretchy-vector>
is abstract and instantiable but has no specified subclasses, every implementation must provide one or more concrete subclass to instantiate. These concrete subclasses have no specified names, and their names are not exported by the Dylan module.The element type of
<stretchy-vector>
isindefinite ⇐ <object>
.Errata: In the published book, the above sentence said
<simple-vector>
instead of<stretchy-vector>
. - Operations:
The class
<stretchy-vector>
provides the following operations:Table 11-43 Methods on <stretchy-vector> Function
Description
Page
add!
remove!
Table 11-44 Methods on singleton(<stretchy-vector>) Function
Description
Page
limited
Deques
<deque>
[Open Abstract Instantiable Primary Class]
The class of double-ended queues.
- Superclasses:
<mutable-sequence> <stretchy-collection>
- Init-keywords:
The class
<deque>
supports the following init-keywords:size:
An instance of
<integer>
specifying the initial size of the deque. The default value is0
.fill:
An instance of
<object>
specifying the initial value for each element. The default value is#f
.
- Description:
-
A subclass of sequence that supports efficient forward and backward iteration, and efficient addition and removal of elements from the beginning or end of the sequence.
Because
<deque>
is abstract and instantiable but has no specified subclasses, every implementation must provide one or more concrete subclasses to instantiate. These concrete subclasses have no specified names, and their names are not exported by the Dylan module.The element type of
<deque>
isindefinite ⇐ <object>
. - Operations:
-
The class
<deque>
provides the following operations:Table 11-45 Generic Functions on <deque> Function
Description
Page
push
pop
push-last
pop-last
Table 11-46 Methods on <deque> Function
Description
Page
add!
remove!
Table 11-47 Methods on singleton(<deque>) Function
Description
Page
limited
make
Lists
Lists are constructed by linking together instances
of <pair>
. The head of a list contains an element,
and the tail of the list contains a pointer to the next pair in the
list. The list ends when the tail of a pair contains something besides another pair.
A proper list has a final pair with a tail containing the empty list.
An improper list does not have a final pair with a tail
containing the empty list, either because the tail of its final pair is not the empty list,
or because the list is circular and thus does not have a final pair. Except when their
behavior on improper lists is documented explicitly, collection or sequence functions are
not guaranteed to return an answer when an improper list is used as a collection or a
sequence. At the implementation's option, these functions may return the correct result,
signal a <type-error>
, or (in the case of a circular list) fail to
return.
When treated as a collection, the elements of a list are the heads of successive pairs in the list.
<list>
[Sealed Instantiable Abstract Class]
The class of linked lists.
- Superclasses:
<mutable-sequence>
- Init-keywords:
The make method on
singleton(<list>)
accepts the following keyword arguments. Note that these are not inherited by subclasses of<list>
.size:
An instance of
<integer>
specifying the size of the list. The default value is0
.fill:
An instance of
<object>
specifying the initial value for each element. The default value is#f
.
- Description:
-
The class of linked lists.
The
<list>
class is partitioned into two concrete subclasses,<pair>
and<empty-list>
. Calling make on<list>
will return a linked list made from pairs and terminated with the empty list.The element type of
<list>
is<object>
. - Operations:
-
The class
<list>
provides the following operations:Table 11-48 Constructors for <list> Function
Description
Page
list
pair
Table 11-49 Functions on <list> Function
Description
Page
head
tail
Table 11-50 Methods on <list> Function
Description
Page
size
=
add!
remove!
Table 11-51 Methods on singleton(<list>) Function
Description
Page
make
<pair>
[Sealed Instantiable Class]
The class of lists that can have new values assigned to their heads and tails.
- Superclasses:
<list>
- Init-keywords:
None.
- Description:
-
The class of lists that can have new values assigned to their heads and tails.
The element type of
<pair>
is<object>
. - Operations:
-
The following operations are provided on
<pair>
:Table 11-52 Functions on <pair> Function
Description
Page
head-setter
tail-setter
Table 11-53 Constructors for <pair> Function
Description
Page
pair
<empty-list>
[Sealed Instantiable Class]
The class with only one instance, the empty list.
- Superclasses:
<list>
- Init-keywords:
None.
- Description:
-
The class
<empty-list>
has only one instance, the empty list. The empty list is a direct instance of<empty-list>
and an indirect instance of<list>
. Note that<empty-list>
is not==
tosingleton (#())
.The element type of
<empty-list>
is<object>
. - Operations:
Ranges
<range>
[Open Abstract Instantiable Primary Class]
The class of arithmetic sequences.
- Superclasses:
<sequence>
- Init-keywords:
The class
<range>
supports the following init-keywords:from:
An instance of
<real>
specifying the first value in the range. The default value is0
.by:
An instance of
<real>
specifying the step between consecutive elements of the range. The default value is1
.to:
An instance of
<real>
specifying an inclusive bound for the range. Ifby:
is positive, the range will include numbers up to and including this value. Ifby:
is negative, the range will include numbers down to and including this value.to:
cannot be specified withabove:
orbelow:
.above:
An instance of
<real>
specifying an exclusive lower bound for the range. The range will only include numbers above this value, regardless of the sign ofby:
.
above:
cannot be specified withto:
orbelow:
.below:
An instance of
<real>
specifying an exclusive upper bound for the range. The range will only include numbers below this value, regardless of the sign ofby:
.below:
cannot be specified withto:
orabove:
.size:
An instance of
<integer>
specifying the size of the range.
- Description:
-
The class
<range>
is used for creating sequences of numbers. Ranges may be infinite in size, and may run from higher numbers to lower numbers.If
size:
is specified and none ofto:
,above:
orbelow:
is specified, then thesize:
argument determines the size of the range.If
size:
is specified and one ofto:
,above:
orbelow:
is specified, than it is an error if the number of elements implied by theto:
,above:
orbelow:
argument (and theby:
argument, if present) does not agree with the number of elements specified by thesize:
argument.Because
<range>
in abstract and instantiable but has no specified subclasses, every implementation must provide one or more concrete subclass to instantiate. These concrete subclasses have no specified names, and their names are not exported by the Dylan module.The element type of
<range>
isindefinite ⇐ <real>
. - Operations:
-
The class
<range>
provides the following operations:Table 11-54 Methods on <range> Function
Description
Page
member?
size
copy-sequence
Returns a freshly allocated copy of some subsequence of a sequence.
=
reverse
Returns a sequence with elements in the reverse order of its argument sequence.
reverse!
Returns a sequence with elements in the reverse order of its argument sequence.
intersection
type-for-copy
Returns an appropriate type for creating mutable copies of its argument.
Table 11-55 Methods on singleton(<range>) Function
Description
Page
limited
make
Strings
<string>
[Open Abstract Instantiable Class]
The class of sequences with elements that are characters.
- Superclasses:
<mutable-sequence>
- Init-keywords:
The class
<string>
supports the following init-keywords:size:
An instance of
<integer>
specifying the size of the string. The default value is0
.fill:
An instance of
<character>
specifying the initial value for each element. The default value is' '
(space).
- Description:
-
The class
<string>
is used for holding sequences of characters.<string>
has no direct instances; callingmake
on<string>
will return an instance of a concrete subclass of<string>
.The element type of
<string>
isindefinite ⇐ <character>
. - Operations:
-
The class
<string>
provides the following operations:Table 11-56 Methods on <string> Function
Description
Page
<
Returns true if its first operand is less than its second operand.
as-lowercase
as-lowercase!
as-uppercase
as-uppercase!
Table 11-57 Methods on singleton(<string>) Function
Description
Page
limited
<byte-string>
[Sealed Instantiable Class]
The class of vectors with elements that are eight-bit characters.
- Superclasses:
<string>
<vector>
- Init-keywords:
The class
<byte-string>
supports the following init-keywords:size:
An instance of
<integer>
specifying the size of the byte string. The default value is0
.fill:
An instance of
<character>
specifying the initial value for each element. The default value is' '
(space).
- Description:
-
The class
<byte-string>
represents strings with elements that are eight bit characters. It provides constant timeelement
andelement-setter
methods.The element type of
<byte-string>
isindefinite ⇐ K2
(where K2 is a subtype of<character>
). - Operations:
-
The class
<byte-string>
provides the following operations:Table 11-58 Methods on <byte-string> Function
Description
Page
element
Returns the collection element associated with a particular key.
element-setter
Sets the collection element associated with a particular key.
<unicode-string>
[Sealed Instantiable Class]
The class of vectors with elements that are sixteen-bit Unicode characters.
- Superclasses:
<string>
<vector>
- Init-keywords:
The class
<unicode-string>
supports the following init-keywords:size:
An instance of
<integer>
specifying the size of the unicode string. The default value is0
.fill:
An instance of
<character>
specifying the initial value for each element. The default value is' '
(space).
- Description:
-
The class
<unicode-string>
represents strings with elements that are sixteen bit Unicode characters. It provides constant timeelement
andelement-setter
methods.The element type of
<unicode-string>
isindefinite ⇐ K1
(where K1 is a subtype of<character>
). - Operations:
-
The class
<unicode-string>
provides the following operations:Table 11-59 Methods on <unicode-string> Function
Description
Page
element
Returns the collection element associated with a particular key.
element-setter
Sets the collection element associated with a particular key.
Tables
Also called a hash table, a table is an unordered mapping between arbitrary keys and elements. Tables are the only predefined collections that are unstable under iteration.
Tables are stretchy in that they allow the addition and removal of
keys. <table>
and its subclasses are the only predefined classes that are
stretchy but are not stretchy sequences.
For a complete description of tables, see Tables
on
page 122.
<table>
[Open Abstract Instantiable Primary Class]
The class of tables (also known as hash tables).
- Superclasses:
<mutable-explicit-key-collection> <stretchy-collection>
- Init-keywords:
The class
<table>
supports the following init-keyword:size:
An instance of <integer>. If specified, this value provides a hint to the implementation as to the expected number of elements to be stored in the table, which might be used to control how much space to initially allocate for the table. The default value is unspecified.
- Description:
-
The class
<table>
is the only predefined instantiable subclass of<explicit-key-collection>
.Every concrete subclass of
<table>
must provide or inherit a method fortable-protocol
. For details, seeTables
on page 122.<table>
has no direct instances; callingmake
on<table>
will return an instance of<object-table>
.The element type of
<table>
isindefinite ⇐ <object>
. - Operations:
-
The class
<table>
provides the following operations:Table 11-60 Generic Functions on <table> Function
Description
Page
table-protocol
Returns functions used to implement the iteration protocol for tables.
Table 11-61 Methods on <table> Function
Description
Page
forward-iteration-protocol
Returns a group of functions used to iterate over the elements of a collection.
table-protocol
Returns functions used to implement the iteration protocol for tables.
remove-key!
Modifies an explicit key collection so it no longer has a particular key.
element
Returns the collection element associated with a particular key.
element-setter
Sets the collection element associated with a particular key.
size
key-test
Returns the function used by its collection argument to compare keys.
Table 11-62 Methods on singleton(<table>) Function
Description
Page
limited
make
<object-table>
[Open Abstract Instantiable Class]
The class of tables that compare keys using ==.
- Superclasses:
<table>
- Init-keywords:
None.
- Description:
-
Calling
make
on<table>
will return a general instance of<object-table>
. Because<object-table>
is abstract and instantiable but has no specified subclasses, every implementation must provide one or more concrete subclasses to instantiate. These concrete subclasses have no specified names, and their names are not exported by the Dylan module.The element type of
<object-table>
isindefinite ⇐ <object>
. - Operations:
-
The class
<object-table>
provides the following operations:Table 11-63 Methods on <object-table> Function
Description
Page
table-protocol
Returns functions used to implement the iteration protocol for tables.
Table 11-64 Methods on singleton(<object-table>) Function
Description
Page
limited