This is the gtwiwtg Reference Manual, version 0.5.0, generated automatically by Declt version 4.0 beta 2 "William Riker" on Sun Dec 15 06:20:32 2024 GMT+0.
The main system appears first, followed by any subsystem dependency.
gtwiwtg
Lazy-ish iterators
Colin <colin@cicadas.surf>
GPLv3
0.5.0
package.lisp
(file).
gtwiwtg.lisp
(file).
anaphora.lisp
(file).
Files are sorted by type and then listed depth-first from the systems components trees.
gtwiwtg/gtwiwtg.lisp
package.lisp
(file).
gtwiwtg
(system).
argmax
(function).
argmin
(function).
average
(function).
best
(function).
collect
(function).
concat!
(function).
file-bytes
(function).
file-chars
(function).
file-lines
(function).
filter!
(function).
fold
(macro).
for
(macro).
from-input-stream
(function).
from-recurrence
(function).
from-thunk
(function).
from-thunk-times
(function).
from-thunk-until
(function).
indexed!
(function).
inflate!
(function).
inject!
(function).
intersperse!
(function).
make-resumable!
(function).
map!
(function).
maximum
(function).
merge!
(function).
minimum
(function).
noise
(function).
pick-out
(function).
range
(function).
repeater
(function).
resume!
(function).
seq
(function).
size
(function).
take
(function).
times
(function).
truncate!
(function).
with-generator
(macro).
zip!
(function).
a-generator-class
(macro).
all-clean
(function).
all-different
(function).
all-good
(function).
can-be-resumed-p
(function).
dirty-p
(reader method).
(setf dirty-p)
(writer method).
filtered-generator!
(class).
generator!
(class).
has-next-p
(generic function).
list-backed-generator!
(class).
make-dirty
(function).
make-keyword
(function).
next
(generic function).
range-backed-generator!
(class).
resumable-generator!
(class).
resumablep
(function).
sequence-backed-generator!
(class).
stop
(generic function).
stopped-p
(reader method).
(setf stopped-p)
(writer method).
stream-backed-generator!
(class).
sully-when-clean
(function).
thunk-backed-generator!
(class).
gtwiwtg/anaphora.lisp
gtwiwtg.lisp
(file).
gtwiwtg
(system).
Packages are listed by definition order.
gtwiwtg
common-lisp
.
argmax
(function).
argmin
(function).
average
(function).
best
(function).
collect
(function).
concat!
(function).
file-bytes
(function).
file-chars
(function).
file-lines
(function).
filter!
(function).
fold
(macro).
for
(macro).
from-input-stream
(function).
from-recurrence
(function).
from-thunk
(function).
from-thunk-times
(function).
from-thunk-until
(function).
indexed!
(function).
inflate!
(function).
inject!
(function).
intersperse!
(function).
make-resumable!
(function).
map!
(function).
maximum
(function).
merge!
(function).
minimum
(function).
noise
(function).
pick-out
(function).
range
(function).
repeater
(function).
resume!
(function).
seq
(function).
size
(function).
take
(function).
times
(function).
truncate!
(function).
with-generator
(macro).
zip!
(function).
a-generator-class
(macro).
all-clean
(function).
all-different
(function).
all-good
(function).
can-be-resumed-p
(function).
dirty-p
(generic reader).
(setf dirty-p)
(generic writer).
filtered-generator!
(class).
generator!
(class).
has-next-p
(generic function).
list-backed-generator!
(class).
make-dirty
(function).
make-keyword
(function).
next
(generic function).
range-backed-generator!
(class).
resumable-generator!
(class).
resumablep
(function).
sequence-backed-generator!
(class).
stop
(generic function).
stopped-p
(generic reader).
(setf stopped-p)
(generic writer).
stream-backed-generator!
(class).
sully-when-clean
(function).
thunk-backed-generator!
(class).
Definitions are sorted by export status, category, package, and then by lexicographic order.
Anaphoric FOLD. Binds the values produced by GENERATOR to IT, and
binds the accumulating variable to ACC.
Example:
> (afold 0 (times 10) (+ acc it))
45
Anaphoric FOR. Binds the values produced by GENERATOR to the variable IT.
Example:
> (afor (times 3) (print it))
0
1
2
The accumulating generator consumer.
ACC is a symbol and INIT-VAL is any lisp expression. ACC is where
intermediate results are accmulated. INIT-VAL is evaluated to
initialize ACC.
VAR-EXP can be either a symbol, or a form suitable for using as the
binding form in DESTRUCTURING-BIND.
GEN is an expression that should evaluate to a generator.
EXPR is a sigle lisp expression the value of which becomes bound to
ACC on each iteration.
When iteration has concluded, ACC becomes the value of the FOLD form.
Example: standard summing
> (fold (sum 0) (x (times 10)) (+ sum x))
45
Example: a usless calculation
> (fold (acc 0)
((x y) (zip! (times 10) (range :by -1)))
(sqrt (+ acc (* x y))))
#C(0.444279 8.986663)
Example: building data
> (fold (plist nil)
((key val)
(zip! (seq ’(:name :occupation :hobbies))
(seq ’("buckaroo banzai"
"rocker"
("neuroscience" "particle physics" "piloting fighter jets")))))
(cons key (cons val plist)))
(:HOBBIES ("neuroscience" "particle physics" "piloting fighter jets")
:OCCUPATION "rocker" :NAME "buckaroo banzai")
The basic generator consumer.
VAR-EXP can be either a symbol, or a form suitable for using as the
binding form in a DESTRUCTURING-BIND.
GEN is an expression that should evaluate to a generator.
BODY is a list of any forms you like. These forms will be evaluated
for each value produced by GEN.
FOR akes care of running any clean up that the generator
requires. E.g. If the generator is backed by an open stream, the
stream will be closed. E.g. If the generator was built using
FROM-THUNK-UNTIL, then the CLEAN-UP thunk will be run before FOR
exits.
Every other consumer is built on top of FOR, and hence, every other
consumer will also perform clean up.
Example:
(for (x y) (zip! (repeater ’a ’b ’c) (times 5))
(format t "~a – ~a~%" x y))
A – 0
B – 1
A – 2
B – 3
A – 4
Use this if you absolutely must manually call NEXT and HAS-NEXT-P. It will ensure that the generator bound to VAR will be stopped and cleaned up properly.
Consumes GEN. Returns a pair (X . VALUE) such that (FUNCALL FN X)
is maximal among the values of GEN. VALUE is the value of (FUNCALL FN X)
Consumes GEN. Returns a pair (X . VALUE) such that (FUNCALL FN X)
is minimal among the values of GEN. VALUE is the value of (FUNCALL FN X)
Consumes GEN, returning its average value.
Consumes GEN. CHOOSER is a function of two arguments that returns one of them. Returns the member of GEN that is consistently chosen. Chooser should be transitive. Returns NIL if GEN is empty.
Consumes GEN by collecting its values into a list.
Returns a generator that is the concatenation of the generators
passed as arguments.
Error Conditions:
- If any of the generators compare EQL, an error will be signalled.
- If any of the generators has been used elsewhere, an error will be sigalled.
Creates a generator that produces the bytes of a file. The
stream to the file is closed when the generator finishes.
FILE is a path to a file.
The last generated value of the returned generator will be NIL.
Creates a generator that produces the characters of a file. The
stream to the file is closed when the generator finishes.
FILE is a path to a file.
The last generated value of the returned generator will be NIL.
Creates a generator that produces the lines of a file. See FROM-INPUT-STREAM for more details about stream-backed-generators.
FILE is a path to a file.
The last generated value of the returned generator will be NIL.
Creats a generator that generates the values of GEN for which PRED is non null.
Error Condition:
- If GEN has been used elsewhere, an error will be signalled.
Create a generator from a STREAM.
You must supply as STREAM-READER function that accepts the stream as
its only argument and returns NIL when the stream has run out of data,
Non-NIL otherwise.
The new generator will return NIL as its final generated value..
Consumers of the new generator (forms like FOR, FOLD, COLLECT, and so
on) will ensure that the stream is properly closed - you don’t need to
worry. If, however, you create a stream-backed-generator but do not
actually consume it, then the stream will not be properly closed.
Always consume your generators by passing them to a consumer!
Here is an example:
(take 2 (from-input-stream
(open "hey.txt")
(lambda (s) (read-char s nil nil))))
(#\h #\e)
Creates a generator from a recurrence relation.
REC is a function of M arguments.
The Nth value of the series generated by the new generator is the result of
calling REC on the previoius M results.
N-1 and N-M are used to initialize the recurrence. (1+ (LENGTH N-M))
should be M, the number of arguments acepted by REC.
Example
> (let ((fibs (from-recurrence #’+ 1 0)))
(take 10 fibs))
(1 2 3 5 8 13 21 34 55 89)
Creates a generator that produces an inifinte series of values that
are the return value of (FUNCALL THUNK).
If you need to create a stopping condition on your thunk-backed generator, see FROM-THUNK-UNTIL.
Creates a generator that produces its values by calling (FUNCALL THUNK) exactly TIMES times.
Creates a generator that produces a series of values by successively
calling (FUNCALL THUNK). The iterator stops whenever (FUNCALL UNTIL)
is non null.
If a CLEAN-UP thunk is supplied, it will be run after the consumption
of the new generator has finished. (Consumers are forms like FOR,
COLLECT, FOLD, and so on.)
By default, UNTIL is the function (CONSTANTLY NIL). I.e. it will generate forever.
Is shorthand for (ZIP! (RANGE) GEN)
FN is expected to be a function that accepts elements of GEN and
returns a new generator.
The generator (INFLATE! FN GEN) generates each element of an
intermediate generator (FN X) for each X generated by GEN.
When a thunk is supplied to EXTRA-CLEANUP, then that thunk will be
called when the inflated generator is stopped. EXTRA-CLEANUP exists
for the case when FN returns generators that are not being created
within the body of FN, but are merely being "looked up" somehow. See
the implementation of CONCAT! for an example.
Here is an example:
> (let ((keys (seq ’(:name :occupation :hobbies)))
(vals (seq ’("buckaroo banzai"
"rocker"
("neuroscience" "particle physics" "piloting fighter jets")))))
(collect (inflate! #’seq (zip! keys vals))))
(:NAME "buckaroo banzai"
:OCCUPATION "rocker"
:HOBBIES ("neuroscience" "particle physics" "piloting fighter jets"))
Error Conditions:
- If GEN has been used elsewhere, an error will be signalled.
Injects an effect into a generator. Use this to add a side-effect
to the value generation process.
Under most circumstances, the new generator produces exactly the same
values as GEN. If, however, the values generated by GEN are being
looked up in some remote memory location, and if FN is mutating that
memory, then the new generator may produce different values.
Possibly good for debugging.
Example:
> (map! #’reverse
(inject! #’print ; look at values before they’re reversed
(zip! (range)
(repeater :cool :beans)
(seq "banzai!"))))
> (collect *)
(0 :COOL #b) ;these are printed to stdout
(1 :BEANS #a)
(2 :COOL #n)
(3 :BEANS #z)
(4 :COOL #a)
(5 :BEANS #i)
((#b :COOL 0) ; and this is what collect returns
(#a :BEANS 1)
(#n :COOL 2)
(#z :BEANS 3)
(#a :COOL 4)
(#i :BEANS 5))
Produces a generator that intersperses one value from each of its
argument generators, one after the other, until any of those
generators run out of values.
Examples:
> (intersperse! (seq ’(:name :job :hobbies))
(seq ’("buckaroo banzai"
"rocker"
("neuroscience"
"particle physics"
"flying fighter jets"))))
> (collect *)
(:NAME "buckaroo banzai" :JOB "rocker" :HOBBIES
("neuroscience" "particle physics" "flying fighter jets"))
> (intersperse! (times 5) (repeater ’a ’b ’c) (range :by -10))
> (collect *)
(0 A 0 1 B -10 2 C -20 3 A -30 4 B -40)
Makes a generator resumable.
> (defvar *foobar* (make-resumable! (range)))
*FOOBAR*
> (take 10 *foobar*)
(0 1 2 3 4 5 6 7 8 9)
> (setf *foobar* (resume! *foobar*))
> (take 10 *foobar*)
(10 11 12 13 14 15 16 17 18 19)
Maps a function over a number of generators, returning a generator
that produces values that result from calling MAP-FN on those
generators’ values, in sequence.
The resulting generator will stop producing values as soon as any one
of the source generators runs out of arguments to pass to
MAP-FN. I.e. The new generator is as long as the shortest argument.
Error Conditions:
- If any of the generators compare EQL an error will be signalled
- If any of the generators have been used elsewhere, an error will be signalled.
Consumes GEN, returning its maximum value.
Emulates the behavior of MERGE (in the ANSI standard), but for generators.
The emulation is not perfect, but it holds in the following sense: If
all the inputs are sorted according to COMPARATOR then the output will
also be sorted according to COMPARATOR.
The generator created through a merge has a length that is the sum of
the lengths of the arguments to MERGE!. Hence, if any of the arguments
is an infinite generator, then the new generator is also infinite.
An example:
> (collect (merge! #’<
(times 4)
(range :from 4 :to 10 :by 2)
(range :from -10 :to 28 :by 6)))
(-10 -4 0 1 2 2 3 4 6 8 8 14 20 26)
Error Conditions:
- If any of the generators compare EQL, an error will be signalled.
- If any of the generators have been used elsewhere, an error will be signalled.
Consumes GEN, returning its minimum value.
Creates a generator that produces an infinite series of random numbers that are the result of calling (RANDOM ARG).
Consumes GEN by picking out certain members by their index.
INDEXES is a list of non-negative integers.
Returns a list of values from GEN such that each value was an element of indexes.
Create a generator that produces a series of numbers between FROM
and TO with a step size of BY.
When INCLUSIVE is non NIL, then TO will be produced by the generator
if it would be the last member of generate series.
E.g.
> (collect (range :to 10))
(0 1 2 3 4 5 6 7 8 9)
> (collect (range :to 10 :inclusive t))
(0 1 2 3 4 5 6 7 8 9 10)
> (collect (range :to 10 :by 2 :inclusive t))
(0 2 4 6 8 10)
> (collect (range :to 10 :by 3 :inclusive t))
(0 3 6 9)
If TO is NIL, then the generator produces an infinite series of values.
Creates a generator that produces an infinite series consisting in the the values of ARGS looped forever.
Resumes a resumable generator. Creates a new generator from
RESUMABLE.
A particular resumable generator instance can only be resumed once. Here is how you would resume a generator several times:
> (defvar *foobar* (make-resumable! (range)))
*FOOBAR*
> (take 10 *foobar*)
(0 1 2 3 4 5 6 7 8 9)
> (defvar *new-foobar* (resume! *foobar*))
> (defvar *wont-work* (resume! *foobar*)) ;; THROWS AN ERROR
> (take 10 *new-foobar*)
(10 11 12 13 14 15 16 17 18 19)
;; but *new-foobar* can be resumed
> (setf *new-foobar* (resume! *new-foobar*))
Turns a sequecne (a list, vector, string, etc) into a
generator. The resulting generator will generate exactly the members
of the sequence.
Consumes GEN by calculating its size.
Consumes GEN by collecting its first N values into a list
Shorthand for (RANGE :TO N)
Shrinks a generator to generate a series of at most N values.
Is a shortcut for (MAP! #’LIST GEN1 GEN2 ...)
generator!
)) ¶generator!
)) ¶Indicates whether or not this generator has
generated any values yet, or if it should behave as if it has.
Returns true if next can be called on the generator GEN.
resumable-generator!
)) ¶filtered-generator!
)) ¶stream-backed-generator!
)) ¶thunk-backed-generator!
)) ¶list-backed-generator!
)) ¶sequence-backed-generator!
)) ¶range-backed-generator!
)) ¶generator!
)) ¶Returns the next value of the generator GEN, if
available. Unspecified behavior if the GEN has been exhausted.
resumable-generator!
)) ¶filtered-generator!
)) ¶stream-backed-generator!
)) ¶thunk-backed-generator!
)) ¶list-backed-generator!
)) ¶sequence-backed-generator!
)) ¶range-backed-generator!
)) ¶Explicitly stops the generator. Specialize :after
methods to implement any clean up that needs to be done when the
generator has been consumed.
filtered-generator!
)) ¶stream-backed-generator!
)) ¶thunk-backed-generator!
)) ¶generator!
)) ¶generator!
)) ¶generator!
)) ¶Indicates whether or not this generator has been
explicitly stopped. All consumers explicitly stop the generators
they consume.
has-next-p
.
next
.
stop
.
(list)
:on-deck
(error "filtered generator must have a source")
:source-generator
(error "filtered generator must have a predicate")
:predicate
Indicates whether or not this generator has
generated any values yet, or if it should behave as if it has.
Indicates whether or not this generator has been
explicitly stopped. All consumers explicitly stop the generators
they consume.
common-lisp
.
:list
has-next-p
.
next
.
stop
.
common-lisp
.
:stream
:reader
Jump to: | (
A B C D F G H I M N P R S T W Z |
---|
Jump to: | (
A B C D F G H I M N P R S T W Z |
---|
Jump to: | A B C D I L N O P R S T W |
---|
Jump to: | A B C D I L N O P R S T W |
---|
Jump to: | A C F G L P R S T |
---|
Jump to: | A C F G L P R S T |
---|