doc w/o examples and proof-reading
This commit is contained in:
parent
3c234fddc9
commit
12a2b6f06d
|
@ -0,0 +1,348 @@
|
|||
sunterlib/s48/sequences -- Finite Sequences
|
||||
|
||||
A sequence library in various structures dealing with
|
||||
* abstract sequences defined by their behaviour
|
||||
* general sequences or a union type of built-in and abstract sequences
|
||||
* vectors in particular
|
||||
[ for list and string libraries ,open srfi-1 resp. srfi-13 ]
|
||||
|
||||
The library comes in three structures:
|
||||
* BEHAVED-SEQUENCES -- basic procedures for abstract sequences
|
||||
* SEQUENCE-LIB -- B.S. + procedures for general sequences
|
||||
* VECTOR-LIB -- procedures for vectors
|
||||
|
||||
The VECTOR-LIB exports some SCHEME bindings such as VECTOR-REF, but
|
||||
consists mainly of generic sequence code compiled with the basic
|
||||
sequence operation names bound to the corresponding vector procedures.
|
||||
The library is neither complete nor tweaked. (The idea to recycle parts
|
||||
of the srfi-13 code came too late.) It contains the folllowing procedures
|
||||
(in the categories of srfi-13):
|
||||
|
||||
VECTOR-LIB SEQUENCE-LIB BEHAVED-SEQUENCES, also SL
|
||||
* Predicates or so
|
||||
vector? sequence? behaved-sequence?
|
||||
sequence-type?
|
||||
[ versions with 1 sequence and optional start & end parameters ]
|
||||
vector-every sequence-every
|
||||
vector-any sequence-any
|
||||
[ versions with >1 sequence but no optional start & end parameters ]
|
||||
vectors-every sequences-every
|
||||
vectors-any sequences-any
|
||||
|
||||
* Constructors
|
||||
make-vector make-another-sequence make-behaved-sequence/type
|
||||
vector behaved-sequence/type
|
||||
make-sequence-type
|
||||
make-behaved-sequence-record
|
||||
|
||||
* List & Sequence Conversion
|
||||
list->vector list->behaved-sequence/type
|
||||
vector->list sequence->list
|
||||
|
||||
* Selection
|
||||
vector-length sequence-length behaved-sequence-length
|
||||
vector-ref sequence-ref behaved-sequence-ref
|
||||
behaved-sequence:type
|
||||
vector-copy sequence-copy
|
||||
subvector subsequence
|
||||
|
||||
* Modification
|
||||
vector-set! sequence-set! behaved-sequence-set!
|
||||
sequence-fill! vector-fill! behaved-sequence-fill!
|
||||
|
||||
* Reverse & Append
|
||||
vector-append sequence-append
|
||||
|
||||
* Fold, Unfold & Map
|
||||
[ versions with 1 sequence and optional start & end parameters ]
|
||||
vector-map sequence-map
|
||||
vector-for-each sequence-for-each
|
||||
vector-fold sequence-fold
|
||||
vector-fold-right sequence-fold-right
|
||||
[ versions with >1 sequence but no start & end parameters ]
|
||||
vectors-map sequences-map
|
||||
vectors-for-each sequences-for-each
|
||||
vectors-fold sequences-fold
|
||||
vectors-fold-right sequences-fold-right
|
||||
|
||||
NOTE -- Some procedures take several sequence arguments and create a
|
||||
new sequence with the concrete type of the first one: SEQUENCE-APPEND
|
||||
and the SEQUENCES-procedures in the Map etc. category. Problem: the
|
||||
target sequence may accept only elemens of a particular type (think
|
||||
of strings and characters). Solution: Provide a vector, say, as first
|
||||
arg sequence:
|
||||
(sequence-append "aber" '(1) '#(3 3)) breaks, but
|
||||
(sequence-append '#() "aber" '(1) '#(3 3)) succeeds.
|
||||
|
||||
I concede, that's not totally satisfying. A shallow aftertaste of cat
|
||||
pee remains in my mouth.
|
||||
|
||||
*
|
||||
|
||||
Prelude
|
||||
|
||||
For our purposes, (each valid state of) a sequence with length n maps a
|
||||
bounded segment of integers [0:n) into a set of Scheme values, typically
|
||||
Anything or Character. Any kind Se of sequences with elements in T
|
||||
supports the following basic operations:
|
||||
|
||||
maker : make n [x] ==> s
|
||||
n in [0:oo), optional x : T, s : Se
|
||||
The fresh sequence s represents a sequence of length n (mapping to x)
|
||||
predicate : x ==> b
|
||||
x : Anything, b : Boolean
|
||||
the type predicate `x in Se'
|
||||
getter : ref s k ==> s[k]
|
||||
s in Se, k in [0:n) with n = length s, s[k] in T
|
||||
setter : set! s k x ==> unspec
|
||||
s in Se, x in T, k in [0:n) with n = length s
|
||||
effect: s[k] = x, s[other] as before
|
||||
meter : length s ==> n
|
||||
s in ST, n in [0:oo) length of sequence
|
||||
|
||||
|
||||
This sequence facility supports the following kinds of sequences:
|
||||
|
||||
Vector
|
||||
Behaved-Sequence := a record type (record packages data + behaviour)
|
||||
Sequence := Vector | Byte-Vector | String | Proper-List | Behaved-Sequence
|
||||
|
||||
Behaved-Sequences carry a SEQUENCE-TYPE record that contains MAKER,
|
||||
PREDICATE, etc. procedures with the properties sketched above.
|
||||
They are the official backdoor where user-defined sequence types enter
|
||||
the general sequence lib. There are Examples.
|
||||
|
||||
[ Wouldn't ABSEQUENCE have been much more beautiful than BEHAVED-SEQUENCE? ]
|
||||
|
||||
*
|
||||
|
||||
The Procedures
|
||||
|
||||
Optional [START END] (abbreviating [START [END]]) arguments default to 0
|
||||
resp. the sequence length.
|
||||
|
||||
* Predicates
|
||||
|
||||
(vector? x) ==> b
|
||||
(sequence? x) ==> b
|
||||
(behaved-sequence? x) ==> b
|
||||
(sequence-type? x) ==> b
|
||||
|
||||
Synopsis: The obvious type predicates. Note that behaved-sequences
|
||||
are sequences and carry a sequence-type with them. Sequence-types
|
||||
are not sequences but package the behaviour of concrete sequence types.
|
||||
|
||||
*
|
||||
|
||||
(vector-every foo? s [start end]) ==> x
|
||||
(sequence-every foo? s [start end]) ==> x
|
||||
|
||||
Synopsis: Return the value x of (and (foo? s[start]) ... (foo? s[end-1])).
|
||||
|
||||
*
|
||||
|
||||
(vector-any foo? s [start end]) ==> x
|
||||
(sequence-any foo? s [start end]) ==> x
|
||||
|
||||
Synopsis: Return the value x of (or (foo? s[start]) ... (foo? s[end-1])).
|
||||
|
||||
*
|
||||
|
||||
(vectors-every foo? s0 ...) ==> b
|
||||
(sequences-every foo? s [start end]) ==> b
|
||||
|
||||
Synopsis: Return the value x of (and[0<=i<n] (foo? s0[i] ...)) with
|
||||
n := min.k sequence-length sk.
|
||||
|
||||
*
|
||||
|
||||
(vectors-any foo? s0 ...) ==> b
|
||||
(sequences-any foo? s [start end]) ==> b
|
||||
|
||||
Synopsis: Return the value x of (or[0<=i<n] (foo? s0[i] ...)) with
|
||||
n := min.k sequence-length sk.
|
||||
|
||||
*
|
||||
|
||||
Constructors
|
||||
|
||||
(make-vector len [fill]) ==> v
|
||||
(make-behaved-sequence/type st len [fill]) ==> bs
|
||||
|
||||
Synopsis: Make a fresh vector V (behaved-sequence BS with sequence-type
|
||||
ST) of length LEN (and all elements = FILL).
|
||||
|
||||
*
|
||||
|
||||
(vector x0 ...) ==> v
|
||||
(behaved-sequence/type st x0 ...) ==> bs
|
||||
|
||||
Synopsis: Make a fresh vector V (behaved-sequence BS with sequence-type
|
||||
ST) of minimal length with the elements V[0] = X0, ... (BS[0] = X0, ...).
|
||||
|
||||
*
|
||||
|
||||
(make-sequence-type maker predicate getter setter meter) ==> st
|
||||
|
||||
Synopsis: Package the concrete sequence behaviour (basic procedures
|
||||
described in the prelude) in the sequence-type record ST.
|
||||
|
||||
(make-behaved-sequence-record st data) ==> bs
|
||||
Synopsis: Package the sequence-type ST and the concrete sequence DATA
|
||||
in the behaved-sequence record BS.
|
||||
|
||||
*
|
||||
|
||||
List & Sequence Conversion
|
||||
|
||||
(list->vector xs [start end]) ==> v
|
||||
(list->behaved-sequence/type st xs [start end]) ==> bs
|
||||
|
||||
Synopsis: Make a new vector V (behaved-sequence BS with sequence-type ST)
|
||||
representing the sequence xs[start],..,xs[end-1].
|
||||
|
||||
*
|
||||
|
||||
(vector->list v [start end]) ==> xs
|
||||
(sequence->list s [start end]) ==> xs
|
||||
|
||||
Synopsis: Return xs = (list v[start] ... v[end-1]) etc.
|
||||
|
||||
*
|
||||
|
||||
(vector-length v) ==> n
|
||||
(sequence-length s) ==> n
|
||||
(behaved-sequence-length bs) ==> n
|
||||
|
||||
Synopsis: Return length N of sequence represented by V : Vector, S :
|
||||
Sequence, BS : Behaved-Sequence. You knew that, didn't you?
|
||||
|
||||
*
|
||||
|
||||
(vector-ref v k) ==> v[k]
|
||||
(sequence-ref s k) ==> s[k]
|
||||
(behaved-sequence-ref bs k) ==> bs[k]
|
||||
|
||||
*
|
||||
|
||||
(behaved-sequence:type bs) ==> st
|
||||
|
||||
Synopsis: Return sequence-type ST for concrete sequence packaged in
|
||||
behaved-sequence BS.
|
||||
|
||||
*
|
||||
|
||||
(vector-copy v0 [start end]) ==> v1
|
||||
(sequence-copy s0 [start end]) ==> s1
|
||||
|
||||
Synopsis: Copy v0[start],..,v0[end-1] into a new vector v1 of minimal
|
||||
length. Resp. represent s0[start],...,s0[end-1] as a new sequence S1 of
|
||||
the same type.
|
||||
|
||||
*
|
||||
|
||||
(subvector v0 start end) ==> v1
|
||||
(subsequence s0 start end) ==> s1
|
||||
|
||||
Synopsis: Like xxx-copy with obligatory source index bounds.
|
||||
|
||||
*
|
||||
|
||||
Modification
|
||||
|
||||
(vector-set! v i x) ==> unspec
|
||||
(sequence-set! s i x) ==> unspec
|
||||
(behaved-sequence-set! bs i x) ==> unspec
|
||||
|
||||
Synopsis: Set v[i] := x etc.
|
||||
|
||||
*
|
||||
|
||||
(vector-fill! v x [start end]) ==> unspec
|
||||
(sequence-fill! s x [start end]]) ==> unspec
|
||||
(behaved-sequence-fill! bs x [start end]) ==> unspec
|
||||
|
||||
Synopsis: Set v[i] := x for all i in [start:end) etc.
|
||||
|
||||
*
|
||||
|
||||
Reverse & Append
|
||||
|
||||
(vector-append v0 ...) ==> v
|
||||
(sequence-append s0 s1 ...) ==> s
|
||||
|
||||
Synoposis: Make a new vector V (sequence S of type(S0)) representing
|
||||
you know what. See the NOTE above.
|
||||
|
||||
*
|
||||
|
||||
Fold, Unfold & Map
|
||||
|
||||
(vector-map f v [start end]) ==> fv
|
||||
(vectors-map f v0 ...) ==> fv*
|
||||
(sequence-map f s [start end]) ==> fs
|
||||
(sequences-map f s0 s1 ...) ==> fs*
|
||||
|
||||
Synopsis: Make new vector FV (FV*, sequence FS of type(S), FS* of type(S0))
|
||||
representing the sequence f(v[start]),...,f(v[end-1]), resp. the
|
||||
sequence (f(v0[i],...) : 0<=i<n) with n = min.k sequence-length sk, etc.
|
||||
See the NOTE above.
|
||||
|
||||
*
|
||||
|
||||
(vector-for-each proc v [start end]) ==> unspec
|
||||
(vectors-for-each f v0 ...) ==> unspec
|
||||
(sequence-for-each proc s [start end]) ==> unspec
|
||||
(sequences-for-each proc v0 ...) ==> unspec
|
||||
|
||||
Synopsis: Call (proc v[i]) for all i in [start:end) in some order, resp.
|
||||
call (proc v0[i] ...) for all i in [0:n) in some order with
|
||||
n = min.k sequence-length vk, etc.
|
||||
|
||||
*
|
||||
|
||||
(vector-fold kons nil v [start end]) ==> w
|
||||
(vectors-fold kons nil v0 ...) ==> w
|
||||
(sequence-fold kons nil s0 [start end]) ==> s
|
||||
(sequences-fold kons nil s0 ...) ==> s
|
||||
|
||||
Synopsis: Let y o x := (kons x y) resp.
|
||||
y o (x0 ...) := (kons x0 ... y),
|
||||
|
||||
and let o be left-associative (so that we can spare us the brackets).
|
||||
Compute
|
||||
w = nil o v[start] o ... o v[end-1], resp.
|
||||
w = nil o (v0[0] ...) o ... o (v0[n-1] ...)
|
||||
with
|
||||
n := min.k sequence-length vk;
|
||||
|
||||
etc., and see the NOTE above.
|
||||
|
||||
*
|
||||
|
||||
(vector-fold-right kons nil v [start end]) ==> w
|
||||
(vectors-fold-right kons nil v0 ...) ==> w
|
||||
(sequence-fold-right kons nil s0 [start end]) ==> s
|
||||
(sequences-fold-right kons nil s0 ...) ==> s
|
||||
|
||||
Synopsis: Let x o y := (kons x y) resp.
|
||||
(x0 ...) o y := (kons x0 ... y),
|
||||
|
||||
and let o be right-associative (so that we can spare us the brackets).
|
||||
Compute
|
||||
w = v[start] o ... o v[end-1] o nil, resp.
|
||||
w = (v0[0] ...) o ... o (v0[n-1] ...) o nil
|
||||
with
|
||||
n := min.k sequence-length vk;
|
||||
|
||||
etc., and see the NOTE above.
|
||||
|
||||
*
|
||||
|
||||
Examples: forthcoming
|
||||
|
||||
*
|
||||
|
||||
Sela (for now).
|
||||
|
||||
oOo
|
Loading…
Reference in New Issue