This SRFI is currently in draft status. Here is an explanation of each status that a SRFI can hold. To provide input on this SRFI, please send email to
firstname.lastname@example.org. To subscribe to the list, follow these instructions. You can access previous messages via the mailing list archive.
writeprocedures and by the program parser so that programs can contain references to literal homogeneous vectors.
c128vectortypes, and by providing analogues for almost all of the heterogeneous vector procedures of SRFI 133. There are some additional procedures, most of which are closely analogous to the string procedures of SRFI 152.
Note that there are no conversions between homogeneous vectors and strings in this SRFI. In addition, there is no support for u1vectors (bitvectors) provided, not because they are not useful, but because they are different enough in both specification and implementation to be put into a future SRFI of their own.
|datatype||type of elements|
|signed exact integer in the range -27 to 27-1|
|unsigned exact integer in the range 0 to 28-1|
|signed exact integer in the range -215 to 215-1|
|unsigned exact integer in the range 0 to 216-1|
|signed exact integer in the range -231 to 231-1|
|unsigned exact integer in the range 0 to 232-1|
|signed exact integer in the range -263 to 263-1|
|unsigned exact integer in the range 0 to 264-1|
|datatype||type of elements|
f64vectors preserve at least as much precision and range as
f32vectors (see the implementation section for details). And there are two datatypes of inexact complex homogeneous vectors (which will be called complex vectors):
|datatype||type of elements|
c128vectors preserve at least as much precision and range as
c64vectors (see the implementation section for details). A Scheme system that conforms to this SRFI does not have to support all of these homogeneous vector datatypes. However, a Scheme system must support float vectors if it supports Scheme inexact reals (of any precision). A Scheme system must support complex vectors if it supports Scheme inexact complex numbers (of any precision). Finally, a Scheme system must support a particular integer vector datatype if the system's exact integer datatype contains all the values that can be stored in such an integer vector. Thus a Scheme system with bignum support must implement all the integer vector datatypes, but a Scheme system might only support
u16vectors if it only supports integers in the range -229 to 229-1 (which would be the case if they are represented as 32-bit machine integers with a 2-bit tag). Scheme systems which conform to this SRFI and also conform to either R6RS or R7RS should use the same datatype for bytevectors and for u8vectors. All other homogeneous vector types are disjoint from each other and from all other Scheme types. Each element of a homogeneous vector must be valid. That is, for an integer vector, it must be an exact integer within the inclusive range specified above; for a float vector, it must be an inexact real number; and for a complex vector, it must be an inexact complex number. It is an error to try to use a constructor or mutator to set an element to an invalid value.
It should be noted that all of the procedures that iterate across multiple vectors in parallel stop iterating and produce the final result when the end of the shortest vector is reached. The sole exception is @vector=, which immediately returns #f if the vectors' lengths are different.
make-@vectoris really shorthand for the descriptions of the twelve procedures
make-c128vector, all of which are exactly the same except that they construct different homogeneous vector types. Furthermore, except as otherwise noted, the semantics of each procedure are those of the corresponding SRFI 133 procedure, except that it is an error to attempt to insert an invalid value into a homogeneous vector. Consequently, only a brief description of each procedure is given, and SRFI 133 (or in some cases SRFI 152) should be consulted for the details.
In the section containing specifications of procedures, the following notation is used to specify parameters and return values:
The procedures shared with SRFI 4 are marked with [SRFI 4]. The procedures with the same semantics as SRFI 133 are marked with [SRFI 133] unless they are already marked with [SRFI 4]. The procedures analogous to SRFI 152 string procedures are marked with [SRFI 152].
(make-@vector size [fill]) -> @vector [SRFI 4]
Returns a @vector whose length is size. If fill is provided, all the elements of the @vector are initialized to it.
(@vector value ...) -> @vector [SRFI 4]
Returns a @vector initialized with values.
(@vector-unfold f length seed ...) -> @vector [SRFI 133]
Create a @vector whose length is length and initialize it by calling f, f(f), f(f(f))) ... on the seed.
(@vector-unfold-right f length seed ...) -> @vector [SRFI 133]
The same as
@vector-unfold, but initializes the @vector from right to left.
(@vector-copy @vec [start [end]]) -> @vector [SRFI 133]
Makes a copy of the portion of @vec from start to end and returns it.
(@vector-reverse-copy @vec [start [end]]) -> @vector [SRFI 133]
The same as
@vector-copy, but in reverse order.
(@vector-append @vec ...) -> @vector [SRFI 133]
Returns a @vector containing all the elements of the @vecs in order.
(@vector-concatenate list-of-@vectors) -> @vector [SRFI 133]
The same as
@vector-append, but takes a list of @vectors rather than
(@vector-append-subvectors [@vec start end] ...) -> @vector [SRFI 133]
Concatenates the result of applying
@vector-copy to each triplet of
@vec, start, end arguments, but may be implemented more efficiently.
(@? obj) -> boolean
#t if obj is a valid element of an
(@vector? obj) -> boolean [SRFI 4]
#t if obj is a @vector, and
(@vector-empty? @vec) -> boolean [SRFI 133]
#tif @vec has a length of zero, and
(@vector= elt=? @vec ...) -> boolean [SRFI 133]
Compares the @vecs for elementwise equality, using elt=? to do the comparisons.
(@vector-ref @vec i) -> value [SRFI 4]
Returns the ith element of @vec.
(@vector-length @vec) -> exact nonnegative integer [SRFI 4]
Returns the length of @vec
(@vector-take @vec n) -> @vector] [SRFI 152]
(@vector-take-right @vec n) -> @vector [SRFI 152]
Returns a @vector containing the first/last n elements of @vec.
(@vector-drop @vec n) -> @vector [SRFI 152]
(@vector-drop-right @vec n) -> @vector [SRFI 152]
Returns a @vector containing all except the first/last n elements of @vec.
(@vector-segment @vec n) -> list [SRFI 152]
Returns a list of @vectors, each of which contains n consecutive elements of @vec. The last @vector may be shorter than n.
(@vector-fold kons knil @vec1 @vec2 ...) -> object [SRFI 133]
(@vector-fold-right kons knil @vec1 @vec2 ...) -> object [SRFI 133]
Folds kons over the elements of @vec in increasing/decreasing order using knil as the initial value.
(@vector-map f @vec1 @vec2 ...) -> @vector [SRFI 133]
(@vector-map! f @vec1 @vec2 ...) -> unspecified [SRFI 133]
(@vector-for-each f @vec1 @vec2 ...) -> unspecified [SRFI 133]
Iterate over the elements of @vec and apply f to each, returning respectively a @vector of the results, an undefined value with the results placed back in @vec, and an undefined value with no change to @vec.
Call pred? on the nth argument of each @vec and
return the number of calls that return true.
(@vector-count pred? @vec1 @vec2 ...) -> exact nonnegative integer [SRFI 133]
(@vector-cumulate f knil @vec) -> @vector [SRFI 133]
@vector-fold, but returns an @vector of partial results
rather than just the final result.
(@vector-take-while @vec pred? -> index [SRFI 152]
(@vector-take-while-right @vec pred? -> index [SRFI 152]
Return the shortest prefix/suffix of @vec all of whose elements satisfy pred?.
(@vector-drop-while @vec pred -> index [SRFI 152]
Drops the longest initial prefix/suffix of @vec such that all its
elements satisfy pred.
(@vector-drop-while-right @vec pred -> index [SRFI 152]
(@vector-index pred? @vec.) -> exact nonnegative integer or #f [SRFI 133]
(@vector-index-right pred? @vec.) -> exact nonnegative integer or #f [SRFI 133]
Return the index of the first/last element of @vec that satisfies pred?.
(@vector-skip pred? @vec) -> exact nonnegative integer or #f [SRFI 133]
(@vector-skip-right pred? @vec.) -> exact nonnegative integer or #f [SRFI 133]
Returns the index of the first/last element of @vec that does not satisfy pred?.
(@vector-binary-search @vec value =) -> exact nonnegative integer or #f [SRFI 133]
Returns the index of any element of @vec that is the same as
value in the sense of the = argument using a binary search.
#f if there is no such element.
(@vector-any pred? @vec1 @vec2 ...) -> value or #f [SRFI 133]
Returns the first set of elements from the @vecs which
satisfy pred?, or
#f if there is no such set.
(@vector-every pred? @vec1 @vec2 ...) -> value or #f [SRFI 133]
If all sets of elements from the @vecs satisfy pred?,
return the last set. If none do, return
(@vector-partition pred? @vec) -> @vector and integer [SRFI 133]
Returns a @vector of the same type as @vec, but with all elements satisfying pred? in the leftmost part of the vector and the other elements in the remaining part. The order of elements is otherwise preserved. Returns two values, the new @vector and the number of elements satisfying pred?.
(@vector-filter pred? @vec -> @vector [SRFI 152]
(@vector-remove pred? @vec -> @vector [SRFI 152]
Return a @vector containing the elements of @vec that satisfy / do not satisfy pred?.
(@vector-set! @vec i value) -> unspecified [SRFI 4]
Sets the ith element of @vec to value.
(@vector-swap! @vec i j) -> unspecified [SRFI 133]
Interchanges the ith and jth elements of @vec.
(@vector-fill! @vec fill [start [end]]) -> unspecified [SRFI 133]
Fills the portion of @vec from start to end with the value fill.
(@vector-reverse! @vec [start [end]]) -> unspecified [SRFI 133]
Reverses the portion of @vec from start to end.
(@vector-copy! @to at @from [start [end]]) -> unspecified [SRFI 133]
Copies the portion of @from from start to end onto @to, starting at index @at.
(@vector-reverse-copy! @to at @from [start [end]]) -> unspecified [SRFI 133]
The same as
@vector-copy!, but copies in reverse.
(@vector->list @vec [start [end]]) -> proper-list [SRFI 4]
(reverse-@vector->list @vec [start [end]]) -> proper-list [SRFI 133]
(list->@vector proper-list) -> @vector [SRFI 4]
(reverse-list->@vector proper-list) -> @vector [SRFI 133]
(@vector->vector @vec) -> vector
(vector->@vector vec) -> @vector
Returns a list, @vector, or heterogeneous vector with the same elements as the argument, in reverse order where specified.
Returns a SRFI 121 generator that generates all the values of @vector in order. Note that the generator is finite.
(write-@vector vec [ port ] ) -> unspecified
Prints to port (the current output port by default) a representation of @vec in the lexical syntax explained below.
writeprocedures and by the program parser. Conformance to this SRFI does not in itself require support for these external representations. For each value of
c128}, if the datatype
@vectoris supported, then the external representation of instances of the datatype
). For example,
#u8(0 #e1e2 #xff)is a
u8vectorof length 3 containing 0, 100 and 255;
f64vectorof length 1 containing -1.5. Note that the syntax for float vectors conflicts with R5RS, which parses
#f32()as 3 objects:
(). For this reason, conformance to this SRFI implies this minor nonconformance to R5RS. This external representation is also available in program source code. For example,
(set! x '#u8(1 2 3))will set
xto the object
#u8(1 2 3). Literal homogeneous vectors, like heterogeneous vectors, are self-evaluating; they do not need to be quoted. Homogeneous vectors can appear in quasiquotations but must not contain
`(,x #u8(1 2))is legal but
`#u8(1 ,x 2)is not). This restriction is to accommodate the many Scheme systems that use the
readprocedure to parse programs.
To reduce its complexity, this implementation is provided only for R7RS systems.
However, making it available on R6RS systems as well as R5RS systems with bytevectors
is straightforward, requiring only a replacement library file that includes the
implementation files in the
(srfi 160 base) is in the repository of this SRFI.
It supports the eight procedures of SRFI 4, namely
list->@vector. These are provided
not only for the ten homogeneous vector types supported by SRFI 4,
but also the two homogeneous vector types beyond the scope of SRFI 4, namely
c64vectors and c128vectors.
In addition, the
@? procedure, which is not in SRFI 4, is available for all types.
The implementation depends on SRFI 4.
For systems that do not have
a native SRFI 4 implementation, the version in the
contrib/cowan directory of the SRFI 4 repository may be used;
it depends only on a minimal implementation of bytevectors.
The following files are provided:
(srfi 160 base)library.
srfi/160/base/complex.scm- Complex number implementation on top of SRFI 4.
srfi/160/base/valid.scm- Valid value predicates.
srfi/160/base/r6rec.scm- Record-type definitions for R6RS.
srfi/160/base/r7rec.scm- Record-type definitions for R7RS.
srfi/160/base/shared-tests.scm- Shared tests (no dependencies).
srfi/160/base/chibi-tests.scm- Chibi test script wrapper.
The sample implementation is (not yet) in the repository of this SRFI.
It depends on the implementation of the
(srfi 160 base) library
described in the previous section.
After downloading the source, it is necessary to run the
shell script in order to generate the individual files for the different types.
This will take
at.sls, for example, and create the files
The heavy lifting is done by
The following files are provided:
atexpander.sh- A trivial shell script using
sedto expand skeleton files into their variants.
srfi/160/at.sld- Skeleton for Chibi libraries. Can be adapted to any R7RS system.
srfi/160/at-133-impl.scm- Skeleton for shared implementation of SRFI 133 procedures.
srfi/160/at-152-impl.scm- Skeleton for shared implementation of SRFI 152 procedures.
srfi/160/at-other-impl.scm- Skeleton for shared implementation of other procedures.
srfi/160/at-tests.scm- Skeleton for SRFI 133 tests (no dependencies).
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.