Implement SRFI-64 - A Scheme API for test suites.
[bpt/guile.git] / doc / ref / srfi-modules.texi
CommitLineData
2da09c3f
MV
1@c -*-texinfo-*-
2@c This is part of the GNU Guile Reference Manual.
61d50919
MW
3@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008,
4@c 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
2da09c3f
MV
5@c See the file guile.texi for copying conditions.
6
a0e07ba4 7@node SRFI Support
3229f68b 8@section SRFI Support Modules
8742c48b 9@cindex SRFI
a0e07ba4
NJ
10
11SRFI is an acronym for Scheme Request For Implementation. The SRFI
12documents define a lot of syntactic and procedure extensions to standard
13Scheme as defined in R5RS.
14
15Guile has support for a number of SRFIs. This chapter gives an overview
16over the available SRFIs and some usage hints. For complete
17documentation, design rationales and further examples, we advise you to
18get the relevant SRFI documents from the SRFI home page
4b4b1e0b 19@url{http://srfi.schemers.org/}.
a0e07ba4
NJ
20
21@menu
22* About SRFI Usage:: What to know about Guile's SRFI support.
23* SRFI-0:: cond-expand
24* SRFI-1:: List library.
25* SRFI-2:: and-let*.
26* SRFI-4:: Homogeneous numeric vector datatypes.
27* SRFI-6:: Basic String Ports.
28* SRFI-8:: receive.
29* SRFI-9:: define-record-type.
30* SRFI-10:: Hash-Comma Reader Extension.
c010924a 31* SRFI-11:: let-values and let*-values.
a0e07ba4
NJ
32* SRFI-13:: String library.
33* SRFI-14:: Character-set library.
34* SRFI-16:: case-lambda
35* SRFI-17:: Generalized set!
e68f492a 36* SRFI-18:: Multithreading support
bfc9c8e0 37* SRFI-19:: Time/Date library.
8e9af854 38* SRFI-23:: Error reporting
1de8c1ae 39* SRFI-26:: Specializing parameters
56ec46a7 40* SRFI-27:: Sources of Random Bits
620c8965 41* SRFI-30:: Nested multi-line block comments
8638c417 42* SRFI-31:: A special form `rec' for recursive evaluation
f50ca8da
LC
43* SRFI-34:: Exception handling.
44* SRFI-35:: Conditions.
d4c38221 45* SRFI-37:: args-fold program argument processor
12708eeb 46* SRFI-38:: External Representation for Data With Shared Structure
eeadfda1 47* SRFI-39:: Parameter objects
50d08cd8 48* SRFI-41:: Streams.
fdc8fd46 49* SRFI-42:: Eager comprehensions
9060dc29 50* SRFI-43:: Vector Library.
f16a2007 51* SRFI-45:: Primitives for expressing iterative lazy algorithms
2d6a3144 52* SRFI-46:: Basic syntax-rules Extensions.
4ea9becb 53* SRFI-55:: Requiring Features.
8503beb8 54* SRFI-60:: Integers as bits.
43ed3b69 55* SRFI-61:: A more general `cond' clause
b306fae0 56* SRFI-62:: S-expression comments.
34e89877 57* SRFI-64:: A Scheme API for test suites.
8175a07e 58* SRFI-67:: Compare procedures
1317062f 59* SRFI-69:: Basic hash tables.
da81e75d 60* SRFI-87:: => in case clauses.
189681f5 61* SRFI-88:: Keyword objects.
922d417b 62* SRFI-98:: Accessing environment variables.
bf9eb54a 63* SRFI-105:: Curly-infix expressions.
3e2e4965 64* SRFI-111:: Boxes.
a0e07ba4
NJ
65@end menu
66
67
68@node About SRFI Usage
3229f68b 69@subsection About SRFI Usage
a0e07ba4
NJ
70
71@c FIXME::martin: Review me!
72
73SRFI support in Guile is currently implemented partly in the core
74library, and partly as add-on modules. That means that some SRFIs are
75automatically available when the interpreter is started, whereas the
76other SRFIs require you to use the appropriate support module
12991fed 77explicitly.
a0e07ba4
NJ
78
79There are several reasons for this inconsistency. First, the feature
80checking syntactic form @code{cond-expand} (@pxref{SRFI-0}) must be
81available immediately, because it must be there when the user wants to
82check for the Scheme implementation, that is, before she can know that
83it is safe to use @code{use-modules} to load SRFI support modules. The
84second reason is that some features defined in SRFIs had been
85implemented in Guile before the developers started to add SRFI
8edab37f 86implementations as modules (for example SRFI-13 (@pxref{SRFI-13})). In
a0e07ba4
NJ
87the future, it is possible that SRFIs in the core library might be
88factored out into separate modules, requiring explicit module loading
89when they are needed. So you should be prepared to have to use
8edab37f 90@code{use-modules} someday in the future to access SRFI-13 bindings. If
a0e07ba4 91you want, you can do that already. We have included the module
8edab37f 92@code{(srfi srfi-13)} in the distribution, which currently does nothing,
a0e07ba4
NJ
93but ensures that you can write future-safe code.
94
95Generally, support for a specific SRFI is made available by using
96modules named @code{(srfi srfi-@var{number})}, where @var{number} is the
97number of the SRFI needed. Another possibility is to use the command
98line option @code{--use-srfi}, which will load the necessary modules
99automatically (@pxref{Invoking Guile}).
100
101
102@node SRFI-0
3229f68b 103@subsection SRFI-0 - cond-expand
8742c48b 104@cindex SRFI-0
a0e07ba4 105
5eef0f61
KR
106This SRFI lets a portable Scheme program test for the presence of
107certain features, and adapt itself by using different blocks of code,
108or fail if the necessary features are not available. There's no
109module to load, this is in the Guile core.
a0e07ba4 110
5eef0f61
KR
111A program designed only for Guile will generally not need this
112mechanism, such a program can of course directly use the various
113documented parts of Guile.
a0e07ba4 114
5eef0f61
KR
115@deffn syntax cond-expand (feature body@dots{}) @dots{}
116Expand to the @var{body} of the first clause whose @var{feature}
117specification is satisfied. It is an error if no @var{feature} is
a0e07ba4
NJ
118satisfied.
119
5eef0f61
KR
120Features are symbols such as @code{srfi-1}, and a feature
121specification can use @code{and}, @code{or} and @code{not} forms to
122test combinations. The last clause can be an @code{else}, to be used
123if no other passes.
a0e07ba4 124
5eef0f61
KR
125For example, define a private version of @code{alist-cons} if SRFI-1
126is not available.
a0e07ba4 127
5eef0f61
KR
128@example
129(cond-expand (srfi-1
130 )
131 (else
132 (define (alist-cons key val alist)
133 (cons (cons key val) alist))))
134@end example
a0e07ba4 135
5eef0f61
KR
136Or demand a certain set of SRFIs (list operations, string ports,
137@code{receive} and string operations), failing if they're not
138available.
a0e07ba4 139
5eef0f61
KR
140@example
141(cond-expand ((and srfi-1 srfi-6 srfi-8 srfi-13)
142 ))
143@end example
144@end deffn
a0e07ba4 145
f38d22c5
KR
146@noindent
147The Guile core has the following features,
148
149@example
150guile
60c8ad9e 151guile-2 ;; starting from Guile 2.x
f38d22c5
KR
152r5rs
153srfi-0
154srfi-4
f38d22c5
KR
155srfi-13
156srfi-14
61d50919 157srfi-16
edb6de0b 158srfi-23
61d50919 159srfi-30
edb6de0b 160srfi-39
2d6a3144 161srfi-46
edb6de0b
MW
162srfi-55
163srfi-61
b306fae0 164srfi-62
da81e75d 165srfi-87
edb6de0b 166srfi-105
f38d22c5
KR
167@end example
168
169Other SRFI feature symbols are defined once their code has been loaded
170with @code{use-modules}, since only then are their bindings available.
a0e07ba4 171
5eef0f61
KR
172The @samp{--use-srfi} command line option (@pxref{Invoking Guile}) is
173a good way to load SRFIs to satisfy @code{cond-expand} when running a
174portable program.
a0e07ba4 175
5eef0f61
KR
176Testing the @code{guile} feature allows a program to adapt itself to
177the Guile module system, but still run on other Scheme systems. For
178example the following demands SRFI-8 (@code{receive}), but also knows
179how to load it with the Guile mechanism.
a0e07ba4
NJ
180
181@example
5eef0f61
KR
182(cond-expand (srfi-8
183 )
184 (guile
185 (use-modules (srfi srfi-8))))
a0e07ba4
NJ
186@end example
187
60c8ad9e
LC
188@cindex @code{guile-2} SRFI-0 feature
189@cindex portability between 2.0 and older versions
190Likewise, testing the @code{guile-2} feature allows code to be portable
191between Guile 2.0 and previous versions of Guile. For instance, it
192makes it possible to write code that accounts for Guile 2.0's compiler,
193yet be correctly interpreted on 1.8 and earlier versions:
194
195@example
196(cond-expand (guile-2 (eval-when (compile)
197 ;; This must be evaluated at compile time.
198 (fluid-set! current-reader my-reader)))
199 (guile
200 ;; Earlier versions of Guile do not have a
201 ;; separate compilation phase.
202 (fluid-set! current-reader my-reader)))
203@end example
204
5eef0f61
KR
205It should be noted that @code{cond-expand} is separate from the
206@code{*features*} mechanism (@pxref{Feature Tracking}), feature
207symbols in one are unrelated to those in the other.
a0e07ba4
NJ
208
209
210@node SRFI-1
3229f68b 211@subsection SRFI-1 - List library
8742c48b 212@cindex SRFI-1
7c2e18cd 213@cindex list
a0e07ba4
NJ
214
215@c FIXME::martin: Review me!
216
217The list library defined in SRFI-1 contains a lot of useful list
218processing procedures for construction, examining, destructuring and
219manipulating lists and pairs.
220
221Since SRFI-1 also defines some procedures which are already contained
222in R5RS and thus are supported by the Guile core library, some list
223and pair procedures which appear in the SRFI-1 document may not appear
224in this section. So when looking for a particular list/pair
225processing procedure, you should also have a look at the sections
226@ref{Lists} and @ref{Pairs}.
227
228@menu
229* SRFI-1 Constructors:: Constructing new lists.
230* SRFI-1 Predicates:: Testing list for specific properties.
231* SRFI-1 Selectors:: Selecting elements from lists.
232* SRFI-1 Length Append etc:: Length calculation and list appending.
233* SRFI-1 Fold and Map:: Higher-order list processing.
234* SRFI-1 Filtering and Partitioning:: Filter lists based on predicates.
85a9b4ed 235* SRFI-1 Searching:: Search for elements.
a0e07ba4
NJ
236* SRFI-1 Deleting:: Delete elements from lists.
237* SRFI-1 Association Lists:: Handle association lists.
238* SRFI-1 Set Operations:: Use lists for representing sets.
239@end menu
240
241@node SRFI-1 Constructors
3229f68b 242@subsubsection Constructors
7c2e18cd 243@cindex list constructor
a0e07ba4
NJ
244
245@c FIXME::martin: Review me!
246
247New lists can be constructed by calling one of the following
248procedures.
249
8f85c0c6 250@deffn {Scheme Procedure} xcons d a
a0e07ba4
NJ
251Like @code{cons}, but with interchanged arguments. Useful mostly when
252passed to higher-order procedures.
253@end deffn
254
8f85c0c6 255@deffn {Scheme Procedure} list-tabulate n init-proc
a0e07ba4
NJ
256Return an @var{n}-element list, where each list element is produced by
257applying the procedure @var{init-proc} to the corresponding list
258index. The order in which @var{init-proc} is applied to the indices
259is not specified.
260@end deffn
261
57066448
KR
262@deffn {Scheme Procedure} list-copy lst
263Return a new list containing the elements of the list @var{lst}.
264
265This function differs from the core @code{list-copy} (@pxref{List
266Constructors}) in accepting improper lists too. And if @var{lst} is
267not a pair at all then it's treated as the final tail of an improper
268list and simply returned.
269@end deffn
270
8f85c0c6 271@deffn {Scheme Procedure} circular-list elt1 elt2 @dots{}
a0e07ba4
NJ
272Return a circular list containing the given arguments @var{elt1}
273@var{elt2} @dots{}.
274@end deffn
275
8f85c0c6 276@deffn {Scheme Procedure} iota count [start step]
256853db
KR
277Return a list containing @var{count} numbers, starting from
278@var{start} and adding @var{step} each time. The default @var{start}
279is 0, the default @var{step} is 1. For example,
a0e07ba4 280
256853db
KR
281@example
282(iota 6) @result{} (0 1 2 3 4 5)
283(iota 4 2.5 -2) @result{} (2.5 0.5 -1.5 -3.5)
284@end example
a0e07ba4 285
256853db
KR
286This function takes its name from the corresponding primitive in the
287APL language.
a0e07ba4
NJ
288@end deffn
289
290
291@node SRFI-1 Predicates
3229f68b 292@subsubsection Predicates
7c2e18cd 293@cindex list predicate
a0e07ba4
NJ
294
295@c FIXME::martin: Review me!
296
297The procedures in this section test specific properties of lists.
298
8f85c0c6 299@deffn {Scheme Procedure} proper-list? obj
f18f87aa
KR
300Return @code{#t} if @var{obj} is a proper list, or @code{#f}
301otherwise. This is the same as the core @code{list?} (@pxref{List
302Predicates}).
303
304A proper list is a list which ends with the empty list @code{()} in
305the usual way. The empty list @code{()} itself is a proper list too.
306
307@example
308(proper-list? '(1 2 3)) @result{} #t
309(proper-list? '()) @result{} #t
310@end example
a0e07ba4
NJ
311@end deffn
312
8f85c0c6 313@deffn {Scheme Procedure} circular-list? obj
f18f87aa
KR
314Return @code{#t} if @var{obj} is a circular list, or @code{#f}
315otherwise.
316
317A circular list is a list where at some point the @code{cdr} refers
318back to a previous pair in the list (either the start or some later
319point), so that following the @code{cdr}s takes you around in a
320circle, with no end.
321
322@example
323(define x (list 1 2 3 4))
324(set-cdr! (last-pair x) (cddr x))
325x @result{} (1 2 3 4 3 4 3 4 ...)
326(circular-list? x) @result{} #t
327@end example
a0e07ba4
NJ
328@end deffn
329
8f85c0c6 330@deffn {Scheme Procedure} dotted-list? obj
f18f87aa
KR
331Return @code{#t} if @var{obj} is a dotted list, or @code{#f}
332otherwise.
333
334A dotted list is a list where the @code{cdr} of the last pair is not
335the empty list @code{()}. Any non-pair @var{obj} is also considered a
336dotted list, with length zero.
337
338@example
339(dotted-list? '(1 2 . 3)) @result{} #t
340(dotted-list? 99) @result{} #t
341@end example
a0e07ba4
NJ
342@end deffn
343
f18f87aa
KR
344It will be noted that any Scheme object passes exactly one of the
345above three tests @code{proper-list?}, @code{circular-list?} and
346@code{dotted-list?}. Non-lists are @code{dotted-list?}, finite lists
347are either @code{proper-list?} or @code{dotted-list?}, and infinite
348lists are @code{circular-list?}.
349
350@sp 1
8f85c0c6 351@deffn {Scheme Procedure} null-list? lst
a0e07ba4
NJ
352Return @code{#t} if @var{lst} is the empty list @code{()}, @code{#f}
353otherwise. If something else than a proper or circular list is passed
85a9b4ed 354as @var{lst}, an error is signalled. This procedure is recommended
a0e07ba4
NJ
355for checking for the end of a list in contexts where dotted lists are
356not allowed.
357@end deffn
358
8f85c0c6 359@deffn {Scheme Procedure} not-pair? obj
a0e07ba4
NJ
360Return @code{#t} is @var{obj} is not a pair, @code{#f} otherwise.
361This is shorthand notation @code{(not (pair? @var{obj}))} and is
362supposed to be used for end-of-list checking in contexts where dotted
363lists are allowed.
364@end deffn
365
8f85c0c6 366@deffn {Scheme Procedure} list= elt= list1 @dots{}
a0e07ba4
NJ
367Return @code{#t} if all argument lists are equal, @code{#f} otherwise.
368List equality is determined by testing whether all lists have the same
369length and the corresponding elements are equal in the sense of the
370equality predicate @var{elt=}. If no or only one list is given,
371@code{#t} is returned.
372@end deffn
373
374
375@node SRFI-1 Selectors
3229f68b 376@subsubsection Selectors
7c2e18cd 377@cindex list selector
a0e07ba4
NJ
378
379@c FIXME::martin: Review me!
380
8f85c0c6
NJ
381@deffn {Scheme Procedure} first pair
382@deffnx {Scheme Procedure} second pair
383@deffnx {Scheme Procedure} third pair
384@deffnx {Scheme Procedure} fourth pair
385@deffnx {Scheme Procedure} fifth pair
386@deffnx {Scheme Procedure} sixth pair
387@deffnx {Scheme Procedure} seventh pair
388@deffnx {Scheme Procedure} eighth pair
389@deffnx {Scheme Procedure} ninth pair
390@deffnx {Scheme Procedure} tenth pair
a0e07ba4
NJ
391These are synonyms for @code{car}, @code{cadr}, @code{caddr}, @dots{}.
392@end deffn
393
8f85c0c6 394@deffn {Scheme Procedure} car+cdr pair
a0e07ba4
NJ
395Return two values, the @sc{car} and the @sc{cdr} of @var{pair}.
396@end deffn
397
8f85c0c6
NJ
398@deffn {Scheme Procedure} take lst i
399@deffnx {Scheme Procedure} take! lst i
a0e07ba4
NJ
400Return a list containing the first @var{i} elements of @var{lst}.
401
402@code{take!} may modify the structure of the argument list @var{lst}
403in order to produce the result.
404@end deffn
405
8f85c0c6 406@deffn {Scheme Procedure} drop lst i
a0e07ba4
NJ
407Return a list containing all but the first @var{i} elements of
408@var{lst}.
409@end deffn
410
8f85c0c6 411@deffn {Scheme Procedure} take-right lst i
ecb87335 412Return a list containing the @var{i} last elements of @var{lst}.
64bf8517 413The return shares a common tail with @var{lst}.
a0e07ba4
NJ
414@end deffn
415
8f85c0c6
NJ
416@deffn {Scheme Procedure} drop-right lst i
417@deffnx {Scheme Procedure} drop-right! lst i
ecb87335 418Return a list containing all but the @var{i} last elements of
a0e07ba4
NJ
419@var{lst}.
420
64bf8517
KR
421@code{drop-right} always returns a new list, even when @var{i} is
422zero. @code{drop-right!} may modify the structure of the argument
423list @var{lst} in order to produce the result.
a0e07ba4
NJ
424@end deffn
425
8f85c0c6
NJ
426@deffn {Scheme Procedure} split-at lst i
427@deffnx {Scheme Procedure} split-at! lst i
a0e07ba4
NJ
428Return two values, a list containing the first @var{i} elements of the
429list @var{lst} and a list containing the remaining elements.
430
431@code{split-at!} may modify the structure of the argument list
432@var{lst} in order to produce the result.
433@end deffn
434
8f85c0c6 435@deffn {Scheme Procedure} last lst
a0e07ba4
NJ
436Return the last element of the non-empty, finite list @var{lst}.
437@end deffn
438
439
440@node SRFI-1 Length Append etc
3229f68b 441@subsubsection Length, Append, Concatenate, etc.
a0e07ba4
NJ
442
443@c FIXME::martin: Review me!
444
8f85c0c6 445@deffn {Scheme Procedure} length+ lst
a0e07ba4
NJ
446Return the length of the argument list @var{lst}. When @var{lst} is a
447circular list, @code{#f} is returned.
448@end deffn
449
8f85c0c6
NJ
450@deffn {Scheme Procedure} concatenate list-of-lists
451@deffnx {Scheme Procedure} concatenate! list-of-lists
a0e07ba4
NJ
452Construct a list by appending all lists in @var{list-of-lists}.
453
454@code{concatenate!} may modify the structure of the given lists in
455order to produce the result.
a3e856f2
KR
456
457@code{concatenate} is the same as @code{(apply append
458@var{list-of-lists})}. It exists because some Scheme implementations
459have a limit on the number of arguments a function takes, which the
460@code{apply} might exceed. In Guile there is no such limit.
a0e07ba4
NJ
461@end deffn
462
8f85c0c6
NJ
463@deffn {Scheme Procedure} append-reverse rev-head tail
464@deffnx {Scheme Procedure} append-reverse! rev-head tail
23f2b9a3
KR
465Reverse @var{rev-head}, append @var{tail} to it, and return the
466result. This is equivalent to @code{(append (reverse @var{rev-head})
467@var{tail})}, but its implementation is more efficient.
468
469@example
470(append-reverse '(1 2 3) '(4 5 6)) @result{} (3 2 1 4 5 6)
471@end example
a0e07ba4
NJ
472
473@code{append-reverse!} may modify @var{rev-head} in order to produce
474the result.
475@end deffn
476
8f85c0c6 477@deffn {Scheme Procedure} zip lst1 lst2 @dots{}
a0e07ba4
NJ
478Return a list as long as the shortest of the argument lists, where
479each element is a list. The first list contains the first elements of
480the argument lists, the second list contains the second elements, and
481so on.
482@end deffn
483
8f85c0c6
NJ
484@deffn {Scheme Procedure} unzip1 lst
485@deffnx {Scheme Procedure} unzip2 lst
486@deffnx {Scheme Procedure} unzip3 lst
487@deffnx {Scheme Procedure} unzip4 lst
488@deffnx {Scheme Procedure} unzip5 lst
a0e07ba4
NJ
489@code{unzip1} takes a list of lists, and returns a list containing the
490first elements of each list, @code{unzip2} returns two lists, the
491first containing the first elements of each lists and the second
492containing the second elements of each lists, and so on.
493@end deffn
494
df0a1002 495@deffn {Scheme Procedure} count pred lst1 lst2 @dots{}
e508c863
KR
496Return a count of the number of times @var{pred} returns true when
497called on elements from the given lists.
498
499@var{pred} is called with @var{N} parameters @code{(@var{pred}
df0a1002
BT
500@var{elem1} @dots{} @var{elemN} )}, each element being from the
501corresponding list. The first call is with the first element of each
502list, the second with the second element from each, and so on.
e508c863
KR
503
504Counting stops when the end of the shortest list is reached. At least
505one list must be non-circular.
506@end deffn
507
a0e07ba4
NJ
508
509@node SRFI-1 Fold and Map
3229f68b 510@subsubsection Fold, Unfold & Map
7c2e18cd
KR
511@cindex list fold
512@cindex list map
a0e07ba4
NJ
513
514@c FIXME::martin: Review me!
515
df0a1002
BT
516@deffn {Scheme Procedure} fold proc init lst1 lst2 @dots{}
517@deffnx {Scheme Procedure} fold-right proc init lst1 lst2 @dots{}
518Apply @var{proc} to the elements of @var{lst1} @var{lst2} @dots{} to
1e181a08 519build a result, and return that result.
a0e07ba4 520
df0a1002
BT
521Each @var{proc} call is @code{(@var{proc} @var{elem1} @var{elem2}
522@dots{} @var{previous})}, where @var{elem1} is from @var{lst1},
523@var{elem2} is from @var{lst2}, and so on. @var{previous} is the return
1e181a08
KR
524from the previous call to @var{proc}, or the given @var{init} for the
525first call. If any list is empty, just @var{init} is returned.
a0e07ba4 526
1e181a08
KR
527@code{fold} works through the list elements from first to last. The
528following shows a list reversal and the calls it makes,
a0e07ba4 529
1e181a08
KR
530@example
531(fold cons '() '(1 2 3))
a0e07ba4 532
1e181a08
KR
533(cons 1 '())
534(cons 2 '(1))
535(cons 3 '(2 1)
536@result{} (3 2 1)
537@end example
a0e07ba4 538
1e181a08
KR
539@code{fold-right} works through the list elements from last to first,
540ie.@: from the right. So for example the following finds the longest
541string, and the last among equal longest,
542
543@example
544(fold-right (lambda (str prev)
545 (if (> (string-length str) (string-length prev))
546 str
547 prev))
548 ""
549 '("x" "abc" "xyz" "jk"))
550@result{} "xyz"
551@end example
a0e07ba4 552
df0a1002 553If @var{lst1} @var{lst2} @dots{} have different lengths, @code{fold}
1e181a08 554stops when the end of the shortest is reached; @code{fold-right}
df0a1002
BT
555commences at the last element of the shortest. Ie.@: elements past the
556length of the shortest are ignored in the other @var{lst}s. At least
557one @var{lst} must be non-circular.
1e181a08
KR
558
559@code{fold} should be preferred over @code{fold-right} if the order of
560processing doesn't matter, or can be arranged either way, since
561@code{fold} is a little more efficient.
562
563The way @code{fold} builds a result from iterating is quite general,
564it can do more than other iterations like say @code{map} or
565@code{filter}. The following for example removes adjacent duplicate
566elements from a list,
567
568@example
569(define (delete-adjacent-duplicates lst)
570 (fold-right (lambda (elem ret)
571 (if (equal? elem (first ret))
572 ret
573 (cons elem ret)))
574 (list (last lst))
575 lst))
576(delete-adjacent-duplicates '(1 2 3 3 4 4 4 5))
577@result{} (1 2 3 4 5)
578@end example
579
580Clearly the same sort of thing can be done with a @code{for-each} and
5f708db6
KR
581a variable in which to build the result, but a self-contained
582@var{proc} can be re-used in multiple contexts, where a
583@code{for-each} would have to be written out each time.
a0e07ba4
NJ
584@end deffn
585
df0a1002
BT
586@deffn {Scheme Procedure} pair-fold proc init lst1 lst2 @dots{}
587@deffnx {Scheme Procedure} pair-fold-right proc init lst1 lst2 @dots{}
1e181a08
KR
588The same as @code{fold} and @code{fold-right}, but apply @var{proc} to
589the pairs of the lists instead of the list elements.
a0e07ba4
NJ
590@end deffn
591
5f708db6
KR
592@deffn {Scheme Procedure} reduce proc default lst
593@deffnx {Scheme Procedure} reduce-right proc default lst
594@code{reduce} is a variant of @code{fold}, where the first call to
595@var{proc} is on two elements from @var{lst}, rather than one element
596and a given initial value.
1e181a08 597
5f708db6
KR
598If @var{lst} is empty, @code{reduce} returns @var{default} (this is
599the only use for @var{default}). If @var{lst} has just one element
600then that's the return value. Otherwise @var{proc} is called on the
601elements of @var{lst}.
1e181a08 602
5f708db6
KR
603Each @var{proc} call is @code{(@var{proc} @var{elem} @var{previous})},
604where @var{elem} is from @var{lst} (the second and subsequent elements
605of @var{lst}), and @var{previous} is the return from the previous call
606to @var{proc}. The first element of @var{lst} is the @var{previous}
607for the first call to @var{proc}.
1e181a08 608
5f708db6
KR
609For example, the following adds a list of numbers, the calls made to
610@code{+} are shown. (Of course @code{+} accepts multiple arguments
611and can add a list directly, with @code{apply}.)
1e181a08
KR
612
613@example
5f708db6
KR
614(reduce + 0 '(5 6 7)) @result{} 18
615
616(+ 6 5) @result{} 11
617(+ 7 11) @result{} 18
1e181a08
KR
618@end example
619
5f708db6
KR
620@code{reduce} can be used instead of @code{fold} where the @var{init}
621value is an ``identity'', meaning a value which under @var{proc}
622doesn't change the result, in this case 0 is an identity since
623@code{(+ 5 0)} is just 5. @code{reduce} avoids that unnecessary call.
1e181a08
KR
624
625@code{reduce-right} is a similar variation on @code{fold-right},
5f708db6
KR
626working from the end (ie.@: the right) of @var{lst}. The last element
627of @var{lst} is the @var{previous} for the first call to @var{proc},
628and the @var{elem} values go from the second last.
1e181a08
KR
629
630@code{reduce} should be preferred over @code{reduce-right} if the
631order of processing doesn't matter, or can be arranged either way,
632since @code{reduce} is a little more efficient.
a0e07ba4
NJ
633@end deffn
634
8f85c0c6 635@deffn {Scheme Procedure} unfold p f g seed [tail-gen]
a0e07ba4
NJ
636@code{unfold} is defined as follows:
637
638@lisp
639(unfold p f g seed) =
640 (if (p seed) (tail-gen seed)
641 (cons (f seed)
642 (unfold p f g (g seed))))
643@end lisp
644
645@table @var
646@item p
647Determines when to stop unfolding.
648
649@item f
650Maps each seed value to the corresponding list element.
651
652@item g
ecb87335 653Maps each seed value to next seed value.
a0e07ba4
NJ
654
655@item seed
656The state value for the unfold.
657
658@item tail-gen
659Creates the tail of the list; defaults to @code{(lambda (x) '())}.
660@end table
661
662@var{g} produces a series of seed values, which are mapped to list
663elements by @var{f}. These elements are put into a list in
664left-to-right order, and @var{p} tells when to stop unfolding.
665@end deffn
666
8f85c0c6 667@deffn {Scheme Procedure} unfold-right p f g seed [tail]
a0e07ba4
NJ
668Construct a list with the following loop.
669
670@lisp
671(let lp ((seed seed) (lis tail))
672 (if (p seed) lis
673 (lp (g seed)
674 (cons (f seed) lis))))
675@end lisp
676
677@table @var
678@item p
679Determines when to stop unfolding.
680
681@item f
682Maps each seed value to the corresponding list element.
683
684@item g
ecb87335 685Maps each seed value to next seed value.
a0e07ba4
NJ
686
687@item seed
688The state value for the unfold.
689
9cdf0ac6
IP
690@item tail
691The tail of the list; defaults to @code{'()}.
a0e07ba4
NJ
692@end table
693
694@end deffn
695
8f85c0c6 696@deffn {Scheme Procedure} map f lst1 lst2 @dots{}
a0e07ba4
NJ
697Map the procedure over the list(s) @var{lst1}, @var{lst2}, @dots{} and
698return a list containing the results of the procedure applications.
699This procedure is extended with respect to R5RS, because the argument
700lists may have different lengths. The result list will have the same
701length as the shortest argument lists. The order in which @var{f}
702will be applied to the list element(s) is not specified.
703@end deffn
704
8f85c0c6 705@deffn {Scheme Procedure} for-each f lst1 lst2 @dots{}
a0e07ba4
NJ
706Apply the procedure @var{f} to each pair of corresponding elements of
707the list(s) @var{lst1}, @var{lst2}, @dots{}. The return value is not
708specified. This procedure is extended with respect to R5RS, because
709the argument lists may have different lengths. The shortest argument
710list determines the number of times @var{f} is called. @var{f} will
85a9b4ed 711be applied to the list elements in left-to-right order.
a0e07ba4
NJ
712
713@end deffn
714
8f85c0c6
NJ
715@deffn {Scheme Procedure} append-map f lst1 lst2 @dots{}
716@deffnx {Scheme Procedure} append-map! f lst1 lst2 @dots{}
12991fed 717Equivalent to
a0e07ba4
NJ
718
719@lisp
12991fed 720(apply append (map f clist1 clist2 ...))
a0e07ba4
NJ
721@end lisp
722
12991fed 723and
a0e07ba4
NJ
724
725@lisp
12991fed 726(apply append! (map f clist1 clist2 ...))
a0e07ba4
NJ
727@end lisp
728
729Map @var{f} over the elements of the lists, just as in the @code{map}
730function. However, the results of the applications are appended
731together to make the final result. @code{append-map} uses
732@code{append} to append the results together; @code{append-map!} uses
733@code{append!}.
734
735The dynamic order in which the various applications of @var{f} are
736made is not specified.
737@end deffn
738
8f85c0c6 739@deffn {Scheme Procedure} map! f lst1 lst2 @dots{}
a0e07ba4
NJ
740Linear-update variant of @code{map} -- @code{map!} is allowed, but not
741required, to alter the cons cells of @var{lst1} to construct the
742result list.
743
744The dynamic order in which the various applications of @var{f} are
745made is not specified. In the n-ary case, @var{lst2}, @var{lst3},
746@dots{} must have at least as many elements as @var{lst1}.
747@end deffn
748
8f85c0c6 749@deffn {Scheme Procedure} pair-for-each f lst1 lst2 @dots{}
a0e07ba4
NJ
750Like @code{for-each}, but applies the procedure @var{f} to the pairs
751from which the argument lists are constructed, instead of the list
752elements. The return value is not specified.
753@end deffn
754
8f85c0c6 755@deffn {Scheme Procedure} filter-map f lst1 lst2 @dots{}
a0e07ba4
NJ
756Like @code{map}, but only results from the applications of @var{f}
757which are true are saved in the result list.
758@end deffn
759
760
761@node SRFI-1 Filtering and Partitioning
3229f68b 762@subsubsection Filtering and Partitioning
7c2e18cd
KR
763@cindex list filter
764@cindex list partition
a0e07ba4
NJ
765
766@c FIXME::martin: Review me!
767
768Filtering means to collect all elements from a list which satisfy a
769specific condition. Partitioning a list means to make two groups of
770list elements, one which contains the elements satisfying a condition,
771and the other for the elements which don't.
772
60e25dc4
KR
773The @code{filter} and @code{filter!} functions are implemented in the
774Guile core, @xref{List Modification}.
a0e07ba4 775
8f85c0c6
NJ
776@deffn {Scheme Procedure} partition pred lst
777@deffnx {Scheme Procedure} partition! pred lst
193239f1
KR
778Split @var{lst} into those elements which do and don't satisfy the
779predicate @var{pred}.
a0e07ba4 780
193239f1
KR
781The return is two values (@pxref{Multiple Values}), the first being a
782list of all elements from @var{lst} which satisfy @var{pred}, the
783second a list of those which do not.
784
785The elements in the result lists are in the same order as in @var{lst}
786but the order in which the calls @code{(@var{pred} elem)} are made on
787the list elements is unspecified.
788
789@code{partition} does not change @var{lst}, but one of the returned
790lists may share a tail with it. @code{partition!} may modify
791@var{lst} to construct its return.
a0e07ba4
NJ
792@end deffn
793
8f85c0c6
NJ
794@deffn {Scheme Procedure} remove pred lst
795@deffnx {Scheme Procedure} remove! pred lst
a0e07ba4
NJ
796Return a list containing all elements from @var{lst} which do not
797satisfy the predicate @var{pred}. The elements in the result list
798have the same order as in @var{lst}. The order in which @var{pred} is
799applied to the list elements is not specified.
800
801@code{remove!} is allowed, but not required to modify the structure of
802the input list.
803@end deffn
804
805
806@node SRFI-1 Searching
3229f68b 807@subsubsection Searching
7c2e18cd 808@cindex list search
a0e07ba4
NJ
809
810@c FIXME::martin: Review me!
811
812The procedures for searching elements in lists either accept a
813predicate or a comparison object for determining which elements are to
814be searched.
815
8f85c0c6 816@deffn {Scheme Procedure} find pred lst
a0e07ba4
NJ
817Return the first element of @var{lst} which satisfies the predicate
818@var{pred} and @code{#f} if no such element is found.
819@end deffn
820
8f85c0c6 821@deffn {Scheme Procedure} find-tail pred lst
a0e07ba4
NJ
822Return the first pair of @var{lst} whose @sc{car} satisfies the
823predicate @var{pred} and @code{#f} if no such element is found.
824@end deffn
825
8f85c0c6
NJ
826@deffn {Scheme Procedure} take-while pred lst
827@deffnx {Scheme Procedure} take-while! pred lst
a0e07ba4
NJ
828Return the longest initial prefix of @var{lst} whose elements all
829satisfy the predicate @var{pred}.
830
831@code{take-while!} is allowed, but not required to modify the input
832list while producing the result.
833@end deffn
834
8f85c0c6 835@deffn {Scheme Procedure} drop-while pred lst
a0e07ba4
NJ
836Drop the longest initial prefix of @var{lst} whose elements all
837satisfy the predicate @var{pred}.
838@end deffn
839
8f85c0c6
NJ
840@deffn {Scheme Procedure} span pred lst
841@deffnx {Scheme Procedure} span! pred lst
842@deffnx {Scheme Procedure} break pred lst
843@deffnx {Scheme Procedure} break! pred lst
a0e07ba4
NJ
844@code{span} splits the list @var{lst} into the longest initial prefix
845whose elements all satisfy the predicate @var{pred}, and the remaining
846tail. @code{break} inverts the sense of the predicate.
847
848@code{span!} and @code{break!} are allowed, but not required to modify
849the structure of the input list @var{lst} in order to produce the
850result.
3e73b6f9
KR
851
852Note that the name @code{break} conflicts with the @code{break}
853binding established by @code{while} (@pxref{while do}). Applications
854wanting to use @code{break} from within a @code{while} loop will need
855to make a new define under a different name.
a0e07ba4
NJ
856@end deffn
857
df0a1002
BT
858@deffn {Scheme Procedure} any pred lst1 lst2 @dots{}
859Test whether any set of elements from @var{lst1} @var{lst2} @dots{}
860satisfies @var{pred}. If so, the return value is the return value from
861the successful @var{pred} call, or if not, the return value is
862@code{#f}.
62705beb 863
df0a1002
BT
864If there are n list arguments, then @var{pred} must be a predicate
865taking n arguments. Each @var{pred} call is @code{(@var{pred}
866@var{elem1} @var{elem2} @dots{} )} taking an element from each
867@var{lst}. The calls are made successively for the first, second, etc.
868elements of the lists, stopping when @var{pred} returns non-@code{#f},
869or when the end of the shortest list is reached.
62705beb 870
df0a1002 871The @var{pred} call on the last set of elements (i.e., when the end of
62705beb
KR
872the shortest list has been reached), if that point is reached, is a
873tail call.
874@end deffn
875
df0a1002
BT
876@deffn {Scheme Procedure} every pred lst1 lst2 @dots{}
877Test whether every set of elements from @var{lst1} @var{lst2} @dots{}
878satisfies @var{pred}. If so, the return value is the return from the
879final @var{pred} call, or if not, the return value is @code{#f}.
62705beb 880
df0a1002
BT
881If there are n list arguments, then @var{pred} must be a predicate
882taking n arguments. Each @var{pred} call is @code{(@var{pred}
883@var{elem1} @var{elem2 @dots{}})} taking an element from each
884@var{lst}. The calls are made successively for the first, second, etc.
885elements of the lists, stopping if @var{pred} returns @code{#f}, or when
886the end of any of the lists is reached.
62705beb 887
df0a1002 888The @var{pred} call on the last set of elements (i.e., when the end of
62705beb
KR
889the shortest list has been reached) is a tail call.
890
df0a1002
BT
891If one of @var{lst1} @var{lst2} @dots{}is empty then no calls to
892@var{pred} are made, and the return value is @code{#t}.
a0e07ba4
NJ
893@end deffn
894
df0a1002 895@deffn {Scheme Procedure} list-index pred lst1 lst2 @dots{}
d1736abf 896Return the index of the first set of elements, one from each of
df0a1002 897@var{lst1} @var{lst2} @dots{}, which satisfies @var{pred}.
d1736abf 898
df0a1002 899@var{pred} is called as @code{(@var{elem1} @var{elem2 @dots{}})}.
d1736abf
KR
900Searching stops when the end of the shortest @var{lst} is reached.
901The return index starts from 0 for the first set of elements. If no
df0a1002 902set of elements pass, then the return value is @code{#f}.
0166e7f2
KR
903
904@example
905(list-index odd? '(2 4 6 9)) @result{} 3
906(list-index = '(1 2 3) '(3 1 2)) @result{} #f
907@end example
a0e07ba4
NJ
908@end deffn
909
8f85c0c6 910@deffn {Scheme Procedure} member x lst [=]
a0e07ba4 911Return the first sublist of @var{lst} whose @sc{car} is equal to
ca04a5ae 912@var{x}. If @var{x} does not appear in @var{lst}, return @code{#f}.
ea6ea01b 913
ca04a5ae
KR
914Equality is determined by @code{equal?}, or by the equality predicate
915@var{=} if given. @var{=} is called @code{(= @var{x} elem)},
916ie.@: with the given @var{x} first, so for example to find the first
917element greater than 5,
918
919@example
920(member 5 '(3 5 1 7 2 9) <) @result{} (7 2 9)
921@end example
922
923This version of @code{member} extends the core @code{member}
924(@pxref{List Searching}) by accepting an equality predicate.
a0e07ba4
NJ
925@end deffn
926
927
928@node SRFI-1 Deleting
3229f68b 929@subsubsection Deleting
7c2e18cd 930@cindex list delete
a0e07ba4 931
8f85c0c6
NJ
932@deffn {Scheme Procedure} delete x lst [=]
933@deffnx {Scheme Procedure} delete! x lst [=]
b6b9376a
KR
934Return a list containing the elements of @var{lst} but with those
935equal to @var{x} deleted. The returned elements will be in the same
936order as they were in @var{lst}.
937
938Equality is determined by the @var{=} predicate, or @code{equal?} if
939not given. An equality call is made just once for each element, but
940the order in which the calls are made on the elements is unspecified.
a0e07ba4 941
243bdb63 942The equality calls are always @code{(= x elem)}, ie.@: the given @var{x}
b6b9376a
KR
943is first. This means for instance elements greater than 5 can be
944deleted with @code{(delete 5 lst <)}.
945
946@code{delete} does not modify @var{lst}, but the return might share a
947common tail with @var{lst}. @code{delete!} may modify the structure
948of @var{lst} to construct its return.
ea6ea01b 949
4eb21177
KR
950These functions extend the core @code{delete} and @code{delete!}
951(@pxref{List Modification}) in accepting an equality predicate. See
952also @code{lset-difference} (@pxref{SRFI-1 Set Operations}) for
953deleting multiple elements from a list.
a0e07ba4
NJ
954@end deffn
955
8f85c0c6
NJ
956@deffn {Scheme Procedure} delete-duplicates lst [=]
957@deffnx {Scheme Procedure} delete-duplicates! lst [=]
b6b9376a
KR
958Return a list containing the elements of @var{lst} but without
959duplicates.
960
961When elements are equal, only the first in @var{lst} is retained.
962Equal elements can be anywhere in @var{lst}, they don't have to be
963adjacent. The returned list will have the retained elements in the
964same order as they were in @var{lst}.
965
966Equality is determined by the @var{=} predicate, or @code{equal?} if
967not given. Calls @code{(= x y)} are made with element @var{x} being
968before @var{y} in @var{lst}. A call is made at most once for each
969combination, but the sequence of the calls across the elements is
970unspecified.
971
972@code{delete-duplicates} does not modify @var{lst}, but the return
973might share a common tail with @var{lst}. @code{delete-duplicates!}
974may modify the structure of @var{lst} to construct its return.
975
976In the worst case, this is an @math{O(N^2)} algorithm because it must
977check each element against all those preceding it. For long lists it
978is more efficient to sort and then compare only adjacent elements.
a0e07ba4
NJ
979@end deffn
980
981
982@node SRFI-1 Association Lists
3229f68b 983@subsubsection Association Lists
7c2e18cd
KR
984@cindex association list
985@cindex alist
a0e07ba4
NJ
986
987@c FIXME::martin: Review me!
988
989Association lists are described in detail in section @ref{Association
990Lists}. The present section only documents the additional procedures
991for dealing with association lists defined by SRFI-1.
992
8f85c0c6 993@deffn {Scheme Procedure} assoc key alist [=]
23f2b9a3
KR
994Return the pair from @var{alist} which matches @var{key}. This
995extends the core @code{assoc} (@pxref{Retrieving Alist Entries}) by
996taking an optional @var{=} comparison procedure.
997
998The default comparison is @code{equal?}. If an @var{=} parameter is
679cceed 999given it's called @code{(@var{=} @var{key} @var{alistcar})}, i.e.@: the
23f2b9a3
KR
1000given target @var{key} is the first argument, and a @code{car} from
1001@var{alist} is second.
ea6ea01b 1002
23f2b9a3
KR
1003For example a case-insensitive string lookup,
1004
1005@example
1006(assoc "yy" '(("XX" . 1) ("YY" . 2)) string-ci=?)
1007@result{} ("YY" . 2)
1008@end example
a0e07ba4
NJ
1009@end deffn
1010
8f85c0c6 1011@deffn {Scheme Procedure} alist-cons key datum alist
5e5999f9
KR
1012Cons a new association @var{key} and @var{datum} onto @var{alist} and
1013return the result. This is equivalent to
a0e07ba4
NJ
1014
1015@lisp
1016(cons (cons @var{key} @var{datum}) @var{alist})
1017@end lisp
1018
5e5999f9
KR
1019@code{acons} (@pxref{Adding or Setting Alist Entries}) in the Guile
1020core does the same thing.
a0e07ba4
NJ
1021@end deffn
1022
8f85c0c6 1023@deffn {Scheme Procedure} alist-copy alist
a0e07ba4
NJ
1024Return a newly allocated copy of @var{alist}, that means that the
1025spine of the list as well as the pairs are copied.
1026@end deffn
1027
8f85c0c6
NJ
1028@deffn {Scheme Procedure} alist-delete key alist [=]
1029@deffnx {Scheme Procedure} alist-delete! key alist [=]
bd35f1f0
KR
1030Return a list containing the elements of @var{alist} but with those
1031elements whose keys are equal to @var{key} deleted. The returned
1032elements will be in the same order as they were in @var{alist}.
a0e07ba4 1033
bd35f1f0
KR
1034Equality is determined by the @var{=} predicate, or @code{equal?} if
1035not given. The order in which elements are tested is unspecified, but
679cceed 1036each equality call is made @code{(= key alistkey)}, i.e.@: the given
bd35f1f0
KR
1037@var{key} parameter is first and the key from @var{alist} second.
1038This means for instance all associations with a key greater than 5 can
1039be removed with @code{(alist-delete 5 alist <)}.
1040
1041@code{alist-delete} does not modify @var{alist}, but the return might
1042share a common tail with @var{alist}. @code{alist-delete!} may modify
1043the list structure of @var{alist} to construct its return.
a0e07ba4
NJ
1044@end deffn
1045
1046
1047@node SRFI-1 Set Operations
3229f68b 1048@subsubsection Set Operations on Lists
7c2e18cd 1049@cindex list set operation
a0e07ba4 1050
4eb21177
KR
1051Lists can be used to represent sets of objects. The procedures in
1052this section operate on such lists as sets.
1053
1054Note that lists are not an efficient way to implement large sets. The
9aa0c3dd 1055procedures here typically take time @math{@var{m}@cross{}@var{n}} when
4eb21177
KR
1056operating on @var{m} and @var{n} element lists. Other data structures
1057like trees, bitsets (@pxref{Bit Vectors}) or hash tables (@pxref{Hash
1058Tables}) are faster.
1059
1060All these procedures take an equality predicate as the first argument.
1061This predicate is used for testing the objects in the list sets for
1062sameness. This predicate must be consistent with @code{eq?}
1063(@pxref{Equality}) in the sense that if two list elements are
1064@code{eq?} then they must also be equal under the predicate. This
1065simply means a given object must be equal to itself.
a0e07ba4 1066
df0a1002 1067@deffn {Scheme Procedure} lset<= = list @dots{}
4eb21177 1068Return @code{#t} if each list is a subset of the one following it.
df0a1002
BT
1069I.e., @var{list1} is a subset of @var{list2}, @var{list2} is a subset of
1070@var{list3}, etc., for as many lists as given. If only one list or no
1071lists are given, the return value is @code{#t}.
4eb21177
KR
1072
1073A list @var{x} is a subset of @var{y} if each element of @var{x} is
1074equal to some element in @var{y}. Elements are compared using the
1075given @var{=} procedure, called as @code{(@var{=} xelem yelem)}.
1076
1077@example
1078(lset<= eq?) @result{} #t
1079(lset<= eqv? '(1 2 3) '(1)) @result{} #f
1080(lset<= eqv? '(1 3 2) '(4 3 1 2)) @result{} #t
1081@end example
a0e07ba4
NJ
1082@end deffn
1083
df0a1002 1084@deffn {Scheme Procedure} lset= = list @dots{}
4eb21177 1085Return @code{#t} if all argument lists are set-equal. @var{list1} is
df0a1002
BT
1086compared to @var{list2}, @var{list2} to @var{list3}, etc., for as many
1087lists as given. If only one list or no lists are given, the return
1088value is @code{#t}.
4eb21177
KR
1089
1090Two lists @var{x} and @var{y} are set-equal if each element of @var{x}
1091is equal to some element of @var{y} and conversely each element of
1092@var{y} is equal to some element of @var{x}. The order of the
1093elements in the lists doesn't matter. Element equality is determined
1094with the given @var{=} procedure, called as @code{(@var{=} xelem
1095yelem)}, but exactly which calls are made is unspecified.
1096
1097@example
1098(lset= eq?) @result{} #t
1099(lset= eqv? '(1 2 3) '(3 2 1)) @result{} #t
1100(lset= string-ci=? '("a" "A" "b") '("B" "b" "a")) @result{} #t
1101@end example
a0e07ba4
NJ
1102@end deffn
1103
df0a1002
BT
1104@deffn {Scheme Procedure} lset-adjoin = list elem @dots{}
1105Add to @var{list} any of the given @var{elem}s not already in the list.
1106@var{elem}s are @code{cons}ed onto the start of @var{list} (so the
1107return value shares a common tail with @var{list}), but the order that
1108the @var{elem}s are added is unspecified.
4eb21177
KR
1109
1110The given @var{=} procedure is used for comparing elements, called as
df0a1002 1111@code{(@var{=} listelem elem)}, i.e., the second argument is one of
4eb21177
KR
1112the given @var{elem} parameters.
1113
1114@example
1115(lset-adjoin eqv? '(1 2 3) 4 1 5) @result{} (5 4 1 2 3)
1116@end example
a0e07ba4
NJ
1117@end deffn
1118
df0a1002
BT
1119@deffn {Scheme Procedure} lset-union = list @dots{}
1120@deffnx {Scheme Procedure} lset-union! = list @dots{}
4eb21177
KR
1121Return the union of the argument list sets. The result is built by
1122taking the union of @var{list1} and @var{list2}, then the union of
df0a1002 1123that with @var{list3}, etc., for as many lists as given. For one list
4eb21177
KR
1124argument that list itself is the result, for no list arguments the
1125result is the empty list.
1126
1127The union of two lists @var{x} and @var{y} is formed as follows. If
1128@var{x} is empty then the result is @var{y}. Otherwise start with
1129@var{x} as the result and consider each @var{y} element (from first to
1130last). A @var{y} element not equal to something already in the result
1131is @code{cons}ed onto the result.
1132
1133The given @var{=} procedure is used for comparing elements, called as
1134@code{(@var{=} relem yelem)}. The first argument is from the result
1135accumulated so far, and the second is from the list being union-ed in.
1136But exactly which calls are made is otherwise unspecified.
1137
1138Notice that duplicate elements in @var{list1} (or the first non-empty
1139list) are preserved, but that repeated elements in subsequent lists
1140are only added once.
1141
1142@example
1143(lset-union eqv?) @result{} ()
1144(lset-union eqv? '(1 2 3)) @result{} (1 2 3)
1145(lset-union eqv? '(1 2 1 3) '(2 4 5) '(5)) @result{} (5 4 1 2 1 3)
1146@end example
1147
1148@code{lset-union} doesn't change the given lists but the result may
1149share a tail with the first non-empty list. @code{lset-union!} can
1150modify all of the given lists to form the result.
a0e07ba4
NJ
1151@end deffn
1152
8f85c0c6
NJ
1153@deffn {Scheme Procedure} lset-intersection = list1 list2 @dots{}
1154@deffnx {Scheme Procedure} lset-intersection! = list1 list2 @dots{}
4eb21177
KR
1155Return the intersection of @var{list1} with the other argument lists,
1156meaning those elements of @var{list1} which are also in all of
1157@var{list2} etc. For one list argument, just that list is returned.
1158
1159The test for an element of @var{list1} to be in the return is simply
1160that it's equal to some element in each of @var{list2} etc. Notice
1161this means an element appearing twice in @var{list1} but only once in
1162each of @var{list2} etc will go into the return twice. The return has
1163its elements in the same order as they were in @var{list1}.
1164
1165The given @var{=} procedure is used for comparing elements, called as
1166@code{(@var{=} elem1 elemN)}. The first argument is from @var{list1}
1167and the second is from one of the subsequent lists. But exactly which
1168calls are made and in what order is unspecified.
1169
1170@example
1171(lset-intersection eqv? '(x y)) @result{} (x y)
1172(lset-intersection eqv? '(1 2 3) '(4 3 2)) @result{} (2 3)
1173(lset-intersection eqv? '(1 1 2 2) '(1 2) '(2 1) '(2)) @result{} (2 2)
1174@end example
1175
1176The return from @code{lset-intersection} may share a tail with
1177@var{list1}. @code{lset-intersection!} may modify @var{list1} to form
1178its result.
a0e07ba4
NJ
1179@end deffn
1180
8f85c0c6
NJ
1181@deffn {Scheme Procedure} lset-difference = list1 list2 @dots{}
1182@deffnx {Scheme Procedure} lset-difference! = list1 list2 @dots{}
4eb21177
KR
1183Return @var{list1} with any elements in @var{list2}, @var{list3} etc
1184removed (ie.@: subtracted). For one list argument, just that list is
1185returned.
1186
1187The given @var{=} procedure is used for comparing elements, called as
1188@code{(@var{=} elem1 elemN)}. The first argument is from @var{list1}
1189and the second from one of the subsequent lists. But exactly which
1190calls are made and in what order is unspecified.
a0e07ba4 1191
4eb21177
KR
1192@example
1193(lset-difference eqv? '(x y)) @result{} (x y)
1194(lset-difference eqv? '(1 2 3) '(3 1)) @result{} (2)
1195(lset-difference eqv? '(1 2 3) '(3) '(2)) @result{} (1)
1196@end example
1197
1198The return from @code{lset-difference} may share a tail with
1199@var{list1}. @code{lset-difference!} may modify @var{list1} to form
1200its result.
a0e07ba4
NJ
1201@end deffn
1202
8f85c0c6
NJ
1203@deffn {Scheme Procedure} lset-diff+intersection = list1 list2 @dots{}
1204@deffnx {Scheme Procedure} lset-diff+intersection! = list1 list2 @dots{}
4eb21177
KR
1205Return two values (@pxref{Multiple Values}), the difference and
1206intersection of the argument lists as per @code{lset-difference} and
1207@code{lset-intersection} above.
1208
1209For two list arguments this partitions @var{list1} into those elements
1210of @var{list1} which are in @var{list2} and not in @var{list2}. (But
1211for more than two arguments there can be elements of @var{list1} which
1212are neither part of the difference nor the intersection.)
1213
1214One of the return values from @code{lset-diff+intersection} may share
1215a tail with @var{list1}. @code{lset-diff+intersection!} may modify
1216@var{list1} to form its results.
1217@end deffn
1218
df0a1002
BT
1219@deffn {Scheme Procedure} lset-xor = list @dots{}
1220@deffnx {Scheme Procedure} lset-xor! = list @dots{}
4eb21177
KR
1221Return an XOR of the argument lists. For two lists this means those
1222elements which are in exactly one of the lists. For more than two
1223lists it means those elements which appear in an odd number of the
1224lists.
1225
1226To be precise, the XOR of two lists @var{x} and @var{y} is formed by
1227taking those elements of @var{x} not equal to any element of @var{y},
1228plus those elements of @var{y} not equal to any element of @var{x}.
1229Equality is determined with the given @var{=} procedure, called as
1230@code{(@var{=} e1 e2)}. One argument is from @var{x} and the other
1231from @var{y}, but which way around is unspecified. Exactly which
1232calls are made is also unspecified, as is the order of the elements in
1233the result.
1234
1235@example
1236(lset-xor eqv? '(x y)) @result{} (x y)
1237(lset-xor eqv? '(1 2 3) '(4 3 2)) @result{} (4 1)
1238@end example
1239
1240The return from @code{lset-xor} may share a tail with one of the list
1241arguments. @code{lset-xor!} may modify @var{list1} to form its
1242result.
a0e07ba4
NJ
1243@end deffn
1244
1245
1246@node SRFI-2
3229f68b 1247@subsection SRFI-2 - and-let*
8742c48b 1248@cindex SRFI-2
a0e07ba4 1249
4fd0db14
KR
1250@noindent
1251The following syntax can be obtained with
a0e07ba4 1252
4fd0db14
KR
1253@lisp
1254(use-modules (srfi srfi-2))
1255@end lisp
a0e07ba4 1256
abd731ff
NL
1257or alternatively
1258
1259@lisp
1260(use-modules (ice-9 and-let-star))
1261@end lisp
1262
4fd0db14
KR
1263@deffn {library syntax} and-let* (clause @dots{}) body @dots{}
1264A combination of @code{and} and @code{let*}.
1265
1266Each @var{clause} is evaluated in turn, and if @code{#f} is obtained
1267then evaluation stops and @code{#f} is returned. If all are
1268non-@code{#f} then @var{body} is evaluated and the last form gives the
6b1a6e4c
KR
1269return value, or if @var{body} is empty then the result is @code{#t}.
1270Each @var{clause} should be one of the following,
4fd0db14
KR
1271
1272@table @code
1273@item (symbol expr)
1274Evaluate @var{expr}, check for @code{#f}, and bind it to @var{symbol}.
1275Like @code{let*}, that binding is available to subsequent clauses.
1276@item (expr)
1277Evaluate @var{expr} and check for @code{#f}.
1278@item symbol
1279Get the value bound to @var{symbol} and check for @code{#f}.
1280@end table
a0e07ba4 1281
4fd0db14
KR
1282Notice that @code{(expr)} has an ``extra'' pair of parentheses, for
1283instance @code{((eq? x y))}. One way to remember this is to imagine
1284the @code{symbol} in @code{(symbol expr)} is omitted.
a0e07ba4 1285
4fd0db14
KR
1286@code{and-let*} is good for calculations where a @code{#f} value means
1287termination, but where a non-@code{#f} value is going to be needed in
1288subsequent expressions.
1289
1290The following illustrates this, it returns text between brackets
1291@samp{[...]} in a string, or @code{#f} if there are no such brackets
1292(ie.@: either @code{string-index} gives @code{#f}).
1293
1294@example
1295(define (extract-brackets str)
1296 (and-let* ((start (string-index str #\[))
1297 (end (string-index str #\] start)))
1298 (substring str (1+ start) end)))
1299@end example
1300
1301The following shows plain variables and expressions tested too.
1302@code{diagnostic-levels} is taken to be an alist associating a
1303diagnostic type with a level. @code{str} is printed only if the type
1304is known and its level is high enough.
1305
1306@example
1307(define (show-diagnostic type str)
1308 (and-let* (want-diagnostics
1309 (level (assq-ref diagnostic-levels type))
1310 ((>= level current-diagnostic-level)))
1311 (display str)))
1312@end example
1313
1314The advantage of @code{and-let*} is that an extended sequence of
1315expressions and tests doesn't require lots of nesting as would arise
1316from separate @code{and} and @code{let*}, or from @code{cond} with
1317@code{=>}.
1318
1319@end deffn
a0e07ba4
NJ
1320
1321
1322@node SRFI-4
3229f68b 1323@subsection SRFI-4 - Homogeneous numeric vector datatypes
8742c48b 1324@cindex SRFI-4
a0e07ba4 1325
27219b32
AW
1326SRFI-4 provides an interface to uniform numeric vectors: vectors whose elements
1327are all of a single numeric type. Guile offers uniform numeric vectors for
1328signed and unsigned 8-bit, 16-bit, 32-bit, and 64-bit integers, two sizes of
1329floating point values, and, as an extension to SRFI-4, complex floating-point
1330numbers of these two sizes.
1331
1332The standard SRFI-4 procedures and data types may be included via loading the
1333appropriate module:
1334
1335@example
1336(use-modules (srfi srfi-4))
1337@end example
1338
1339This module is currently a part of the default Guile environment, but it is a
1340good practice to explicitly import the module. In the future, using SRFI-4
1341procedures without importing the SRFI-4 module will cause a deprecation message
1342to be printed. (Of course, one may call the C functions at any time. Would that
1343C had modules!)
1344
1345@menu
1346* SRFI-4 Overview:: The warp and weft of uniform numeric vectors.
1347* SRFI-4 API:: Uniform vectors, from Scheme and from C.
1348* SRFI-4 Generic Operations:: The general, operating on the specific.
1349* SRFI-4 and Bytevectors:: SRFI-4 vectors are backed by bytevectors.
1350* SRFI-4 Extensions:: Guile-specific extensions to the standard.
1351@end menu
1352
1353@node SRFI-4 Overview
1354@subsubsection SRFI-4 - Overview
1355
1356Uniform numeric vectors can be useful since they consume less memory
1357than the non-uniform, general vectors. Also, since the types they can
1358store correspond directly to C types, it is easier to work with them
1359efficiently on a low level. Consider image processing as an example,
1360where you want to apply a filter to some image. While you could store
1361the pixels of an image in a general vector and write a general
1362convolution function, things are much more efficient with uniform
1363vectors: the convolution function knows that all pixels are unsigned
13648-bit values (say), and can use a very tight inner loop.
1365
1366This is implemented in Scheme by having the compiler notice calls to the SRFI-4
1367accessors, and inline them to appropriate compiled code. From C you have access
1368to the raw array; functions for efficiently working with uniform numeric vectors
1369from C are listed at the end of this section.
1370
1371Uniform numeric vectors are the special case of one dimensional uniform
1372numeric arrays.
1373
1374There are 12 standard kinds of uniform numeric vectors, and they all have their
1375own complement of constructors, accessors, and so on. Procedures that operate on
1376a specific kind of uniform numeric vector have a ``tag'' in their name,
1377indicating the element type.
1378
1379@table @nicode
1380@item u8
1381unsigned 8-bit integers
1382
1383@item s8
1384signed 8-bit integers
1385
1386@item u16
1387unsigned 16-bit integers
1388
1389@item s16
1390signed 16-bit integers
1391
1392@item u32
1393unsigned 32-bit integers
1394
1395@item s32
1396signed 32-bit integers
1397
1398@item u64
1399unsigned 64-bit integers
1400
1401@item s64
1402signed 64-bit integers
1403
1404@item f32
1405the C type @code{float}
1406
1407@item f64
1408the C type @code{double}
1409
1410@end table
1411
1412In addition, Guile supports uniform arrays of complex numbers, with the
1413nonstandard tags:
1414
1415@table @nicode
1416
1417@item c32
1418complex numbers in rectangular form with the real and imaginary part
1419being a @code{float}
1420
1421@item c64
1422complex numbers in rectangular form with the real and imaginary part
1423being a @code{double}
1424
1425@end table
1426
1427The external representation (ie.@: read syntax) for these vectors is
1428similar to normal Scheme vectors, but with an additional tag from the
1429tables above indicating the vector's type. For example,
1430
1431@lisp
1432#u16(1 2 3)
1433#f64(3.1415 2.71)
1434@end lisp
1435
1436Note that the read syntax for floating-point here conflicts with
1437@code{#f} for false. In Standard Scheme one can write @code{(1 #f3)}
1438for a three element list @code{(1 #f 3)}, but for Guile @code{(1 #f3)}
1439is invalid. @code{(1 #f 3)} is almost certainly what one should write
1440anyway to make the intention clear, so this is rarely a problem.
1441
1442
1443@node SRFI-4 API
1444@subsubsection SRFI-4 - API
1445
1446Note that the @nicode{c32} and @nicode{c64} functions are only available from
1447@nicode{(srfi srfi-4 gnu)}.
1448
1449@deffn {Scheme Procedure} u8vector? obj
1450@deffnx {Scheme Procedure} s8vector? obj
1451@deffnx {Scheme Procedure} u16vector? obj
1452@deffnx {Scheme Procedure} s16vector? obj
1453@deffnx {Scheme Procedure} u32vector? obj
1454@deffnx {Scheme Procedure} s32vector? obj
1455@deffnx {Scheme Procedure} u64vector? obj
1456@deffnx {Scheme Procedure} s64vector? obj
1457@deffnx {Scheme Procedure} f32vector? obj
1458@deffnx {Scheme Procedure} f64vector? obj
1459@deffnx {Scheme Procedure} c32vector? obj
1460@deffnx {Scheme Procedure} c64vector? obj
1461@deffnx {C Function} scm_u8vector_p (obj)
1462@deffnx {C Function} scm_s8vector_p (obj)
1463@deffnx {C Function} scm_u16vector_p (obj)
1464@deffnx {C Function} scm_s16vector_p (obj)
1465@deffnx {C Function} scm_u32vector_p (obj)
1466@deffnx {C Function} scm_s32vector_p (obj)
1467@deffnx {C Function} scm_u64vector_p (obj)
1468@deffnx {C Function} scm_s64vector_p (obj)
1469@deffnx {C Function} scm_f32vector_p (obj)
1470@deffnx {C Function} scm_f64vector_p (obj)
1471@deffnx {C Function} scm_c32vector_p (obj)
1472@deffnx {C Function} scm_c64vector_p (obj)
1473Return @code{#t} if @var{obj} is a homogeneous numeric vector of the
1474indicated type.
1475@end deffn
1476
1477@deffn {Scheme Procedure} make-u8vector n [value]
1478@deffnx {Scheme Procedure} make-s8vector n [value]
1479@deffnx {Scheme Procedure} make-u16vector n [value]
1480@deffnx {Scheme Procedure} make-s16vector n [value]
1481@deffnx {Scheme Procedure} make-u32vector n [value]
1482@deffnx {Scheme Procedure} make-s32vector n [value]
1483@deffnx {Scheme Procedure} make-u64vector n [value]
1484@deffnx {Scheme Procedure} make-s64vector n [value]
1485@deffnx {Scheme Procedure} make-f32vector n [value]
1486@deffnx {Scheme Procedure} make-f64vector n [value]
1487@deffnx {Scheme Procedure} make-c32vector n [value]
1488@deffnx {Scheme Procedure} make-c64vector n [value]
5f6ffd66
BT
1489@deffnx {C Function} scm_make_u8vector (n, value)
1490@deffnx {C Function} scm_make_s8vector (n, value)
1491@deffnx {C Function} scm_make_u16vector (n, value)
1492@deffnx {C Function} scm_make_s16vector (n, value)
1493@deffnx {C Function} scm_make_u32vector (n, value)
1494@deffnx {C Function} scm_make_s32vector (n, value)
1495@deffnx {C Function} scm_make_u64vector (n, value)
1496@deffnx {C Function} scm_make_s64vector (n, value)
1497@deffnx {C Function} scm_make_f32vector (n, value)
1498@deffnx {C Function} scm_make_f64vector (n, value)
1499@deffnx {C Function} scm_make_c32vector (n, value)
1500@deffnx {C Function} scm_make_c64vector (n, value)
27219b32
AW
1501Return a newly allocated homogeneous numeric vector holding @var{n}
1502elements of the indicated type. If @var{value} is given, the vector
1503is initialized with that value, otherwise the contents are
1504unspecified.
1505@end deffn
1506
1507@deffn {Scheme Procedure} u8vector value @dots{}
1508@deffnx {Scheme Procedure} s8vector value @dots{}
1509@deffnx {Scheme Procedure} u16vector value @dots{}
1510@deffnx {Scheme Procedure} s16vector value @dots{}
1511@deffnx {Scheme Procedure} u32vector value @dots{}
1512@deffnx {Scheme Procedure} s32vector value @dots{}
1513@deffnx {Scheme Procedure} u64vector value @dots{}
1514@deffnx {Scheme Procedure} s64vector value @dots{}
1515@deffnx {Scheme Procedure} f32vector value @dots{}
1516@deffnx {Scheme Procedure} f64vector value @dots{}
1517@deffnx {Scheme Procedure} c32vector value @dots{}
1518@deffnx {Scheme Procedure} c64vector value @dots{}
1519@deffnx {C Function} scm_u8vector (values)
1520@deffnx {C Function} scm_s8vector (values)
1521@deffnx {C Function} scm_u16vector (values)
1522@deffnx {C Function} scm_s16vector (values)
1523@deffnx {C Function} scm_u32vector (values)
1524@deffnx {C Function} scm_s32vector (values)
1525@deffnx {C Function} scm_u64vector (values)
1526@deffnx {C Function} scm_s64vector (values)
1527@deffnx {C Function} scm_f32vector (values)
1528@deffnx {C Function} scm_f64vector (values)
1529@deffnx {C Function} scm_c32vector (values)
1530@deffnx {C Function} scm_c64vector (values)
1531Return a newly allocated homogeneous numeric vector of the indicated
1532type, holding the given parameter @var{value}s. The vector length is
1533the number of parameters given.
1534@end deffn
1535
1536@deffn {Scheme Procedure} u8vector-length vec
1537@deffnx {Scheme Procedure} s8vector-length vec
1538@deffnx {Scheme Procedure} u16vector-length vec
1539@deffnx {Scheme Procedure} s16vector-length vec
1540@deffnx {Scheme Procedure} u32vector-length vec
1541@deffnx {Scheme Procedure} s32vector-length vec
1542@deffnx {Scheme Procedure} u64vector-length vec
1543@deffnx {Scheme Procedure} s64vector-length vec
1544@deffnx {Scheme Procedure} f32vector-length vec
1545@deffnx {Scheme Procedure} f64vector-length vec
1546@deffnx {Scheme Procedure} c32vector-length vec
1547@deffnx {Scheme Procedure} c64vector-length vec
1548@deffnx {C Function} scm_u8vector_length (vec)
1549@deffnx {C Function} scm_s8vector_length (vec)
1550@deffnx {C Function} scm_u16vector_length (vec)
1551@deffnx {C Function} scm_s16vector_length (vec)
1552@deffnx {C Function} scm_u32vector_length (vec)
1553@deffnx {C Function} scm_s32vector_length (vec)
1554@deffnx {C Function} scm_u64vector_length (vec)
1555@deffnx {C Function} scm_s64vector_length (vec)
1556@deffnx {C Function} scm_f32vector_length (vec)
1557@deffnx {C Function} scm_f64vector_length (vec)
1558@deffnx {C Function} scm_c32vector_length (vec)
1559@deffnx {C Function} scm_c64vector_length (vec)
1560Return the number of elements in @var{vec}.
1561@end deffn
1562
1563@deffn {Scheme Procedure} u8vector-ref vec i
1564@deffnx {Scheme Procedure} s8vector-ref vec i
1565@deffnx {Scheme Procedure} u16vector-ref vec i
1566@deffnx {Scheme Procedure} s16vector-ref vec i
1567@deffnx {Scheme Procedure} u32vector-ref vec i
1568@deffnx {Scheme Procedure} s32vector-ref vec i
1569@deffnx {Scheme Procedure} u64vector-ref vec i
1570@deffnx {Scheme Procedure} s64vector-ref vec i
1571@deffnx {Scheme Procedure} f32vector-ref vec i
1572@deffnx {Scheme Procedure} f64vector-ref vec i
1573@deffnx {Scheme Procedure} c32vector-ref vec i
1574@deffnx {Scheme Procedure} c64vector-ref vec i
5f6ffd66
BT
1575@deffnx {C Function} scm_u8vector_ref (vec, i)
1576@deffnx {C Function} scm_s8vector_ref (vec, i)
1577@deffnx {C Function} scm_u16vector_ref (vec, i)
1578@deffnx {C Function} scm_s16vector_ref (vec, i)
1579@deffnx {C Function} scm_u32vector_ref (vec, i)
1580@deffnx {C Function} scm_s32vector_ref (vec, i)
1581@deffnx {C Function} scm_u64vector_ref (vec, i)
1582@deffnx {C Function} scm_s64vector_ref (vec, i)
1583@deffnx {C Function} scm_f32vector_ref (vec, i)
1584@deffnx {C Function} scm_f64vector_ref (vec, i)
1585@deffnx {C Function} scm_c32vector_ref (vec, i)
1586@deffnx {C Function} scm_c64vector_ref (vec, i)
27219b32
AW
1587Return the element at index @var{i} in @var{vec}. The first element
1588in @var{vec} is index 0.
1589@end deffn
1590
1591@deffn {Scheme Procedure} u8vector-set! vec i value
1592@deffnx {Scheme Procedure} s8vector-set! vec i value
1593@deffnx {Scheme Procedure} u16vector-set! vec i value
1594@deffnx {Scheme Procedure} s16vector-set! vec i value
1595@deffnx {Scheme Procedure} u32vector-set! vec i value
1596@deffnx {Scheme Procedure} s32vector-set! vec i value
1597@deffnx {Scheme Procedure} u64vector-set! vec i value
1598@deffnx {Scheme Procedure} s64vector-set! vec i value
1599@deffnx {Scheme Procedure} f32vector-set! vec i value
1600@deffnx {Scheme Procedure} f64vector-set! vec i value
1601@deffnx {Scheme Procedure} c32vector-set! vec i value
1602@deffnx {Scheme Procedure} c64vector-set! vec i value
5f6ffd66
BT
1603@deffnx {C Function} scm_u8vector_set_x (vec, i, value)
1604@deffnx {C Function} scm_s8vector_set_x (vec, i, value)
1605@deffnx {C Function} scm_u16vector_set_x (vec, i, value)
1606@deffnx {C Function} scm_s16vector_set_x (vec, i, value)
1607@deffnx {C Function} scm_u32vector_set_x (vec, i, value)
1608@deffnx {C Function} scm_s32vector_set_x (vec, i, value)
1609@deffnx {C Function} scm_u64vector_set_x (vec, i, value)
1610@deffnx {C Function} scm_s64vector_set_x (vec, i, value)
1611@deffnx {C Function} scm_f32vector_set_x (vec, i, value)
1612@deffnx {C Function} scm_f64vector_set_x (vec, i, value)
1613@deffnx {C Function} scm_c32vector_set_x (vec, i, value)
1614@deffnx {C Function} scm_c64vector_set_x (vec, i, value)
27219b32
AW
1615Set the element at index @var{i} in @var{vec} to @var{value}. The
1616first element in @var{vec} is index 0. The return value is
1617unspecified.
1618@end deffn
1619
1620@deffn {Scheme Procedure} u8vector->list vec
1621@deffnx {Scheme Procedure} s8vector->list vec
1622@deffnx {Scheme Procedure} u16vector->list vec
1623@deffnx {Scheme Procedure} s16vector->list vec
1624@deffnx {Scheme Procedure} u32vector->list vec
1625@deffnx {Scheme Procedure} s32vector->list vec
1626@deffnx {Scheme Procedure} u64vector->list vec
1627@deffnx {Scheme Procedure} s64vector->list vec
1628@deffnx {Scheme Procedure} f32vector->list vec
1629@deffnx {Scheme Procedure} f64vector->list vec
1630@deffnx {Scheme Procedure} c32vector->list vec
1631@deffnx {Scheme Procedure} c64vector->list vec
1632@deffnx {C Function} scm_u8vector_to_list (vec)
1633@deffnx {C Function} scm_s8vector_to_list (vec)
1634@deffnx {C Function} scm_u16vector_to_list (vec)
1635@deffnx {C Function} scm_s16vector_to_list (vec)
1636@deffnx {C Function} scm_u32vector_to_list (vec)
1637@deffnx {C Function} scm_s32vector_to_list (vec)
1638@deffnx {C Function} scm_u64vector_to_list (vec)
1639@deffnx {C Function} scm_s64vector_to_list (vec)
1640@deffnx {C Function} scm_f32vector_to_list (vec)
1641@deffnx {C Function} scm_f64vector_to_list (vec)
1642@deffnx {C Function} scm_c32vector_to_list (vec)
1643@deffnx {C Function} scm_c64vector_to_list (vec)
1644Return a newly allocated list holding all elements of @var{vec}.
1645@end deffn
1646
1647@deffn {Scheme Procedure} list->u8vector lst
1648@deffnx {Scheme Procedure} list->s8vector lst
1649@deffnx {Scheme Procedure} list->u16vector lst
1650@deffnx {Scheme Procedure} list->s16vector lst
1651@deffnx {Scheme Procedure} list->u32vector lst
1652@deffnx {Scheme Procedure} list->s32vector lst
1653@deffnx {Scheme Procedure} list->u64vector lst
1654@deffnx {Scheme Procedure} list->s64vector lst
1655@deffnx {Scheme Procedure} list->f32vector lst
1656@deffnx {Scheme Procedure} list->f64vector lst
1657@deffnx {Scheme Procedure} list->c32vector lst
1658@deffnx {Scheme Procedure} list->c64vector lst
1659@deffnx {C Function} scm_list_to_u8vector (lst)
1660@deffnx {C Function} scm_list_to_s8vector (lst)
1661@deffnx {C Function} scm_list_to_u16vector (lst)
1662@deffnx {C Function} scm_list_to_s16vector (lst)
1663@deffnx {C Function} scm_list_to_u32vector (lst)
1664@deffnx {C Function} scm_list_to_s32vector (lst)
1665@deffnx {C Function} scm_list_to_u64vector (lst)
1666@deffnx {C Function} scm_list_to_s64vector (lst)
1667@deffnx {C Function} scm_list_to_f32vector (lst)
1668@deffnx {C Function} scm_list_to_f64vector (lst)
1669@deffnx {C Function} scm_list_to_c32vector (lst)
1670@deffnx {C Function} scm_list_to_c64vector (lst)
1671Return a newly allocated homogeneous numeric vector of the indicated type,
1672initialized with the elements of the list @var{lst}.
1673@end deffn
1674
1675@deftypefn {C Function} SCM scm_take_u8vector (const scm_t_uint8 *data, size_t len)
1676@deftypefnx {C Function} SCM scm_take_s8vector (const scm_t_int8 *data, size_t len)
1677@deftypefnx {C Function} SCM scm_take_u16vector (const scm_t_uint16 *data, size_t len)
1678@deftypefnx {C Function} SCM scm_take_s16vector (const scm_t_int16 *data, size_t len)
1679@deftypefnx {C Function} SCM scm_take_u32vector (const scm_t_uint32 *data, size_t len)
1680@deftypefnx {C Function} SCM scm_take_s32vector (const scm_t_int32 *data, size_t len)
1681@deftypefnx {C Function} SCM scm_take_u64vector (const scm_t_uint64 *data, size_t len)
1682@deftypefnx {C Function} SCM scm_take_s64vector (const scm_t_int64 *data, size_t len)
1683@deftypefnx {C Function} SCM scm_take_f32vector (const float *data, size_t len)
1684@deftypefnx {C Function} SCM scm_take_f64vector (const double *data, size_t len)
1685@deftypefnx {C Function} SCM scm_take_c32vector (const float *data, size_t len)
1686@deftypefnx {C Function} SCM scm_take_c64vector (const double *data, size_t len)
1687Return a new uniform numeric vector of the indicated type and length
1688that uses the memory pointed to by @var{data} to store its elements.
1689This memory will eventually be freed with @code{free}. The argument
1690@var{len} specifies the number of elements in @var{data}, not its size
1691in bytes.
1692
1693The @code{c32} and @code{c64} variants take a pointer to a C array of
1694@code{float}s or @code{double}s. The real parts of the complex numbers
1695are at even indices in that array, the corresponding imaginary parts are
1696at the following odd index.
1697@end deftypefn
1698
1699@deftypefn {C Function} {const scm_t_uint8 *} scm_u8vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1700@deftypefnx {C Function} {const scm_t_int8 *} scm_s8vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1701@deftypefnx {C Function} {const scm_t_uint16 *} scm_u16vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1702@deftypefnx {C Function} {const scm_t_int16 *} scm_s16vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1703@deftypefnx {C Function} {const scm_t_uint32 *} scm_u32vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1704@deftypefnx {C Function} {const scm_t_int32 *} scm_s32vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1705@deftypefnx {C Function} {const scm_t_uint64 *} scm_u64vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1706@deftypefnx {C Function} {const scm_t_int64 *} scm_s64vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
ecb87335 1707@deftypefnx {C Function} {const float *} scm_f32vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
27219b32
AW
1708@deftypefnx {C Function} {const double *} scm_f64vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1709@deftypefnx {C Function} {const float *} scm_c32vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1710@deftypefnx {C Function} {const double *} scm_c64vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1711Like @code{scm_vector_elements} (@pxref{Vector Accessing from C}), but
1712returns a pointer to the elements of a uniform numeric vector of the
1713indicated kind.
1714@end deftypefn
1715
1716@deftypefn {C Function} {scm_t_uint8 *} scm_u8vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1717@deftypefnx {C Function} {scm_t_int8 *} scm_s8vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1718@deftypefnx {C Function} {scm_t_uint16 *} scm_u16vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1719@deftypefnx {C Function} {scm_t_int16 *} scm_s16vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1720@deftypefnx {C Function} {scm_t_uint32 *} scm_u32vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1721@deftypefnx {C Function} {scm_t_int32 *} scm_s32vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1722@deftypefnx {C Function} {scm_t_uint64 *} scm_u64vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1723@deftypefnx {C Function} {scm_t_int64 *} scm_s64vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
ecb87335 1724@deftypefnx {C Function} {float *} scm_f32vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
27219b32
AW
1725@deftypefnx {C Function} {double *} scm_f64vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1726@deftypefnx {C Function} {float *} scm_c32vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1727@deftypefnx {C Function} {double *} scm_c64vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1728Like @code{scm_vector_writable_elements} (@pxref{Vector Accessing from
1729C}), but returns a pointer to the elements of a uniform numeric vector
1730of the indicated kind.
1731@end deftypefn
1732
1733@node SRFI-4 Generic Operations
1734@subsubsection SRFI-4 - Generic operations
1735
1736Guile also provides procedures that operate on all types of uniform numeric
1737vectors. In what is probably a bug, these procedures are currently available in
1738the default environment as well; however prudent hackers will make sure to
1739import @code{(srfi srfi-4 gnu)} before using these.
1740
1741@deftypefn {C Function} int scm_is_uniform_vector (SCM uvec)
1742Return non-zero when @var{uvec} is a uniform numeric vector, zero
1743otherwise.
1744@end deftypefn
1745
1746@deftypefn {C Function} size_t scm_c_uniform_vector_length (SCM uvec)
1747Return the number of elements of @var{uvec} as a @code{size_t}.
1748@end deftypefn
1749
1750@deffn {Scheme Procedure} uniform-vector? obj
1751@deffnx {C Function} scm_uniform_vector_p (obj)
1752Return @code{#t} if @var{obj} is a homogeneous numeric vector of the
1753indicated type.
1754@end deffn
1755
1756@deffn {Scheme Procedure} uniform-vector-length vec
1757@deffnx {C Function} scm_uniform_vector_length (vec)
1758Return the number of elements in @var{vec}.
1759@end deffn
1760
1761@deffn {Scheme Procedure} uniform-vector-ref vec i
5f6ffd66 1762@deffnx {C Function} scm_uniform_vector_ref (vec, i)
27219b32
AW
1763Return the element at index @var{i} in @var{vec}. The first element
1764in @var{vec} is index 0.
1765@end deffn
1766
1767@deffn {Scheme Procedure} uniform-vector-set! vec i value
5f6ffd66 1768@deffnx {C Function} scm_uniform_vector_set_x (vec, i, value)
27219b32
AW
1769Set the element at index @var{i} in @var{vec} to @var{value}. The
1770first element in @var{vec} is index 0. The return value is
1771unspecified.
1772@end deffn
1773
1774@deffn {Scheme Procedure} uniform-vector->list vec
1775@deffnx {C Function} scm_uniform_vector_to_list (vec)
1776Return a newly allocated list holding all elements of @var{vec}.
1777@end deffn
1778
1779@deftypefn {C Function} {const void *} scm_uniform_vector_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1780Like @code{scm_vector_elements} (@pxref{Vector Accessing from C}), but
1781returns a pointer to the elements of a uniform numeric vector.
1782@end deftypefn
1783
1784@deftypefn {C Function} {void *} scm_uniform_vector_writable_elements (SCM vec, scm_t_array_handle *handle, size_t *lenp, ssize_t *incp)
1785Like @code{scm_vector_writable_elements} (@pxref{Vector Accessing from
1786C}), but returns a pointer to the elements of a uniform numeric vector.
1787@end deftypefn
1788
118ff892
AW
1789Unless you really need to the limited generality of these functions, it
1790is best to use the type-specific functions, or the array accessors.
27219b32
AW
1791
1792@node SRFI-4 and Bytevectors
1793@subsubsection SRFI-4 - Relation to bytevectors
1794
1795Guile implements SRFI-4 vectors using bytevectors (@pxref{Bytevectors}). Often
1796when you have a numeric vector, you end up wanting to write its bytes somewhere,
1797or have access to the underlying bytes, or read in bytes from somewhere else.
1798Bytevectors are very good at this sort of thing. But the SRFI-4 APIs are nicer
1799to use when doing number-crunching, because they are addressed by element and
1800not by byte.
1801
1802So as a compromise, Guile allows all bytevector functions to operate on numeric
1803vectors. They address the underlying bytes in the native endianness, as one
1804would expect.
1805
1806Following the same reasoning, that it's just bytes underneath, Guile also allows
1807uniform vectors of a given type to be accessed as if they were of any type. One
1808can fill a @nicode{u32vector}, and access its elements with
1809@nicode{u8vector-ref}. One can use @nicode{f64vector-ref} on bytevectors. It's
1810all the same to Guile.
1811
1812In this way, uniform numeric vectors may be written to and read from
1813input/output ports using the procedures that operate on bytevectors.
1814
1815@xref{Bytevectors}, for more information.
1816
1817
1818@node SRFI-4 Extensions
1819@subsubsection SRFI-4 - Guile extensions
1820
1821Guile defines some useful extensions to SRFI-4, which are not available in the
1822default Guile environment. They may be imported by loading the extensions
1823module:
1824
1825@example
1826(use-modules (srfi srfi-4 gnu))
1827@end example
1828
1829@deffn {Scheme Procedure} any->u8vector obj
1830@deffnx {Scheme Procedure} any->s8vector obj
1831@deffnx {Scheme Procedure} any->u16vector obj
1832@deffnx {Scheme Procedure} any->s16vector obj
1833@deffnx {Scheme Procedure} any->u32vector obj
1834@deffnx {Scheme Procedure} any->s32vector obj
1835@deffnx {Scheme Procedure} any->u64vector obj
1836@deffnx {Scheme Procedure} any->s64vector obj
1837@deffnx {Scheme Procedure} any->f32vector obj
1838@deffnx {Scheme Procedure} any->f64vector obj
1839@deffnx {Scheme Procedure} any->c32vector obj
1840@deffnx {Scheme Procedure} any->c64vector obj
1841@deffnx {C Function} scm_any_to_u8vector (obj)
1842@deffnx {C Function} scm_any_to_s8vector (obj)
1843@deffnx {C Function} scm_any_to_u16vector (obj)
1844@deffnx {C Function} scm_any_to_s16vector (obj)
1845@deffnx {C Function} scm_any_to_u32vector (obj)
1846@deffnx {C Function} scm_any_to_s32vector (obj)
1847@deffnx {C Function} scm_any_to_u64vector (obj)
1848@deffnx {C Function} scm_any_to_s64vector (obj)
1849@deffnx {C Function} scm_any_to_f32vector (obj)
1850@deffnx {C Function} scm_any_to_f64vector (obj)
1851@deffnx {C Function} scm_any_to_c32vector (obj)
1852@deffnx {C Function} scm_any_to_c64vector (obj)
1853Return a (maybe newly allocated) uniform numeric vector of the indicated
1854type, initialized with the elements of @var{obj}, which must be a list,
1855a vector, or a uniform vector. When @var{obj} is already a suitable
1856uniform numeric vector, it is returned unchanged.
1857@end deffn
1858
a0e07ba4
NJ
1859
1860@node SRFI-6
3229f68b 1861@subsection SRFI-6 - Basic String Ports
8742c48b 1862@cindex SRFI-6
a0e07ba4
NJ
1863
1864SRFI-6 defines the procedures @code{open-input-string},
8edab37f
MW
1865@code{open-output-string} and @code{get-output-string}.
1866
1867Note that although versions of these procedures are included in the
1868Guile core, the core versions are not fully conformant with SRFI-6:
1869attempts to read or write characters that are not supported by the
1870current @code{%default-port-encoding} will fail.
1871
1872We therefore recommend that you import this module, which supports all
1873characters:
1874
1875@example
1876(use-modules (srfi srfi-6))
1877@end example
a0e07ba4
NJ
1878
1879@node SRFI-8
3229f68b 1880@subsection SRFI-8 - receive
8742c48b 1881@cindex SRFI-8
a0e07ba4
NJ
1882
1883@code{receive} is a syntax for making the handling of multiple-value
1884procedures easier. It is documented in @xref{Multiple Values}.
1885
1886
1887@node SRFI-9
3229f68b 1888@subsection SRFI-9 - define-record-type
a0e07ba4 1889
6afe385d 1890This SRFI is a syntax for defining new record types and creating
ec7e4f77
LC
1891predicate, constructor, and field getter and setter functions. It is
1892documented in the ``Compound Data Types'' section of the manual
1893(@pxref{SRFI-9 Records}).
a0e07ba4 1894
a0e07ba4
NJ
1895
1896@node SRFI-10
3229f68b 1897@subsection SRFI-10 - Hash-Comma Reader Extension
8742c48b 1898@cindex SRFI-10
a0e07ba4
NJ
1899
1900@cindex hash-comma
1901@cindex #,()
633acbe2
KR
1902This SRFI implements a reader extension @code{#,()} called hash-comma.
1903It allows the reader to give new kinds of objects, for use both in
1904data and as constants or literals in source code. This feature is
1905available with
a0e07ba4 1906
633acbe2
KR
1907@example
1908(use-modules (srfi srfi-10))
1909@end example
1910
1911@noindent
1912The new read syntax is of the form
a0e07ba4
NJ
1913
1914@example
633acbe2 1915#,(@var{tag} @var{arg}@dots{})
a0e07ba4
NJ
1916@end example
1917
633acbe2
KR
1918@noindent
1919where @var{tag} is a symbol and the @var{arg}s are objects taken as
1920parameters. @var{tag}s are registered with the following procedure.
a0e07ba4 1921
633acbe2
KR
1922@deffn {Scheme Procedure} define-reader-ctor tag proc
1923Register @var{proc} as the constructor for a hash-comma read syntax
679cceed 1924starting with symbol @var{tag}, i.e.@: @nicode{#,(@var{tag} arg@dots{})}.
633acbe2
KR
1925@var{proc} is called with the given arguments @code{(@var{proc}
1926arg@dots{})} and the object it returns is the result of the read.
1927@end deffn
a0e07ba4 1928
633acbe2
KR
1929@noindent
1930For example, a syntax giving a list of @var{N} copies of an object.
1931
1932@example
1933(define-reader-ctor 'repeat
1934 (lambda (obj reps)
1935 (make-list reps obj)))
1936
1937(display '#,(repeat 99 3))
1938@print{} (99 99 99)
1939@end example
1940
1941Notice the quote @nicode{'} when the @nicode{#,( )} is used. The
1942@code{repeat} handler returns a list and the program must quote to use
1943it literally, the same as any other list. Ie.
1944
1945@example
1946(display '#,(repeat 99 3))
a0e07ba4 1947@result{}
633acbe2
KR
1948(display '(99 99 99))
1949@end example
a0e07ba4 1950
633acbe2
KR
1951When a handler returns an object which is self-evaluating, like a
1952number or a string, then there's no need for quoting, just as there's
1953no need when giving those directly as literals. For example an
1954addition,
a0e07ba4 1955
633acbe2
KR
1956@example
1957(define-reader-ctor 'sum
1958 (lambda (x y)
1959 (+ x y)))
1960(display #,(sum 123 456)) @print{} 579
1961@end example
1962
1963A typical use for @nicode{#,()} is to get a read syntax for objects
1964which don't otherwise have one. For example, the following allows a
1965hash table to be given literally, with tags and values, ready for fast
1966lookup.
1967
1968@example
1969(define-reader-ctor 'hash
1970 (lambda elems
1971 (let ((table (make-hash-table)))
1972 (for-each (lambda (elem)
01549abb
KR
1973 (apply hash-set! table elem))
1974 elems)
633acbe2
KR
1975 table)))
1976
1977(define (animal->family animal)
1978 (hash-ref '#,(hash ("tiger" "cat")
1979 ("lion" "cat")
1980 ("wolf" "dog"))
1981 animal))
1982
1983(animal->family "lion") @result{} "cat"
1984@end example
1985
1986Or for example the following is a syntax for a compiled regular
1987expression (@pxref{Regular Expressions}).
1988
1989@example
1990(use-modules (ice-9 regex))
1991
1992(define-reader-ctor 'regexp make-regexp)
1993
1994(define (extract-angs str)
1995 (let ((match (regexp-exec '#,(regexp "<([A-Z0-9]+)>") str)))
1996 (and match
1997 (match:substring match 1))))
1998
1999(extract-angs "foo <BAR> quux") @result{} "BAR"
2000@end example
2001
2002@sp 1
2003@nicode{#,()} is somewhat similar to @code{define-macro}
2004(@pxref{Macros}) in that handler code is run to produce a result, but
2005@nicode{#,()} operates at the read stage, so it can appear in data for
2006@code{read} (@pxref{Scheme Read}), not just in code to be executed.
2007
2008Because @nicode{#,()} is handled at read-time it has no direct access
2009to variables etc. A symbol in the arguments is just a symbol, not a
2010variable reference. The arguments are essentially constants, though
2011the handler procedure can use them in any complicated way it might
2012want.
2013
2014Once @code{(srfi srfi-10)} has loaded, @nicode{#,()} is available
2015globally, there's no need to use @code{(srfi srfi-10)} in later
2016modules. Similarly the tags registered are global and can be used
2017anywhere once registered.
2018
2019There's no attempt to record what previous @nicode{#,()} forms have
2020been seen, if two identical forms occur then two calls are made to the
2021handler procedure. The handler might like to maintain a cache or
2022similar to avoid making copies of large objects, depending on expected
2023usage.
2024
2025In code the best uses of @nicode{#,()} are generally when there's a
2026lot of objects of a particular kind as literals or constants. If
2027there's just a few then some local variables and initializers are
2028fine, but that becomes tedious and error prone when there's a lot, and
2029the anonymous and compact syntax of @nicode{#,()} is much better.
a0e07ba4
NJ
2030
2031
2032@node SRFI-11
3229f68b 2033@subsection SRFI-11 - let-values
8742c48b 2034@cindex SRFI-11
a0e07ba4 2035
8742c48b 2036@findex let-values
c010924a 2037@findex let*-values
a0e07ba4 2038This module implements the binding forms for multiple values
c010924a 2039@code{let-values} and @code{let*-values}. These forms are similar to
a0e07ba4
NJ
2040@code{let} and @code{let*} (@pxref{Local Bindings}), but they support
2041binding of the values returned by multiple-valued expressions.
2042
2043Write @code{(use-modules (srfi srfi-11))} to make the bindings
2044available.
2045
2046@lisp
2047(let-values (((x y) (values 1 2))
2048 ((z f) (values 3 4)))
2049 (+ x y z f))
2050@result{}
205110
2052@end lisp
2053
2054@code{let-values} performs all bindings simultaneously, which means that
2055no expression in the binding clauses may refer to variables bound in the
c010924a 2056same clause list. @code{let*-values}, on the other hand, performs the
a0e07ba4
NJ
2057bindings sequentially, just like @code{let*} does for single-valued
2058expressions.
2059
2060
2061@node SRFI-13
3229f68b 2062@subsection SRFI-13 - String Library
8742c48b 2063@cindex SRFI-13
a0e07ba4 2064
5676b4fa 2065The SRFI-13 procedures are always available, @xref{Strings}.
a0e07ba4
NJ
2066
2067@node SRFI-14
3229f68b 2068@subsection SRFI-14 - Character-set Library
8742c48b 2069@cindex SRFI-14
a0e07ba4 2070
050ab45f
MV
2071The SRFI-14 data type and procedures are always available,
2072@xref{Character Sets}.
a0e07ba4
NJ
2073
2074@node SRFI-16
3229f68b 2075@subsection SRFI-16 - case-lambda
8742c48b 2076@cindex SRFI-16
7c2e18cd
KR
2077@cindex variable arity
2078@cindex arity, variable
a0e07ba4 2079
f916cbc4
AW
2080SRFI-16 defines a variable-arity @code{lambda} form,
2081@code{case-lambda}. This form is available in the default Guile
2082environment. @xref{Case-lambda}, for more information.
a0e07ba4
NJ
2083
2084@node SRFI-17
3229f68b 2085@subsection SRFI-17 - Generalized set!
8742c48b 2086@cindex SRFI-17
a0e07ba4 2087
9a18d8d4
KR
2088This SRFI implements a generalized @code{set!}, allowing some
2089``referencing'' functions to be used as the target location of a
2090@code{set!}. This feature is available from
2091
2092@example
2093(use-modules (srfi srfi-17))
2094@end example
2095
2096@noindent
2097For example @code{vector-ref} is extended so that
2098
2099@example
2100(set! (vector-ref vec idx) new-value)
2101@end example
2102
2103@noindent
2104is equivalent to
2105
2106@example
2107(vector-set! vec idx new-value)
2108@end example
2109
2110The idea is that a @code{vector-ref} expression identifies a location,
2111which may be either fetched or stored. The same form is used for the
2112location in both cases, encouraging visual clarity. This is similar
2113to the idea of an ``lvalue'' in C.
2114
2115The mechanism for this kind of @code{set!} is in the Guile core
2116(@pxref{Procedures with Setters}). This module adds definitions of
2117the following functions as procedures with setters, allowing them to
2118be targets of a @code{set!},
2119
2120@quotation
2121@nicode{car}, @nicode{cdr}, @nicode{caar}, @nicode{cadr},
2122@nicode{cdar}, @nicode{cddr}, @nicode{caaar}, @nicode{caadr},
2123@nicode{cadar}, @nicode{caddr}, @nicode{cdaar}, @nicode{cdadr},
2124@nicode{cddar}, @nicode{cdddr}, @nicode{caaaar}, @nicode{caaadr},
2125@nicode{caadar}, @nicode{caaddr}, @nicode{cadaar}, @nicode{cadadr},
2126@nicode{caddar}, @nicode{cadddr}, @nicode{cdaaar}, @nicode{cdaadr},
2127@nicode{cdadar}, @nicode{cdaddr}, @nicode{cddaar}, @nicode{cddadr},
2128@nicode{cdddar}, @nicode{cddddr}
2129
2130@nicode{string-ref}, @nicode{vector-ref}
2131@end quotation
2132
2133The SRFI specifies @code{setter} (@pxref{Procedures with Setters}) as
2134a procedure with setter, allowing the setter for a procedure to be
2135changed, eg.@: @code{(set! (setter foo) my-new-setter-handler)}.
2136Currently Guile does not implement this, a setter can only be
2137specified on creation (@code{getter-with-setter} below).
2138
2139@defun getter-with-setter
2140The same as the Guile core @code{make-procedure-with-setter}
2141(@pxref{Procedures with Setters}).
2142@end defun
a0e07ba4 2143
12991fed 2144
e68f492a
JG
2145@node SRFI-18
2146@subsection SRFI-18 - Multithreading support
2147@cindex SRFI-18
2148
2149This is an implementation of the SRFI-18 threading and synchronization
2150library. The functions and variables described here are provided by
2151
2152@example
2153(use-modules (srfi srfi-18))
2154@end example
2155
2156As a general rule, the data types and functions in this SRFI-18
2157implementation are compatible with the types and functions in Guile's
2158core threading code. For example, mutexes created with the SRFI-18
2159@code{make-mutex} function can be passed to the built-in Guile
2160function @code{lock-mutex} (@pxref{Mutexes and Condition Variables}),
2161and mutexes created with the built-in Guile function @code{make-mutex}
2162can be passed to the SRFI-18 function @code{mutex-lock!}. Cases in
2163which this does not hold true are noted in the following sections.
2164
2165@menu
2166* SRFI-18 Threads:: Executing code
2167* SRFI-18 Mutexes:: Mutual exclusion devices
2168* SRFI-18 Condition variables:: Synchronizing of groups of threads
2169* SRFI-18 Time:: Representation of times and durations
2170* SRFI-18 Exceptions:: Signalling and handling errors
2171@end menu
2172
2173@node SRFI-18 Threads
2174@subsubsection SRFI-18 Threads
2175
2176Threads created by SRFI-18 differ in two ways from threads created by
2177Guile's built-in thread functions. First, a thread created by SRFI-18
2178@code{make-thread} begins in a blocked state and will not start
2179execution until @code{thread-start!} is called on it. Second, SRFI-18
2180threads are constructed with a top-level exception handler that
2181captures any exceptions that are thrown on thread exit. In all other
2182regards, SRFI-18 threads are identical to normal Guile threads.
2183
2184@defun current-thread
2185Returns the thread that called this function. This is the same
2186procedure as the same-named built-in procedure @code{current-thread}
2187(@pxref{Threads}).
2188@end defun
2189
2190@defun thread? obj
2191Returns @code{#t} if @var{obj} is a thread, @code{#f} otherwise. This
2192is the same procedure as the same-named built-in procedure
2193@code{thread?} (@pxref{Threads}).
2194@end defun
2195
2196@defun make-thread thunk [name]
2197Call @code{thunk} in a new thread and with a new dynamic state,
2198returning the new thread and optionally assigning it the object name
2199@var{name}, which may be any Scheme object.
2200
2201Note that the name @code{make-thread} conflicts with the
2202@code{(ice-9 threads)} function @code{make-thread}. Applications
2203wanting to use both of these functions will need to refer to them by
2204different names.
2205@end defun
2206
2207@defun thread-name thread
2208Returns the name assigned to @var{thread} at the time of its creation,
2209or @code{#f} if it was not given a name.
2210@end defun
2211
2212@defun thread-specific thread
2213@defunx thread-specific-set! thread obj
2214Get or set the ``object-specific'' property of @var{thread}. In
2215Guile's implementation of SRFI-18, this value is stored as an object
2216property, and will be @code{#f} if not set.
2217@end defun
2218
2219@defun thread-start! thread
2220Unblocks @var{thread} and allows it to begin execution if it has not
2221done so already.
2222@end defun
2223
2224@defun thread-yield!
2225If one or more threads are waiting to execute, calling
2226@code{thread-yield!} forces an immediate context switch to one of them.
2227Otherwise, @code{thread-yield!} has no effect. @code{thread-yield!}
2228behaves identically to the Guile built-in function @code{yield}.
2229@end defun
2230
2231@defun thread-sleep! timeout
2232The current thread waits until the point specified by the time object
2233@var{timeout} is reached (@pxref{SRFI-18 Time}). This blocks the
2234thread only if @var{timeout} represents a point in the future. it is
2235an error for @var{timeout} to be @code{#f}.
2236@end defun
2237
2238@defun thread-terminate! thread
2239Causes an abnormal termination of @var{thread}. If @var{thread} is
2240not already terminated, all mutexes owned by @var{thread} become
2241unlocked/abandoned. If @var{thread} is the current thread,
2242@code{thread-terminate!} does not return. Otherwise
2243@code{thread-terminate!} returns an unspecified value; the termination
2244of @var{thread} will occur before @code{thread-terminate!} returns.
2245Subsequent attempts to join on @var{thread} will cause a ``terminated
2246thread exception'' to be raised.
2247
2248@code{thread-terminate!} is compatible with the thread cancellation
2249procedures in the core threads API (@pxref{Threads}) in that if a
2250cleanup handler has been installed for the target thread, it will be
2251called before the thread exits and its return value (or exception, if
2252any) will be stored for later retrieval via a call to
2253@code{thread-join!}.
2254@end defun
2255
2256@defun thread-join! thread [timeout [timeout-val]]
2257Wait for @var{thread} to terminate and return its exit value. When a
2258time value @var{timeout} is given, it specifies a point in time where
2259the waiting should be aborted. When the waiting is aborted,
64de6db5 2260@var{timeout-val} is returned if it is specified; otherwise, a
e68f492a
JG
2261@code{join-timeout-exception} exception is raised
2262(@pxref{SRFI-18 Exceptions}). Exceptions may also be raised if the
2263thread was terminated by a call to @code{thread-terminate!}
2264(@code{terminated-thread-exception} will be raised) or if the thread
2265exited by raising an exception that was handled by the top-level
2266exception handler (@code{uncaught-exception} will be raised; the
2267original exception can be retrieved using
2268@code{uncaught-exception-reason}).
2269@end defun
2270
2271
2272@node SRFI-18 Mutexes
2273@subsubsection SRFI-18 Mutexes
2274
2275The behavior of Guile's built-in mutexes is parameterized via a set of
2276flags passed to the @code{make-mutex} procedure in the core
2277(@pxref{Mutexes and Condition Variables}). To satisfy the requirements
2278for mutexes specified by SRFI-18, the @code{make-mutex} procedure
2279described below sets the following flags:
2280@itemize @bullet
2281@item
2282@code{recursive}: the mutex can be locked recursively
2283@item
2284@code{unchecked-unlock}: attempts to unlock a mutex that is already
2285unlocked will not raise an exception
2286@item
2287@code{allow-external-unlock}: the mutex can be unlocked by any thread,
2288not just the thread that locked it originally
2289@end itemize
2290
2291@defun make-mutex [name]
2292Returns a new mutex, optionally assigning it the object name
2293@var{name}, which may be any Scheme object. The returned mutex will be
2294created with the configuration described above. Note that the name
2295@code{make-mutex} conflicts with Guile core function @code{make-mutex}.
2296Applications wanting to use both of these functions will need to refer
2297to them by different names.
2298@end defun
2299
2300@defun mutex-name mutex
2301Returns the name assigned to @var{mutex} at the time of its creation,
2302or @code{#f} if it was not given a name.
2303@end defun
2304
2305@defun mutex-specific mutex
2306@defunx mutex-specific-set! mutex obj
2307Get or set the ``object-specific'' property of @var{mutex}. In Guile's
2308implementation of SRFI-18, this value is stored as an object property,
2309and will be @code{#f} if not set.
2310@end defun
2311
2312@defun mutex-state mutex
2313Returns information about the state of @var{mutex}. Possible values
2314are:
2315@itemize @bullet
2316@item
2317thread @code{T}: the mutex is in the locked/owned state and thread T
2318is the owner of the mutex
2319@item
2320symbol @code{not-owned}: the mutex is in the locked/not-owned state
2321@item
2322symbol @code{abandoned}: the mutex is in the unlocked/abandoned state
2323@item
2324symbol @code{not-abandoned}: the mutex is in the
2325unlocked/not-abandoned state
2326@end itemize
2327@end defun
2328
2329@defun mutex-lock! mutex [timeout [thread]]
2330Lock @var{mutex}, optionally specifying a time object @var{timeout}
2331after which to abort the lock attempt and a thread @var{thread} giving
2332a new owner for @var{mutex} different than the current thread. This
2333procedure has the same behavior as the @code{lock-mutex} procedure in
2334the core library.
2335@end defun
2336
2337@defun mutex-unlock! mutex [condition-variable [timeout]]
2338Unlock @var{mutex}, optionally specifying a condition variable
2339@var{condition-variable} on which to wait, either indefinitely or,
2340optionally, until the time object @var{timeout} has passed, to be
2341signalled. This procedure has the same behavior as the
2342@code{unlock-mutex} procedure in the core library.
2343@end defun
2344
2345
2346@node SRFI-18 Condition variables
2347@subsubsection SRFI-18 Condition variables
2348
2349SRFI-18 does not specify a ``wait'' function for condition variables.
2350Waiting on a condition variable can be simulated using the SRFI-18
2351@code{mutex-unlock!} function described in the previous section, or
2352Guile's built-in @code{wait-condition-variable} procedure can be used.
2353
2354@defun condition-variable? obj
2355Returns @code{#t} if @var{obj} is a condition variable, @code{#f}
2356otherwise. This is the same procedure as the same-named built-in
2357procedure
2358(@pxref{Mutexes and Condition Variables, @code{condition-variable?}}).
2359@end defun
2360
2361@defun make-condition-variable [name]
2362Returns a new condition variable, optionally assigning it the object
2363name @var{name}, which may be any Scheme object. This procedure
2364replaces a procedure of the same name in the core library.
2365@end defun
2366
2367@defun condition-variable-name condition-variable
64de6db5
BT
2368Returns the name assigned to @var{condition-variable} at the time of its
2369creation, or @code{#f} if it was not given a name.
e68f492a
JG
2370@end defun
2371
2372@defun condition-variable-specific condition-variable
2373@defunx condition-variable-specific-set! condition-variable obj
2374Get or set the ``object-specific'' property of
2375@var{condition-variable}. In Guile's implementation of SRFI-18, this
2376value is stored as an object property, and will be @code{#f} if not
2377set.
2378@end defun
2379
2380@defun condition-variable-signal! condition-variable
2381@defunx condition-variable-broadcast! condition-variable
2382Wake up one thread that is waiting for @var{condition-variable}, in
2383the case of @code{condition-variable-signal!}, or all threads waiting
2384for it, in the case of @code{condition-variable-broadcast!}. The
2385behavior of these procedures is equivalent to that of the procedures
2386@code{signal-condition-variable} and
2387@code{broadcast-condition-variable} in the core library.
2388@end defun
2389
2390
2391@node SRFI-18 Time
2392@subsubsection SRFI-18 Time
2393
2394The SRFI-18 time functions manipulate time in two formats: a
2395``time object'' type that represents an absolute point in time in some
2396implementation-specific way; and the number of seconds since some
2397unspecified ``epoch''. In Guile's implementation, the epoch is the
2398Unix epoch, 00:00:00 UTC, January 1, 1970.
2399
2400@defun current-time
2401Return the current time as a time object. This procedure replaces
2402the procedure of the same name in the core library, which returns the
2403current time in seconds since the epoch.
2404@end defun
2405
2406@defun time? obj
2407Returns @code{#t} if @var{obj} is a time object, @code{#f} otherwise.
2408@end defun
2409
2410@defun time->seconds time
2411@defunx seconds->time seconds
2412Convert between time objects and numerical values representing the
2413number of seconds since the epoch. When converting from a time object
2414to seconds, the return value is the number of seconds between
2415@var{time} and the epoch. When converting from seconds to a time
2416object, the return value is a time object that represents a time
2417@var{seconds} seconds after the epoch.
2418@end defun
2419
2420
2421@node SRFI-18 Exceptions
2422@subsubsection SRFI-18 Exceptions
2423
2424SRFI-18 exceptions are identical to the exceptions provided by
2425Guile's implementation of SRFI-34. The behavior of exception
2426handlers invoked to handle exceptions thrown from SRFI-18 functions,
2427however, differs from the conventional behavior of SRFI-34 in that
2428the continuation of the handler is the same as that of the call to
2429the function. Handlers are called in a tail-recursive manner; the
2430exceptions do not ``bubble up''.
2431
2432@defun current-exception-handler
2433Returns the current exception handler.
2434@end defun
2435
2436@defun with-exception-handler handler thunk
2437Installs @var{handler} as the current exception handler and calls the
2438procedure @var{thunk} with no arguments, returning its value as the
2439value of the exception. @var{handler} must be a procedure that accepts
2440a single argument. The current exception handler at the time this
2441procedure is called will be restored after the call returns.
2442@end defun
2443
2444@defun raise obj
2445Raise @var{obj} as an exception. This is the same procedure as the
2446same-named procedure defined in SRFI 34.
2447@end defun
2448
2449@defun join-timeout-exception? obj
2450Returns @code{#t} if @var{obj} is an exception raised as the result of
2451performing a timed join on a thread that does not exit within the
2452specified timeout, @code{#f} otherwise.
2453@end defun
2454
2455@defun abandoned-mutex-exception? obj
2456Returns @code{#t} if @var{obj} is an exception raised as the result of
2457attempting to lock a mutex that has been abandoned by its owner thread,
2458@code{#f} otherwise.
2459@end defun
2460
2461@defun terminated-thread-exception? obj
2462Returns @code{#t} if @var{obj} is an exception raised as the result of
2463joining on a thread that exited as the result of a call to
2464@code{thread-terminate!}.
2465@end defun
2466
2467@defun uncaught-exception? obj
2468@defunx uncaught-exception-reason exc
2469@code{uncaught-exception?} returns @code{#t} if @var{obj} is an
2470exception thrown as the result of joining a thread that exited by
2471raising an exception that was handled by the top-level exception
2472handler installed by @code{make-thread}. When this occurs, the
2473original exception is preserved as part of the exception thrown by
2474@code{thread-join!} and can be accessed by calling
2475@code{uncaught-exception-reason} on that exception. Note that
2476because this exception-preservation mechanism is a side-effect of
2477@code{make-thread}, joining on threads that exited as described above
2478but were created by other means will not raise this
2479@code{uncaught-exception} error.
2480@end defun
2481
2482
12991fed 2483@node SRFI-19
3229f68b 2484@subsection SRFI-19 - Time/Date Library
8742c48b 2485@cindex SRFI-19
7c2e18cd
KR
2486@cindex time
2487@cindex date
12991fed 2488
85600a0f
KR
2489This is an implementation of the SRFI-19 time/date library. The
2490functions and variables described here are provided by
12991fed
TTN
2491
2492@example
85600a0f 2493(use-modules (srfi srfi-19))
12991fed
TTN
2494@end example
2495
7d281fa5
KR
2496@strong{Caution}: The current code in this module incorrectly extends
2497the Gregorian calendar leap year rule back prior to the introduction
2498of those reforms in 1582 (or the appropriate year in various
2499countries). The Julian calendar was used prior to 1582, and there
2500were 10 days skipped for the reform, but the code doesn't implement
2501that.
2502
2503This will be fixed some time. Until then calculations for 1583
2504onwards are correct, but prior to that any day/month/year and day of
2505the week calculations are wrong.
2506
85600a0f
KR
2507@menu
2508* SRFI-19 Introduction::
2509* SRFI-19 Time::
2510* SRFI-19 Date::
2511* SRFI-19 Time/Date conversions::
2512* SRFI-19 Date to string::
2513* SRFI-19 String to date::
2514@end menu
12991fed 2515
85600a0f 2516@node SRFI-19 Introduction
3229f68b 2517@subsubsection SRFI-19 Introduction
85600a0f
KR
2518
2519@cindex universal time
2520@cindex atomic time
2521@cindex UTC
2522@cindex TAI
2523This module implements time and date representations and calculations,
2524in various time systems, including universal time (UTC) and atomic
2525time (TAI).
2526
2527For those not familiar with these time systems, TAI is based on a
2528fixed length second derived from oscillations of certain atoms. UTC
2529differs from TAI by an integral number of seconds, which is increased
2530or decreased at announced times to keep UTC aligned to a mean solar
2531day (the orbit and rotation of the earth are not quite constant).
2532
2533@cindex leap second
2534So far, only increases in the TAI
2535@tex
2536$\leftrightarrow$
2537@end tex
2538@ifnottex
2539<->
2540@end ifnottex
2541UTC difference have been needed. Such an increase is a ``leap
2542second'', an extra second of TAI introduced at the end of a UTC day.
2543When working entirely within UTC this is never seen, every day simply
2544has 86400 seconds. But when converting from TAI to a UTC date, an
2545extra 23:59:60 is present, where normally a day would end at 23:59:59.
2546Effectively the UTC second from 23:59:59 to 00:00:00 has taken two TAI
2547seconds.
2548
2549@cindex system clock
2550In the current implementation, the system clock is assumed to be UTC,
2551and a table of leap seconds in the code converts to TAI. See comments
2552in @file{srfi-19.scm} for how to update this table.
2553
2554@cindex julian day
2555@cindex modified julian day
2556Also, for those not familiar with the terminology, a @dfn{Julian Day}
2557is a real number which is a count of days and fraction of a day, in
2558UTC, starting from -4713-01-01T12:00:00Z, ie.@: midday Monday 1 Jan
7c2e18cd
KR
25594713 B.C. A @dfn{Modified Julian Day} is the same, but starting from
25601858-11-17T00:00:00Z, ie.@: midnight 17 November 1858 UTC. That time
2561is julian day 2400000.5.
85600a0f
KR
2562
2563@c The SRFI-1 spec says -4714-11-24T12:00:00Z (November 24, -4714 at
2564@c noon, UTC), but this is incorrect. It looks like it might have
2565@c arisen from the code incorrectly treating years a multiple of 100
7c2e18cd 2566@c but not 400 prior to 1582 as non-leap years, where instead the Julian
85600a0f
KR
2567@c calendar should be used so all multiples of 4 before 1582 are leap
2568@c years.
2569
2570
2571@node SRFI-19 Time
3229f68b 2572@subsubsection SRFI-19 Time
85600a0f
KR
2573@cindex time
2574
2575A @dfn{time} object has type, seconds and nanoseconds fields
2576representing a point in time starting from some epoch. This is an
2577arbitrary point in time, not just a time of day. Although times are
2578represented in nanoseconds, the actual resolution may be lower.
2579
2580The following variables hold the possible time types. For instance
2581@code{(current-time time-process)} would give the current CPU process
2582time.
2583
2584@defvar time-utc
2585Universal Coordinated Time (UTC).
2586@cindex UTC
2587@end defvar
12991fed 2588
85600a0f
KR
2589@defvar time-tai
2590International Atomic Time (TAI).
2591@cindex TAI
2592@end defvar
12991fed 2593
85600a0f
KR
2594@defvar time-monotonic
2595Monotonic time, meaning a monotonically increasing time starting from
2596an unspecified epoch.
12991fed 2597
85600a0f
KR
2598Note that in the current implementation @code{time-monotonic} is the
2599same as @code{time-tai}, and unfortunately is therefore affected by
2600adjustments to the system clock. Perhaps this will change in the
2601future.
2602@end defvar
12991fed 2603
85600a0f
KR
2604@defvar time-duration
2605A duration, meaning simply a difference between two times.
2606@end defvar
12991fed 2607
85600a0f
KR
2608@defvar time-process
2609CPU time spent in the current process, starting from when the process
2610began.
2611@cindex process time
2612@end defvar
12991fed 2613
85600a0f
KR
2614@defvar time-thread
2615CPU time spent in the current thread. Not currently implemented.
2616@cindex thread time
2617@end defvar
12991fed 2618
85600a0f
KR
2619@sp 1
2620@defun time? obj
2621Return @code{#t} if @var{obj} is a time object, or @code{#f} if not.
2622@end defun
2623
2624@defun make-time type nanoseconds seconds
2625Create a time object with the given @var{type}, @var{seconds} and
2626@var{nanoseconds}.
2627@end defun
2628
2629@defun time-type time
2630@defunx time-nanosecond time
2631@defunx time-second time
2632@defunx set-time-type! time type
2633@defunx set-time-nanosecond! time nsec
2634@defunx set-time-second! time sec
2635Get or set the type, seconds or nanoseconds fields of a time object.
2636
2637@code{set-time-type!} merely changes the field, it doesn't convert the
2638time value. For conversions, see @ref{SRFI-19 Time/Date conversions}.
2639@end defun
2640
2641@defun copy-time time
2642Return a new time object, which is a copy of the given @var{time}.
2643@end defun
2644
2645@defun current-time [type]
2646Return the current time of the given @var{type}. The default
2647@var{type} is @code{time-utc}.
2648
2649Note that the name @code{current-time} conflicts with the Guile core
e68f492a
JG
2650@code{current-time} function (@pxref{Time}) as well as the SRFI-18
2651@code{current-time} function (@pxref{SRFI-18 Time}). Applications
2652wanting to use more than one of these functions will need to refer to
2653them by different names.
85600a0f
KR
2654@end defun
2655
2656@defun time-resolution [type]
2657Return the resolution, in nanoseconds, of the given time @var{type}.
2658The default @var{type} is @code{time-utc}.
2659@end defun
2660
2661@defun time<=? t1 t2
2662@defunx time<? t1 t2
2663@defunx time=? t1 t2
2664@defunx time>=? t1 t2
2665@defunx time>? t1 t2
2666Return @code{#t} or @code{#f} according to the respective relation
2667between time objects @var{t1} and @var{t2}. @var{t1} and @var{t2}
2668must be the same time type.
2669@end defun
2670
2671@defun time-difference t1 t2
2672@defunx time-difference! t1 t2
2673Return a time object of type @code{time-duration} representing the
2674period between @var{t1} and @var{t2}. @var{t1} and @var{t2} must be
2675the same time type.
2676
2677@code{time-difference} returns a new time object,
2678@code{time-difference!} may modify @var{t1} to form its return.
2679@end defun
2680
2681@defun add-duration time duration
2682@defunx add-duration! time duration
2683@defunx subtract-duration time duration
2684@defunx subtract-duration! time duration
2685Return a time object which is @var{time} with the given @var{duration}
2686added or subtracted. @var{duration} must be a time object of type
2687@code{time-duration}.
2688
2689@code{add-duration} and @code{subtract-duration} return a new time
2690object. @code{add-duration!} and @code{subtract-duration!} may modify
2691the given @var{time} to form their return.
2692@end defun
2693
2694
2695@node SRFI-19 Date
3229f68b 2696@subsubsection SRFI-19 Date
85600a0f
KR
2697@cindex date
2698
2699A @dfn{date} object represents a date in the Gregorian calendar and a
2700time of day on that date in some timezone.
2701
2702The fields are year, month, day, hour, minute, second, nanoseconds and
2703timezone. A date object is immutable, its fields can be read but they
2704cannot be modified once the object is created.
2705
2706@defun date? obj
2707Return @code{#t} if @var{obj} is a date object, or @code{#f} if not.
2708@end defun
2709
2710@defun make-date nsecs seconds minutes hours date month year zone-offset
2711Create a new date object.
2712@c
2713@c FIXME: What can we say about the ranges of the values. The
2714@c current code looks it doesn't normalize, but expects then in their
2715@c usual range already.
2716@c
2717@end defun
2718
2719@defun date-nanosecond date
2720Nanoseconds, 0 to 999999999.
2721@end defun
2722
2723@defun date-second date
7c2e18cd
KR
2724Seconds, 0 to 59, or 60 for a leap second. 60 is never seen when working
2725entirely within UTC, it's only when converting to or from TAI.
85600a0f
KR
2726@end defun
2727
2728@defun date-minute date
2729Minutes, 0 to 59.
2730@end defun
2731
2732@defun date-hour date
2733Hour, 0 to 23.
2734@end defun
2735
2736@defun date-day date
2737Day of the month, 1 to 31 (or less, according to the month).
2738@end defun
2739
2740@defun date-month date
2741Month, 1 to 12.
2742@end defun
2743
2744@defun date-year date
7c2e18cd
KR
2745Year, eg.@: 2003. Dates B.C.@: are negative, eg.@: @math{-46} is 46
2746B.C. There is no year 0, year @math{-1} is followed by year 1.
85600a0f
KR
2747@end defun
2748
2749@defun date-zone-offset date
2750Time zone, an integer number of seconds east of Greenwich.
2751@end defun
2752
2753@defun date-year-day date
2754Day of the year, starting from 1 for 1st January.
2755@end defun
2756
2757@defun date-week-day date
2758Day of the week, starting from 0 for Sunday.
2759@end defun
2760
2761@defun date-week-number date dstartw
2762Week of the year, ignoring a first partial week. @var{dstartw} is the
2763day of the week which is taken to start a week, 0 for Sunday, 1 for
2764Monday, etc.
2765@c
2766@c FIXME: The spec doesn't say whether numbering starts at 0 or 1.
2767@c The code looks like it's 0, if that's the correct intention.
2768@c
2769@end defun
2770
2771@c The SRFI text doesn't actually give the default for tz-offset, but
2772@c the reference implementation has the local timezone and the
2773@c conversions functions all specify that, so it should be ok to
2774@c document it here.
2775@c
2776@defun current-date [tz-offset]
7c2e18cd
KR
2777Return a date object representing the current date/time, in UTC offset
2778by @var{tz-offset}. @var{tz-offset} is seconds east of Greenwich and
2779defaults to the local timezone.
85600a0f
KR
2780@end defun
2781
2782@defun current-julian-day
2783@cindex julian day
2784Return the current Julian Day.
2785@end defun
2786
2787@defun current-modified-julian-day
2788@cindex modified julian day
2789Return the current Modified Julian Day.
2790@end defun
2791
2792
2793@node SRFI-19 Time/Date conversions
3229f68b 2794@subsubsection SRFI-19 Time/Date conversions
7c2e18cd
KR
2795@cindex time conversion
2796@cindex date conversion
85600a0f
KR
2797
2798@defun date->julian-day date
2799@defunx date->modified-julian-day date
2800@defunx date->time-monotonic date
2801@defunx date->time-tai date
2802@defunx date->time-utc date
2803@end defun
2804@defun julian-day->date jdn [tz-offset]
2805@defunx julian-day->time-monotonic jdn
2806@defunx julian-day->time-tai jdn
2807@defunx julian-day->time-utc jdn
2808@end defun
2809@defun modified-julian-day->date jdn [tz-offset]
2810@defunx modified-julian-day->time-monotonic jdn
2811@defunx modified-julian-day->time-tai jdn
2812@defunx modified-julian-day->time-utc jdn
2813@end defun
2814@defun time-monotonic->date time [tz-offset]
2815@defunx time-monotonic->time-tai time
2816@defunx time-monotonic->time-tai! time
2817@defunx time-monotonic->time-utc time
2818@defunx time-monotonic->time-utc! time
2819@end defun
2820@defun time-tai->date time [tz-offset]
2821@defunx time-tai->julian-day time
2822@defunx time-tai->modified-julian-day time
2823@defunx time-tai->time-monotonic time
2824@defunx time-tai->time-monotonic! time
2825@defunx time-tai->time-utc time
2826@defunx time-tai->time-utc! time
2827@end defun
2828@defun time-utc->date time [tz-offset]
2829@defunx time-utc->julian-day time
2830@defunx time-utc->modified-julian-day time
2831@defunx time-utc->time-monotonic time
2832@defunx time-utc->time-monotonic! time
2833@defunx time-utc->time-tai time
2834@defunx time-utc->time-tai! time
2835@sp 1
2836Convert between dates, times and days of the respective types. For
2837instance @code{time-tai->time-utc} accepts a @var{time} object of type
2838@code{time-tai} and returns an object of type @code{time-utc}.
2839
85600a0f
KR
2840The @code{!} variants may modify their @var{time} argument to form
2841their return. The plain functions create a new object.
702e6e09
KR
2842
2843For conversions to dates, @var{tz-offset} is seconds east of
2844Greenwich. The default is the local timezone, at the given time, as
2845provided by the system, using @code{localtime} (@pxref{Time}).
2846
2847On 32-bit systems, @code{localtime} is limited to a 32-bit
2848@code{time_t}, so a default @var{tz-offset} is only available for
2849times between Dec 1901 and Jan 2038. For prior dates an application
2850might like to use the value in 1902, though some locations have zone
2851changes prior to that. For future dates an application might like to
2852assume today's rules extend indefinitely. But for correct daylight
2853savings transitions it will be necessary to take an offset for the
2854same day and time but a year in range and which has the same starting
2855weekday and same leap/non-leap (to support rules like last Sunday in
2856October).
85600a0f
KR
2857@end defun
2858
2859@node SRFI-19 Date to string
3229f68b 2860@subsubsection SRFI-19 Date to string
85600a0f 2861@cindex date to string
7c2e18cd 2862@cindex string, from date
85600a0f
KR
2863
2864@defun date->string date [format]
2865Convert a date to a string under the control of a format.
2866@var{format} should be a string containing @samp{~} escapes, which
2867will be expanded as per the following conversion table. The default
2868@var{format} is @samp{~c}, a locale-dependent date and time.
2869
2870Many of these conversion characters are the same as POSIX
2871@code{strftime} (@pxref{Time}), but there are some extras and some
2872variations.
2873
2874@multitable {MMMM} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM}
2875@item @nicode{~~} @tab literal ~
2876@item @nicode{~a} @tab locale abbreviated weekday, eg.@: @samp{Sun}
2877@item @nicode{~A} @tab locale full weekday, eg.@: @samp{Sunday}
2878@item @nicode{~b} @tab locale abbreviated month, eg.@: @samp{Jan}
2879@item @nicode{~B} @tab locale full month, eg.@: @samp{January}
2880@item @nicode{~c} @tab locale date and time, eg.@: @*
2881@samp{Fri Jul 14 20:28:42-0400 2000}
2882@item @nicode{~d} @tab day of month, zero padded, @samp{01} to @samp{31}
2883
2884@c Spec says d/m/y, reference implementation says m/d/y.
2885@c Apparently the reference code was the intention, but would like to
2886@c see an errata published for the spec before contradicting it here.
2887@c
2888@c @item @nicode{~D} @tab date @nicode{~d/~m/~y}
2889
2890@item @nicode{~e} @tab day of month, blank padded, @samp{ 1} to @samp{31}
2891@item @nicode{~f} @tab seconds and fractional seconds,
2892with locale decimal point, eg.@: @samp{5.2}
2893@item @nicode{~h} @tab same as @nicode{~b}
2894@item @nicode{~H} @tab hour, 24-hour clock, zero padded, @samp{00} to @samp{23}
2895@item @nicode{~I} @tab hour, 12-hour clock, zero padded, @samp{01} to @samp{12}
2896@item @nicode{~j} @tab day of year, zero padded, @samp{001} to @samp{366}
2897@item @nicode{~k} @tab hour, 24-hour clock, blank padded, @samp{ 0} to @samp{23}
2898@item @nicode{~l} @tab hour, 12-hour clock, blank padded, @samp{ 1} to @samp{12}
2899@item @nicode{~m} @tab month, zero padded, @samp{01} to @samp{12}
2900@item @nicode{~M} @tab minute, zero padded, @samp{00} to @samp{59}
2901@item @nicode{~n} @tab newline
2902@item @nicode{~N} @tab nanosecond, zero padded, @samp{000000000} to @samp{999999999}
2903@item @nicode{~p} @tab locale AM or PM
2904@item @nicode{~r} @tab time, 12 hour clock, @samp{~I:~M:~S ~p}
2905@item @nicode{~s} @tab number of full seconds since ``the epoch'' in UTC
2906@item @nicode{~S} @tab second, zero padded @samp{00} to @samp{60} @*
2907(usual limit is 59, 60 is a leap second)
2908@item @nicode{~t} @tab horizontal tab character
2909@item @nicode{~T} @tab time, 24 hour clock, @samp{~H:~M:~S}
2910@item @nicode{~U} @tab week of year, Sunday first day of week,
2911@samp{00} to @samp{52}
2912@item @nicode{~V} @tab week of year, Monday first day of week,
2913@samp{01} to @samp{53}
2914@item @nicode{~w} @tab day of week, 0 for Sunday, @samp{0} to @samp{6}
2915@item @nicode{~W} @tab week of year, Monday first day of week,
2916@samp{00} to @samp{52}
2917
2918@c The spec has ~x as an apparent duplicate of ~W, and ~X as a locale
2919@c date. The reference code has ~x as the locale date and ~X as a
2920@c locale time. The rule is apparently that the code should be
2921@c believed, but would like to see an errata for the spec before
2922@c contradicting it here.
2923@c
2924@c @item @nicode{~x} @tab week of year, Monday as first day of week,
2925@c @samp{00} to @samp{53}
2926@c @item @nicode{~X} @tab locale date, eg.@: @samp{07/31/00}
2927
2928@item @nicode{~y} @tab year, two digits, @samp{00} to @samp{99}
2929@item @nicode{~Y} @tab year, full, eg.@: @samp{2003}
2930@item @nicode{~z} @tab time zone, RFC-822 style
2931@item @nicode{~Z} @tab time zone symbol (not currently implemented)
2932@item @nicode{~1} @tab ISO-8601 date, @samp{~Y-~m-~d}
d6bd1826
IP
2933@item @nicode{~2} @tab ISO-8601 time+zone, @samp{~H:~M:~S~z}
2934@item @nicode{~3} @tab ISO-8601 time, @samp{~H:~M:~S}
2935@item @nicode{~4} @tab ISO-8601 date/time+zone, @samp{~Y-~m-~dT~H:~M:~S~z}
2936@item @nicode{~5} @tab ISO-8601 date/time, @samp{~Y-~m-~dT~H:~M:~S}
85600a0f
KR
2937@end multitable
2938@end defun
2939
2940Conversions @samp{~D}, @samp{~x} and @samp{~X} are not currently
2941described here, since the specification and reference implementation
2942differ.
2943
a2f00b9b
LC
2944Conversion is locale-dependent on systems that support it
2945(@pxref{Accessing Locale Information}). @xref{Locales,
2946@code{setlocale}}, for information on how to change the current
2947locale.
85600a0f
KR
2948
2949
2950@node SRFI-19 String to date
3229f68b 2951@subsubsection SRFI-19 String to date
85600a0f 2952@cindex string to date
7c2e18cd 2953@cindex date, from string
85600a0f
KR
2954
2955@c FIXME: Can we say what happens when an incomplete date is
679cceed 2956@c converted? I.e. fields left as 0, or what? The spec seems to be
85600a0f
KR
2957@c silent on this.
2958
2959@defun string->date input template
2960Convert an @var{input} string to a date under the control of a
2961@var{template} string. Return a newly created date object.
2962
2963Literal characters in @var{template} must match characters in
2964@var{input} and @samp{~} escapes must match the input forms described
2965in the table below. ``Skip to'' means characters up to one of the
2966given type are ignored, or ``no skip'' for no skipping. ``Read'' is
2967what's then read, and ``Set'' is the field affected in the date
2968object.
2969
2970For example @samp{~Y} skips input characters until a digit is reached,
2971at which point it expects a year and stores that to the year field of
2972the date.
2973
2974@multitable {MMMM} {@nicode{char-alphabetic?}} {MMMMMMMMMMMMMMMMMMMMMMMMM} {@nicode{date-zone-offset}}
2975@item
2976@tab Skip to
2977@tab Read
2978@tab Set
2979
2980@item @nicode{~~}
2981@tab no skip
2982@tab literal ~
2983@tab nothing
2984
2985@item @nicode{~a}
2986@tab @nicode{char-alphabetic?}
2987@tab locale abbreviated weekday name
2988@tab nothing
2989
2990@item @nicode{~A}
2991@tab @nicode{char-alphabetic?}
2992@tab locale full weekday name
2993@tab nothing
2994
2995@c Note that the SRFI spec says that ~b and ~B don't set anything,
2996@c but that looks like a mistake. The reference implementation sets
2997@c the month field, which seems sensible and is what we describe
2998@c here.
2999
3000@item @nicode{~b}
3001@tab @nicode{char-alphabetic?}
3002@tab locale abbreviated month name
3003@tab @nicode{date-month}
3004
3005@item @nicode{~B}
3006@tab @nicode{char-alphabetic?}
3007@tab locale full month name
3008@tab @nicode{date-month}
3009
3010@item @nicode{~d}
3011@tab @nicode{char-numeric?}
3012@tab day of month
3013@tab @nicode{date-day}
3014
3015@item @nicode{~e}
3016@tab no skip
3017@tab day of month, blank padded
3018@tab @nicode{date-day}
3019
3020@item @nicode{~h}
3021@tab same as @samp{~b}
3022
3023@item @nicode{~H}
3024@tab @nicode{char-numeric?}
3025@tab hour
3026@tab @nicode{date-hour}
3027
3028@item @nicode{~k}
3029@tab no skip
3030@tab hour, blank padded
3031@tab @nicode{date-hour}
3032
3033@item @nicode{~m}
3034@tab @nicode{char-numeric?}
3035@tab month
3036@tab @nicode{date-month}
3037
3038@item @nicode{~M}
3039@tab @nicode{char-numeric?}
3040@tab minute
3041@tab @nicode{date-minute}
3042
3043@item @nicode{~S}
3044@tab @nicode{char-numeric?}
3045@tab second
3046@tab @nicode{date-second}
3047
3048@item @nicode{~y}
3049@tab no skip
3050@tab 2-digit year
3051@tab @nicode{date-year} within 50 years
3052
3053@item @nicode{~Y}
3054@tab @nicode{char-numeric?}
3055@tab year
3056@tab @nicode{date-year}
3057
3058@item @nicode{~z}
3059@tab no skip
3060@tab time zone
3061@tab date-zone-offset
3062@end multitable
3063
3064Notice that the weekday matching forms don't affect the date object
3065returned, instead the weekday will be derived from the day, month and
3066year.
3067
a2f00b9b
LC
3068Conversion is locale-dependent on systems that support it
3069(@pxref{Accessing Locale Information}). @xref{Locales,
3070@code{setlocale}}, for information on how to change the current
3071locale.
85600a0f 3072@end defun
12991fed 3073
8e9af854
NL
3074@node SRFI-23
3075@subsection SRFI-23 - Error Reporting
3076@cindex SRFI-23
3077
3078The SRFI-23 @code{error} procedure is always available.
1de8c1ae 3079
b0b55bd6 3080@node SRFI-26
3229f68b 3081@subsection SRFI-26 - specializing parameters
1de8c1ae 3082@cindex SRFI-26
7c2e18cd
KR
3083@cindex parameter specialize
3084@cindex argument specialize
3085@cindex specialize parameter
1de8c1ae
KR
3086
3087This SRFI provides a syntax for conveniently specializing selected
3088parameters of a function. It can be used with,
3089
3090@example
3091(use-modules (srfi srfi-26))
3092@end example
3093
df0a1002
BT
3094@deffn {library syntax} cut slot1 slot2 @dots{}
3095@deffnx {library syntax} cute slot1 slot2 @dots{}
3096Return a new procedure which will make a call (@var{slot1} @var{slot2}
3097@dots{}) but with selected parameters specialized to given expressions.
1de8c1ae
KR
3098
3099An example will illustrate the idea. The following is a
3100specialization of @code{write}, sending output to
3101@code{my-output-port},
3102
3103@example
3104(cut write <> my-output-port)
3105@result{}
3106(lambda (obj) (write obj my-output-port))
3107@end example
3108
3109The special symbol @code{<>} indicates a slot to be filled by an
3110argument to the new procedure. @code{my-output-port} on the other
3111hand is an expression to be evaluated and passed, ie.@: it specializes
3112the behaviour of @code{write}.
3113
3114@table @nicode
3115@item <>
3116A slot to be filled by an argument from the created procedure.
3117Arguments are assigned to @code{<>} slots in the order they appear in
3118the @code{cut} form, there's no way to re-arrange arguments.
3119
3120The first argument to @code{cut} is usually a procedure (or expression
3121giving a procedure), but @code{<>} is allowed there too. For example,
3122
3123@example
3124(cut <> 1 2 3)
3125@result{}
3126(lambda (proc) (proc 1 2 3))
3127@end example
3128
3129@item <...>
3130A slot to be filled by all remaining arguments from the new procedure.
3131This can only occur at the end of a @code{cut} form.
3132
3133For example, a procedure taking a variable number of arguments like
3134@code{max} but in addition enforcing a lower bound,
3135
3136@example
3137(define my-lower-bound 123)
3138
3139(cut max my-lower-bound <...>)
3140@result{}
3141(lambda arglist (apply max my-lower-bound arglist))
3142@end example
3143@end table
3144
3145For @code{cut} the specializing expressions are evaluated each time
3146the new procedure is called. For @code{cute} they're evaluated just
3147once, when the new procedure is created. The name @code{cute} stands
3148for ``@code{cut} with evaluated arguments''. In all cases the
3149evaluations take place in an unspecified order.
3150
3151The following illustrates the difference between @code{cut} and
3152@code{cute},
3153
3154@example
3155(cut format <> "the time is ~s" (current-time))
3156@result{}
3157(lambda (port) (format port "the time is ~s" (current-time)))
3158
3159(cute format <> "the time is ~s" (current-time))
3160@result{}
3161(let ((val (current-time)))
3162 (lambda (port) (format port "the time is ~s" val))
3163@end example
3164
3165(There's no provision for a mixture of @code{cut} and @code{cute}
3166where some expressions would be evaluated every time but others
3167evaluated only once.)
3168
3169@code{cut} is really just a shorthand for the sort of @code{lambda}
3170forms shown in the above examples. But notice @code{cut} avoids the
3171need to name unspecialized parameters, and is more compact. Use in
3172functional programming style or just with @code{map}, @code{for-each}
3173or similar is typical.
3174
3175@example
3176(map (cut * 2 <>) '(1 2 3 4))
3177
3178(for-each (cut write <> my-port) my-list)
3179@end example
3180@end deffn
b0b55bd6 3181
56ec46a7
AR
3182@node SRFI-27
3183@subsection SRFI-27 - Sources of Random Bits
3184@cindex SRFI-27
3185
6e3d49a0
AR
3186This subsection is based on the
3187@uref{http://srfi.schemers.org/srfi-27/srfi-27.html, specification of
3188SRFI-27} written by Sebastian Egner.
3189
3190@c The copyright notice and license text of the SRFI-27 specification is
3191@c reproduced below:
56ec46a7
AR
3192
3193@c Copyright (C) Sebastian Egner (2002). All Rights Reserved.
3194
3195@c Permission is hereby granted, free of charge, to any person obtaining a
3196@c copy of this software and associated documentation files (the
3197@c "Software"), to deal in the Software without restriction, including
3198@c without limitation the rights to use, copy, modify, merge, publish,
3199@c distribute, sublicense, and/or sell copies of the Software, and to
3200@c permit persons to whom the Software is furnished to do so, subject to
3201@c the following conditions:
3202
3203@c The above copyright notice and this permission notice shall be included
3204@c in all copies or substantial portions of the Software.
3205
3206@c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
3207@c OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3208@c MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
3209@c NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
3210@c LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
3211@c OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
3212@c WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3213
56ec46a7
AR
3214This SRFI provides access to a (pseudo) random number generator; for
3215Guile's built-in random number facilities, which SRFI-27 is implemented
3216upon, @xref{Random}. With SRFI-27, random numbers are obtained from a
3217@emph{random source}, which encapsulates a random number generation
3218algorithm and its state.
3219
3220@menu
3221* SRFI-27 Default Random Source:: Obtaining random numbers
3222* SRFI-27 Random Sources:: Creating and manipulating random sources
3223* SRFI-27 Random Number Generators:: Obtaining random number generators
3224@end menu
3225
3226@node SRFI-27 Default Random Source
3227@subsubsection The Default Random Source
3228@cindex SRFI-27
3229
3230@defun random-integer n
3231Return a random number between zero (inclusive) and @var{n} (exclusive),
3232using the default random source. The numbers returned have a uniform
3233distribution.
3234@end defun
3235
3236@defun random-real
3237Return a random number in (0,1), using the default random source. The
3238numbers returned have a uniform distribution.
3239@end defun
3240
3241@defun default-random-source
3242A random source from which @code{random-integer} and @code{random-real}
3243have been derived using @code{random-source-make-integers} and
3244@code{random-source-make-reals} (@pxref{SRFI-27 Random Number Generators}
3245for those procedures). Note that an assignment to
3246@code{default-random-source} does not change @code{random-integer} or
3247@code{random-real}; it is also strongly recommended not to assign a new
3248value.
3249@end defun
3250
3251@node SRFI-27 Random Sources
3252@subsubsection Random Sources
3253@cindex SRFI-27
3254
3255@defun make-random-source
3256Create a new random source. The stream of random numbers obtained from
3257each random source created by this procedure will be identical, unless
3258its state is changed by one of the procedures below.
3259@end defun
3260
3261@defun random-source? object
3262Tests whether @var{object} is a random source. Random sources are a
3263disjoint type.
3264@end defun
3265
3266@defun random-source-randomize! source
3267Attempt to set the state of the random source to a truly random value.
3268The current implementation uses a seed based on the current system time.
3269@end defun
3270
3271@defun random-source-pseudo-randomize! source i j
3272Changes the state of the random source s into the initial state of the
3273(@var{i}, @var{j})-th independent random source, where @var{i} and
3274@var{j} are non-negative integers. This procedure provides a mechanism
3275to obtain a large number of independent random sources (usually all
3276derived from the same backbone generator), indexed by two integers. In
3277contrast to @code{random-source-randomize!}, this procedure is entirely
3278deterministic.
3279@end defun
3280
3281The state associated with a random state can be obtained an reinstated
3282with the following procedures:
3283
3284@defun random-source-state-ref source
3285@defunx random-source-state-set! source state
3286Get and set the state of a random source. No assumptions should be made
3287about the nature of the state object, besides it having an external
679cceed 3288representation (i.e.@: it can be passed to @code{write} and subsequently
56ec46a7
AR
3289@code{read} back).
3290@end defun
3291
3292@node SRFI-27 Random Number Generators
3293@subsubsection Obtaining random number generator procedures
3294@cindex SRFI-27
3295
3296@defun random-source-make-integers source
3297Obtains a procedure to generate random integers using the random source
3298@var{source}. The returned procedure takes a single argument @var{n},
3299which must be a positive integer, and returns the next uniformly
3300distributed random integer from the interval @{0, ..., @var{n}-1@} by
3301advancing the state of @var{source}.
3302
3303If an application obtains and uses several generators for the same
3304random source @var{source}, a call to any of these generators advances
3305the state of @var{source}. Hence, the generators do not produce the
3306same sequence of random integers each but rather share a state. This
3307also holds for all other types of generators derived from a fixed random
3308sources.
3309
3310While the SRFI text specifies that ``Implementations that support
3311concurrency make sure that the state of a generator is properly
3312advanced'', this is currently not the case in Guile's implementation of
3313SRFI-27, as it would cause a severe performance penalty. So in
3314multi-threaded programs, you either must perform locking on random
3315sources shared between threads yourself, or use different random sources
3316for multiple threads.
3317@end defun
3318
3319@defun random-source-make-reals source
3320@defunx random-source-make-reals source unit
3321Obtains a procedure to generate random real numbers @math{0 < x < 1}
3322using the random source @var{source}. The procedure rand is called
3323without arguments.
3324
3325The optional parameter @var{unit} determines the type of numbers being
3326produced by the returned procedure and the quantization of the output.
3327@var{unit} must be a number such that @math{0 < @var{unit} < 1}. The
3328numbers created by the returned procedure are of the same numerical type
3329as @var{unit} and the potential output values are spaced by at most
3330@var{unit}. One can imagine rand to create numbers as @var{x} *
3331@var{unit} where @var{x} is a random integer in @{1, ...,
3332floor(1/unit)-1@}. Note, however, that this need not be the way the
3333values are actually created and that the actual resolution of rand can
3334be much higher than unit. In case @var{unit} is absent it defaults to a
3335reasonably small value (related to the width of the mantissa of an
3336efficient number format).
3337@end defun
3338
620c8965
LC
3339@node SRFI-30
3340@subsection SRFI-30 - Nested Multi-line Comments
3341@cindex SRFI-30
3342
3343Starting from version 2.0, Guile's @code{read} supports SRFI-30/R6RS
3344nested multi-line comments by default, @ref{Block Comments}.
3345
8638c417
RB
3346@node SRFI-31
3347@subsection SRFI-31 - A special form `rec' for recursive evaluation
3348@cindex SRFI-31
7c2e18cd 3349@cindex recursive expression
8638c417
RB
3350@findex rec
3351
3352SRFI-31 defines a special form that can be used to create
3353self-referential expressions more conveniently. The syntax is as
3354follows:
3355
3356@example
3357@group
3358<rec expression> --> (rec <variable> <expression>)
3359<rec expression> --> (rec (<variable>+) <body>)
3360@end group
3361@end example
3362
3363The first syntax can be used to create self-referential expressions,
3364for example:
3365
3366@lisp
3367 guile> (define tmp (rec ones (cons 1 (delay ones))))
3368@end lisp
3369
3370The second syntax can be used to create anonymous recursive functions:
3371
3372@lisp
3373 guile> (define tmp (rec (display-n item n)
3374 (if (positive? n)
3375 (begin (display n) (display-n (- n 1))))))
3376 guile> (tmp 42 3)
3377 424242
3378 guile>
3379@end lisp
12991fed 3380
eeadfda1 3381
f50ca8da
LC
3382@node SRFI-34
3383@subsection SRFI-34 - Exception handling for programs
3384
3385@cindex SRFI-34
3386Guile provides an implementation of
3387@uref{http://srfi.schemers.org/srfi-34/srfi-34.html, SRFI-34's exception
3388handling mechanisms} as an alternative to its own built-in mechanisms
3389(@pxref{Exceptions}). It can be made available as follows:
3390
3391@lisp
3392(use-modules (srfi srfi-34))
3393@end lisp
3394
3395@c FIXME: Document it.
3396
3397
3398@node SRFI-35
3399@subsection SRFI-35 - Conditions
3400
3401@cindex SRFI-35
3402@cindex conditions
3403@cindex exceptions
3404
3405@uref{http://srfi.schemers.org/srfi-35/srfi-35.html, SRFI-35} implements
3406@dfn{conditions}, a data structure akin to records designed to convey
3407information about exceptional conditions between parts of a program. It
3408is normally used in conjunction with SRFI-34's @code{raise}:
3409
3410@lisp
3411(raise (condition (&message
3412 (message "An error occurred"))))
3413@end lisp
3414
3415Users can define @dfn{condition types} containing arbitrary information.
3416Condition types may inherit from one another. This allows the part of
3417the program that handles (or ``catches'') conditions to get accurate
3418information about the exceptional condition that arose.
3419
3420SRFI-35 conditions are made available using:
3421
3422@lisp
3423(use-modules (srfi srfi-35))
3424@end lisp
3425
3426The procedures available to manipulate condition types are the
3427following:
3428
3429@deffn {Scheme Procedure} make-condition-type id parent field-names
3430Return a new condition type named @var{id}, inheriting from
3431@var{parent}, and with the fields whose names are listed in
3432@var{field-names}. @var{field-names} must be a list of symbols and must
3433not contain names already used by @var{parent} or one of its supertypes.
3434@end deffn
3435
3436@deffn {Scheme Procedure} condition-type? obj
3437Return true if @var{obj} is a condition type.
3438@end deffn
3439
3440Conditions can be created and accessed with the following procedures:
3441
3442@deffn {Scheme Procedure} make-condition type . field+value
3443Return a new condition of type @var{type} with fields initialized as
3444specified by @var{field+value}, a sequence of field names (symbols) and
3445values as in the following example:
3446
3447@lisp
1317062f 3448(let ((&ct (make-condition-type 'foo &condition '(a b c))))
f50ca8da
LC
3449 (make-condition &ct 'a 1 'b 2 'c 3))
3450@end lisp
3451
3452Note that all fields of @var{type} and its supertypes must be specified.
3453@end deffn
3454
df0a1002 3455@deffn {Scheme Procedure} make-compound-condition condition1 condition2 @dots{}
994d87be
BT
3456Return a new compound condition composed of @var{condition1}
3457@var{condition2} @enddots{}. The returned condition has the type of
3458each condition of condition1 condition2 @dots{} (per
3459@code{condition-has-type?}).
f50ca8da
LC
3460@end deffn
3461
3462@deffn {Scheme Procedure} condition-has-type? c type
3463Return true if condition @var{c} has type @var{type}.
3464@end deffn
3465
3466@deffn {Scheme Procedure} condition-ref c field-name
3467Return the value of the field named @var{field-name} from condition @var{c}.
3468
3469If @var{c} is a compound condition and several underlying condition
3470types contain a field named @var{field-name}, then the value of the
3471first such field is returned, using the order in which conditions were
64de6db5 3472passed to @code{make-compound-condition}.
f50ca8da
LC
3473@end deffn
3474
3475@deffn {Scheme Procedure} extract-condition c type
3476Return a condition of condition type @var{type} with the field values
3477specified by @var{c}.
3478
3479If @var{c} is a compound condition, extract the field values from the
3480subcondition belonging to @var{type} that appeared first in the call to
72b3aa56 3481@code{make-compound-condition} that created the condition.
f50ca8da
LC
3482@end deffn
3483
3484Convenience macros are also available to create condition types and
3485conditions.
3486
3487@deffn {library syntax} define-condition-type type supertype predicate field-spec...
3488Define a new condition type named @var{type} that inherits from
3489@var{supertype}. In addition, bind @var{predicate} to a type predicate
3490that returns true when passed a condition of type @var{type} or any of
3491its subtypes. @var{field-spec} must have the form @code{(field
3492accessor)} where @var{field} is the name of field of @var{type} and
3493@var{accessor} is the name of a procedure to access field @var{field} in
3494conditions of type @var{type}.
3495
3496The example below defines condition type @code{&foo}, inheriting from
3497@code{&condition} with fields @code{a}, @code{b} and @code{c}:
3498
3499@lisp
3500(define-condition-type &foo &condition
3501 foo-condition?
3502 (a foo-a)
3503 (b foo-b)
3504 (c foo-c))
3505@end lisp
3506@end deffn
3507
df0a1002
BT
3508@deffn {library syntax} condition type-field-binding1 type-field-binding2 @dots{}
3509Return a new condition or compound condition, initialized according to
3510@var{type-field-binding1} @var{type-field-binding2} @enddots{}. Each
3511@var{type-field-binding} must have the form @code{(type
3512field-specs...)}, where @var{type} is the name of a variable bound to a
3513condition type; each @var{field-spec} must have the form
3514@code{(field-name value)} where @var{field-name} is a symbol denoting
3515the field being initialized to @var{value}. As for
f50ca8da
LC
3516@code{make-condition}, all fields must be specified.
3517
3518The following example returns a simple condition:
3519
3520@lisp
3521(condition (&message (message "An error occurred")))
3522@end lisp
3523
3524The one below returns a compound condition:
3525
3526@lisp
3527(condition (&message (message "An error occurred"))
3528 (&serious))
3529@end lisp
3530@end deffn
3531
3532Finally, SRFI-35 defines a several standard condition types.
3533
3534@defvar &condition
3535This condition type is the root of all condition types. It has no
3536fields.
3537@end defvar
3538
3539@defvar &message
3540A condition type that carries a message describing the nature of the
3541condition to humans.
3542@end defvar
3543
3544@deffn {Scheme Procedure} message-condition? c
3545Return true if @var{c} is of type @code{&message} or one of its
3546subtypes.
3547@end deffn
3548
3549@deffn {Scheme Procedure} condition-message c
3550Return the message associated with message condition @var{c}.
3551@end deffn
3552
3553@defvar &serious
3554This type describes conditions serious enough that they cannot safely be
3555ignored. It has no fields.
3556@end defvar
3557
3558@deffn {Scheme Procedure} serious-condition? c
3559Return true if @var{c} is of type @code{&serious} or one of its
3560subtypes.
3561@end deffn
3562
3563@defvar &error
3564This condition describes errors, typically caused by something that has
3565gone wrong in the interaction of the program with the external world or
3566the user.
3567@end defvar
3568
3569@deffn {Scheme Procedure} error? c
3570Return true if @var{c} is of type @code{&error} or one of its subtypes.
3571@end deffn
3572
d4c38221
LC
3573@node SRFI-37
3574@subsection SRFI-37 - args-fold
3575@cindex SRFI-37
3576
3577This is a processor for GNU @code{getopt_long}-style program
3578arguments. It provides an alternative, less declarative interface
3579than @code{getopt-long} in @code{(ice-9 getopt-long)}
3580(@pxref{getopt-long,,The (ice-9 getopt-long) Module}). Unlike
3581@code{getopt-long}, it supports repeated options and any number of
3582short and long names per option. Access it with:
3583
3584@lisp
3585(use-modules (srfi srfi-37))
3586@end lisp
3587
3588@acronym{SRFI}-37 principally provides an @code{option} type and the
3589@code{args-fold} function. To use the library, create a set of
3590options with @code{option} and use it as a specification for invoking
3591@code{args-fold}.
3592
3593Here is an example of a simple argument processor for the typical
3594@samp{--version} and @samp{--help} options, which returns a backwards
3595list of files given on the command line:
3596
3597@lisp
3598(args-fold (cdr (program-arguments))
3599 (let ((display-and-exit-proc
3600 (lambda (msg)
3601 (lambda (opt name arg loads)
3602 (display msg) (quit)))))
3603 (list (option '(#\v "version") #f #f
3604 (display-and-exit-proc "Foo version 42.0\n"))
3605 (option '(#\h "help") #f #f
3606 (display-and-exit-proc
3607 "Usage: foo scheme-file ..."))))
3608 (lambda (opt name arg loads)
3609 (error "Unrecognized option `~A'" name))
3610 (lambda (op loads) (cons op loads))
3611 '())
3612@end lisp
3613
3614@deffn {Scheme Procedure} option names required-arg? optional-arg? processor
3615Return an object that specifies a single kind of program option.
3616
3617@var{names} is a list of command-line option names, and should consist of
3618characters for traditional @code{getopt} short options and strings for
3619@code{getopt_long}-style long options.
3620
3621@var{required-arg?} and @var{optional-arg?} are mutually exclusive;
3622one or both must be @code{#f}. If @var{required-arg?}, the option
3623must be followed by an argument on the command line, such as
3624@samp{--opt=value} for long options, or an error will be signalled.
3625If @var{optional-arg?}, an argument will be taken if available.
3626
3627@var{processor} is a procedure that takes at least 3 arguments, called
3628when @code{args-fold} encounters the option: the containing option
3629object, the name used on the command line, and the argument given for
3630the option (or @code{#f} if none). The rest of the arguments are
3631@code{args-fold} ``seeds'', and the @var{processor} should return
3632seeds as well.
3633@end deffn
3634
3635@deffn {Scheme Procedure} option-names opt
3636@deffnx {Scheme Procedure} option-required-arg? opt
3637@deffnx {Scheme Procedure} option-optional-arg? opt
3638@deffnx {Scheme Procedure} option-processor opt
3639Return the specified field of @var{opt}, an option object, as
3640described above for @code{option}.
3641@end deffn
3642
df0a1002
BT
3643@deffn {Scheme Procedure} args-fold args options unrecognized-option-proc operand-proc seed @dots{}
3644Process @var{args}, a list of program arguments such as that returned by
3645@code{(cdr (program-arguments))}, in order against @var{options}, a list
3646of option objects as described above. All functions called take the
3647``seeds'', or the last multiple-values as multiple arguments, starting
3648with @var{seed} @dots{}, and must return the new seeds. Return the
d4c38221
LC
3649final seeds.
3650
3651Call @code{unrecognized-option-proc}, which is like an option object's
3652processor, for any options not found in @var{options}.
3653
3654Call @code{operand-proc} with any items on the command line that are
3655not named options. This includes arguments after @samp{--}. It is
3656called with the argument in question, as well as the seeds.
3657@end deffn
3658
12708eeb
AR
3659@node SRFI-38
3660@subsection SRFI-38 - External Representation for Data With Shared Structure
3661@cindex SRFI-38
3662
3663This subsection is based on
3664@uref{http://srfi.schemers.org/srfi-38/srfi-38.html, the specification
3665of SRFI-38} written by Ray Dillinger.
3666
3667@c Copyright (C) Ray Dillinger 2003. All Rights Reserved.
3668
3669@c Permission is hereby granted, free of charge, to any person obtaining a
3670@c copy of this software and associated documentation files (the
3671@c "Software"), to deal in the Software without restriction, including
3672@c without limitation the rights to use, copy, modify, merge, publish,
3673@c distribute, sublicense, and/or sell copies of the Software, and to
3674@c permit persons to whom the Software is furnished to do so, subject to
3675@c the following conditions:
3676
3677@c The above copyright notice and this permission notice shall be included
3678@c in all copies or substantial portions of the Software.
3679
3680@c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
3681@c OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3682@c MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
3683@c NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
3684@c LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
3685@c OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
3686@c WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3687
3688This SRFI creates an alternative external representation for data
3689written and read using @code{write-with-shared-structure} and
3690@code{read-with-shared-structure}. It is identical to the grammar for
3691external representation for data written and read with @code{write} and
3692@code{read} given in section 7 of R5RS, except that the single
3693production
3694
3695@example
3696<datum> --> <simple datum> | <compound datum>
3697@end example
3698
3699is replaced by the following five productions:
3700
3701@example
3702<datum> --> <defining datum> | <nondefining datum> | <defined datum>
3703<defining datum> --> #<indexnum>=<nondefining datum>
3704<defined datum> --> #<indexnum>#
3705<nondefining datum> --> <simple datum> | <compound datum>
3706<indexnum> --> <digit 10>+
3707@end example
3708
3709@deffn {Scheme procedure} write-with-shared-structure obj
3710@deffnx {Scheme procedure} write-with-shared-structure obj port
3711@deffnx {Scheme procedure} write-with-shared-structure obj port optarg
3712
3713Writes an external representation of @var{obj} to the given port.
3714Strings that appear in the written representation are enclosed in
3715doublequotes, and within those strings backslash and doublequote
3716characters are escaped by backslashes. Character objects are written
3717using the @code{#\} notation.
3718
3719Objects which denote locations rather than values (cons cells, vectors,
3720and non-zero-length strings in R5RS scheme; also Guile's structs,
3721bytevectors and ports and hash-tables), if they appear at more than one
3722point in the data being written, are preceded by @samp{#@var{N}=} the
3723first time they are written and replaced by @samp{#@var{N}#} all
3724subsequent times they are written, where @var{N} is a natural number
3725used to identify that particular object. If objects which denote
3726locations occur only once in the structure, then
3727@code{write-with-shared-structure} must produce the same external
3728representation for those objects as @code{write}.
3729
3730@code{write-with-shared-structure} terminates in finite time and
3731produces a finite representation when writing finite data.
3732
3733@code{write-with-shared-structure} returns an unspecified value. The
3734@var{port} argument may be omitted, in which case it defaults to the
3735value returned by @code{(current-output-port)}. The @var{optarg}
3736argument may also be omitted. If present, its effects on the output and
3737return value are unspecified but @code{write-with-shared-structure} must
3738still write a representation that can be read by
3739@code{read-with-shared-structure}. Some implementations may wish to use
3740@var{optarg} to specify formatting conventions, numeric radixes, or
3741return values. Guile's implementation ignores @var{optarg}.
3742
3743For example, the code
3744
3745@lisp
3746(begin (define a (cons 'val1 'val2))
3747 (set-cdr! a a)
3748 (write-with-shared-structure a))
3749@end lisp
3750
3751should produce the output @code{#1=(val1 . #1#)}. This shows a cons
3752cell whose @code{cdr} contains itself.
3753
3754@end deffn
3755
3756@deffn {Scheme procedure} read-with-shared-structure
3757@deffnx {Scheme procedure} read-with-shared-structure port
3758
3759@code{read-with-shared-structure} converts the external representations
3760of Scheme objects produced by @code{write-with-shared-structure} into
3761Scheme objects. That is, it is a parser for the nonterminal
3762@samp{<datum>} in the augmented external representation grammar defined
3763above. @code{read-with-shared-structure} returns the next object
3764parsable from the given input port, updating @var{port} to point to the
3765first character past the end of the external representation of the
3766object.
3767
3768If an end-of-file is encountered in the input before any characters are
3769found that can begin an object, then an end-of-file object is returned.
3770The port remains open, and further attempts to read it (by
3771@code{read-with-shared-structure} or @code{read} will also return an
3772end-of-file object. If an end of file is encountered after the
3773beginning of an object's external representation, but the external
3774representation is incomplete and therefore not parsable, an error is
3775signalled.
3776
3777The @var{port} argument may be omitted, in which case it defaults to the
3778value returned by @code{(current-input-port)}. It is an error to read
3779from a closed port.
3780
3781@end deffn
d4c38221 3782
eeadfda1
KR
3783@node SRFI-39
3784@subsection SRFI-39 - Parameters
3785@cindex SRFI-39
eeadfda1 3786
99db1bc2
AW
3787This SRFI adds support for dynamically-scoped parameters. SRFI 39 is
3788implemented in the Guile core; there's no module needed to get SRFI-39
3789itself. Parameters are documented in @ref{Parameters}.
eeadfda1 3790
99db1bc2
AW
3791This module does export one extra function: @code{with-parameters*}.
3792This is a Guile-specific addition to the SRFI, similar to the core
3793@code{with-fluids*} (@pxref{Fluids and Dynamic States}).
eeadfda1
KR
3794
3795@defun with-parameters* param-list value-list thunk
3796Establish a new dynamic scope, as per @code{parameterize} above,
3797taking parameters from @var{param-list} and corresponding values from
64de6db5 3798@var{value-list}. A call @code{(@var{thunk})} is made in the new
eeadfda1
KR
3799scope and the result from that @var{thunk} is the return from
3800@code{with-parameters*}.
eeadfda1
KR
3801@end defun
3802
50d08cd8
CJY
3803@node SRFI-41
3804@subsection SRFI-41 - Streams
3805@cindex SRFI-41
3806
80b809f1
MW
3807This subsection is based on the
3808@uref{http://srfi.schemers.org/srfi-41/srfi-41.html, specification of
3809SRFI-41} by Philip L.@: Bewig.
3810
3811@c The copyright notice and license text of the SRFI-41 specification is
3812@c reproduced below:
3813
3814@c Copyright (C) Philip L. Bewig (2007). All Rights Reserved.
3815
3816@c Permission is hereby granted, free of charge, to any person obtaining a
3817@c copy of this software and associated documentation files (the
3818@c "Software"), to deal in the Software without restriction, including
3819@c without limitation the rights to use, copy, modify, merge, publish,
3820@c distribute, sublicense, and/or sell copies of the Software, and to
3821@c permit persons to whom the Software is furnished to do so, subject to
3822@c the following conditions:
3823
3824@c The above copyright notice and this permission notice shall be included
3825@c in all copies or substantial portions of the Software.
3826
3827@c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
3828@c OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3829@c MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
3830@c NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
3831@c LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
3832@c OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
3833@c WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3834
3835@noindent
3836This SRFI implements streams, sometimes called lazy lists, a sequential
3837data structure containing elements computed only on demand. A stream is
3838either null or is a pair with a stream in its cdr. Since elements of a
3839stream are computed only when accessed, streams can be infinite. Once
3840computed, the value of a stream element is cached in case it is needed
3841again. SRFI-41 can be made available with:
3842
3843@example
3844(use-modules (srfi srfi-41))
3845@end example
3846
3847@menu
3848* SRFI-41 Stream Fundamentals::
3849* SRFI-41 Stream Primitives::
3850* SRFI-41 Stream Library::
3851@end menu
3852
3853@node SRFI-41 Stream Fundamentals
3854@subsubsection SRFI-41 Stream Fundamentals
3855
3856SRFI-41 Streams are based on two mutually-recursive abstract data types:
3857An object of the @code{stream} abstract data type is a promise that,
0ddf484d 3858when forced, is either @code{stream-null} or is an object of type
80b809f1
MW
3859@code{stream-pair}. An object of the @code{stream-pair} abstract data
3860type contains a @code{stream-car} and a @code{stream-cdr}, which must be
3861a @code{stream}. The essential feature of streams is the systematic
3862suspensions of the recursive promises between the two data types.
3863
3864The object stored in the @code{stream-car} of a @code{stream-pair} is a
3865promise that is forced the first time the @code{stream-car} is accessed;
3866its value is cached in case it is needed again. The object may have any
3867type, and different stream elements may have different types. If the
3868@code{stream-car} is never accessed, the object stored there is never
3869evaluated. Likewise, the @code{stream-cdr} is a promise to return a
3870stream, and is only forced on demand.
3871
3872@node SRFI-41 Stream Primitives
3873@subsubsection SRFI-41 Stream Primitives
3874
3875This library provides eight operators: constructors for
0ddf484d 3876@code{stream-null} and @code{stream-pair}s, type predicates for streams
80b809f1
MW
3877and the two kinds of streams, accessors for both fields of a
3878@code{stream-pair}, and a lambda that creates procedures that return
3879streams.
3880
7bfbd293 3881@defvr {Scheme Variable} stream-null
80b809f1 3882A promise that, when forced, is a single object, distinguishable from
0ddf484d 3883all other objects, that represents the null stream. @code{stream-null}
80b809f1 3884is immutable and unique.
7bfbd293 3885@end defvr
80b809f1
MW
3886
3887@deffn {Scheme Syntax} stream-cons object-expr stream-expr
3888Creates a newly-allocated stream containing a promise that, when forced,
3889is a @code{stream-pair} with @var{object-expr} in its @code{stream-car}
3890and @var{stream-expr} in its @code{stream-cdr}. Neither
3891@var{object-expr} nor @var{stream-expr} is evaluated when
3892@code{stream-cons} is called.
3893
3894Once created, a @code{stream-pair} is immutable; there is no
3895@code{stream-set-car!} or @code{stream-set-cdr!} that modifies an
3896existing stream-pair. There is no dotted-pair or improper stream as
3897with lists.
3898@end deffn
3899
3900@deffn {Scheme Procedure} stream? object
3901Returns true if @var{object} is a stream, otherwise returns false. If
3902@var{object} is a stream, its promise will not be forced. If
3903@code{(stream? obj)} returns true, then one of @code{(stream-null? obj)}
3904or @code{(stream-pair? obj)} will return true and the other will return
3905false.
3906@end deffn
3907
3908@deffn {Scheme Procedure} stream-null? object
3909Returns true if @var{object} is the distinguished null stream, otherwise
3910returns false. If @var{object} is a stream, its promise will be forced.
3911@end deffn
3912
3913@deffn {Scheme Procedure} stream-pair? object
3914Returns true if @var{object} is a @code{stream-pair} constructed by
3915@code{stream-cons}, otherwise returns false. If @var{object} is a
3916stream, its promise will be forced.
3917@end deffn
3918
3919@deffn {Scheme Procedure} stream-car stream
3920Returns the object stored in the @code{stream-car} of @var{stream}. An
3921error is signalled if the argument is not a @code{stream-pair}. This
3922causes the @var{object-expr} passed to @code{stream-cons} to be
3923evaluated if it had not yet been; the value is cached in case it is
3924needed again.
3925@end deffn
3926
3927@deffn {Scheme Procedure} stream-cdr stream
3928Returns the stream stored in the @code{stream-cdr} of @var{stream}. An
3929error is signalled if the argument is not a @code{stream-pair}.
3930@end deffn
3931
3932@deffn {Scheme Syntax} stream-lambda formals body @dots{}
3933Creates a procedure that returns a promise to evaluate the @var{body} of
3934the procedure. The last @var{body} expression to be evaluated must
3935yield a stream. As with normal @code{lambda}, @var{formals} may be a
3936single variable name, in which case all the formal arguments are
3937collected into a single list, or a list of variable names, which may be
3938null if there are no arguments, proper if there are an exact number of
3939arguments, or dotted if a fixed number of arguments is to be followed by
3940zero or more arguments collected into a list. @var{Body} must contain
3941at least one expression, and may contain internal definitions preceding
3942any expressions to be evaluated.
3943@end deffn
3944
3945@example
3946(define strm123
3947 (stream-cons 1
3948 (stream-cons 2
3949 (stream-cons 3
3950 stream-null))))
3951
3952(stream-car strm123) @result{} 1
3953(stream-car (stream-cdr strm123) @result{} 2
3954
3955(stream-pair?
3956 (stream-cdr
3957 (stream-cons (/ 1 0) stream-null))) @result{} #f
3958
3959(stream? (list 1 2 3)) @result{} #f
3960
3961(define iter
3962 (stream-lambda (f x)
3963 (stream-cons x (iter f (f x)))))
3964
3965(define nats (iter (lambda (x) (+ x 1)) 0))
3966
3967(stream-car (stream-cdr nats)) @result{} 1
3968
3969(define stream-add
3970 (stream-lambda (s1 s2)
3971 (stream-cons
3972 (+ (stream-car s1) (stream-car s2))
3973 (stream-add (stream-cdr s1)
3974 (stream-cdr s2)))))
3975
3976(define evens (stream-add nats nats))
3977
3978(stream-car evens) @result{} 0
3979(stream-car (stream-cdr evens)) @result{} 2
3980(stream-car (stream-cdr (stream-cdr evens))) @result{} 4
3981@end example
3982
3983@node SRFI-41 Stream Library
3984@subsubsection SRFI-41 Stream Library
3985
3986@deffn {Scheme Syntax} define-stream (name args @dots{}) body @dots{}
3987Creates a procedure that returns a stream, and may appear anywhere a
3988normal @code{define} may appear, including as an internal definition.
3989It may contain internal definitions of its own. The defined procedure
3990takes arguments in the same way as @code{stream-lambda}.
3991@code{define-stream} is syntactic sugar on @code{stream-lambda}; see
3992also @code{stream-let}, which is also a sugaring of
3993@code{stream-lambda}.
3994
3995A simple version of @code{stream-map} that takes only a single input
3996stream calls itself recursively:
3997
3998@example
3999(define-stream (stream-map proc strm)
4000 (if (stream-null? strm)
4001 stream-null
4002 (stream-cons
4003 (proc (stream-car strm))
4004 (stream-map proc (stream-cdr strm))))))
4005@end example
4006@end deffn
4007
4008@deffn {Scheme Procedure} list->stream list
4009Returns a newly-allocated stream containing the elements from
4010@var{list}.
4011@end deffn
4012
4013@deffn {Scheme Procedure} port->stream [port]
4014Returns a newly-allocated stream containing in its elements the
4015characters on the port. If @var{port} is not given it defaults to the
4016current input port. The returned stream has finite length and is
0ddf484d 4017terminated by @code{stream-null}.
80b809f1
MW
4018
4019It looks like one use of @code{port->stream} would be this:
4020
4021@example
4022(define s ;wrong!
4023 (with-input-from-file filename
4024 (lambda () (port->stream))))
4025@end example
4026
4027But that fails, because @code{with-input-from-file} is eager, and closes
4028the input port prematurely, before the first character is read. To read
4029a file into a stream, say:
4030
4031@example
4032(define-stream (file->stream filename)
4033 (let ((p (open-input-file filename)))
4034 (stream-let loop ((c (read-char p)))
4035 (if (eof-object? c)
4036 (begin (close-input-port p)
4037 stream-null)
4038 (stream-cons c
4039 (loop (read-char p)))))))
4040@end example
4041@end deffn
4042
4043@deffn {Scheme Syntax} stream object-expr @dots{}
4044Creates a newly-allocated stream containing in its elements the objects,
4045in order. The @var{object-expr}s are evaluated when they are accessed,
4046not when the stream is created. If no objects are given, as in
4047(stream), the null stream is returned. See also @code{list->stream}.
4048
4049@example
4050(define strm123 (stream 1 2 3))
4051
4052; (/ 1 0) not evaluated when stream is created
4053(define s (stream 1 (/ 1 0) -1))
4054@end example
4055@end deffn
4056
4057@deffn {Scheme Procedure} stream->list [n] stream
4058Returns a newly-allocated list containing in its elements the first
4059@var{n} items in @var{stream}. If @var{stream} has less than @var{n}
4060items, all the items in the stream will be included in the returned
4061list. If @var{n} is not given it defaults to infinity, which means that
4062unless @var{stream} is finite @code{stream->list} will never return.
4063
4064@example
4065(stream->list 10
4066 (stream-map (lambda (x) (* x x))
4067 (stream-from 0)))
4068 @result{} (0 1 4 9 16 25 36 49 64 81)
4069@end example
4070@end deffn
4071
4072@deffn {Scheme Procedure} stream-append stream @dots{}
4073Returns a newly-allocated stream containing in its elements those
4074elements contained in its input @var{stream}s, in order of input. If
4075any of the input streams is infinite, no elements of any of the
4076succeeding input streams will appear in the output stream. See also
4077@code{stream-concat}.
4078@end deffn
4079
4080@deffn {Scheme Procedure} stream-concat stream
4081Takes a @var{stream} consisting of one or more streams and returns a
4082newly-allocated stream containing all the elements of the input streams.
4083If any of the streams in the input @var{stream} is infinite, any
4084remaining streams in the input stream will never appear in the output
4085stream. See also @code{stream-append}.
4086@end deffn
4087
4088@deffn {Scheme Procedure} stream-constant object @dots{}
4089Returns a newly-allocated stream containing in its elements the
4090@var{object}s, repeating in succession forever.
4091
4092@example
4093(stream-constant 1) @result{} 1 1 1 @dots{}
4094(stream-constant #t #f) @result{} #t #f #t #f #t #f @dots{}
4095@end example
4096@end deffn
4097
4098@deffn {Scheme Procedure} stream-drop n stream
4099Returns the suffix of the input @var{stream} that starts at the next
4100element after the first @var{n} elements. The output stream shares
4101structure with the input @var{stream}; thus, promises forced in one
4102instance of the stream are also forced in the other instance of the
4103stream. If the input @var{stream} has less than @var{n} elements,
4104@code{stream-drop} returns the null stream. See also
4105@code{stream-take}.
4106@end deffn
4107
4108@deffn {Scheme Procedure} stream-drop-while pred stream
4109Returns the suffix of the input @var{stream} that starts at the first
4110element @var{x} for which @code{(pred x)} returns false. The output
4111stream shares structure with the input @var{stream}. See also
4112@code{stream-take-while}.
4113@end deffn
4114
4115@deffn {Scheme Procedure} stream-filter pred stream
4116Returns a newly-allocated stream that contains only those elements
4117@var{x} of the input @var{stream} which satisfy the predicate
4118@code{pred}.
4119
4120@example
4121(stream-filter odd? (stream-from 0))
4122 @result{} 1 3 5 7 9 @dots{}
4123@end example
4124@end deffn
4125
4126@deffn {Scheme Procedure} stream-fold proc base stream
4127Applies a binary procedure @var{proc} to @var{base} and the first
4128element of @var{stream} to compute a new @var{base}, then applies the
4129procedure to the new @var{base} and the next element of @var{stream} to
4130compute a succeeding @var{base}, and so on, accumulating a value that is
4131finally returned as the value of @code{stream-fold} when the end of the
4132stream is reached. @var{stream} must be finite, or @code{stream-fold}
4133will enter an infinite loop. See also @code{stream-scan}, which is
4134similar to @code{stream-fold}, but useful for infinite streams. For
4135readers familiar with other functional languages, this is a left-fold;
4136there is no corresponding right-fold, since right-fold relies on finite
4137streams that are fully-evaluated, in which case they may as well be
4138converted to a list.
4139@end deffn
4140
4141@deffn {Scheme Procedure} stream-for-each proc stream @dots{}
4142Applies @var{proc} element-wise to corresponding elements of the input
4143@var{stream}s for side-effects; it returns nothing.
4144@code{stream-for-each} stops as soon as any of its input streams is
4145exhausted.
4146@end deffn
4147
4148@deffn {Scheme Procedure} stream-from first [step]
4149Creates a newly-allocated stream that contains @var{first} as its first
4150element and increments each succeeding element by @var{step}. If
4151@var{step} is not given it defaults to 1. @var{first} and @var{step}
4152may be of any numeric type. @code{stream-from} is frequently useful as
4153a generator in @code{stream-of} expressions. See also
4154@code{stream-range} for a similar procedure that creates finite streams.
4155@end deffn
4156
4157@deffn {Scheme Procedure} stream-iterate proc base
4158Creates a newly-allocated stream containing @var{base} in its first
4159element and applies @var{proc} to each element in turn to determine the
4160succeeding element. See also @code{stream-unfold} and
4161@code{stream-unfolds}.
4162@end deffn
4163
4164@deffn {Scheme Procedure} stream-length stream
4165Returns the number of elements in the @var{stream}; it does not evaluate
4166its elements. @code{stream-length} may only be used on finite streams;
4167it enters an infinite loop with infinite streams.
4168@end deffn
4169
4170@deffn {Scheme Syntax} stream-let tag ((var expr) @dots{}) body @dots{}
4171Creates a local scope that binds each variable to the value of its
4172corresponding expression. It additionally binds @var{tag} to a
4173procedure which takes the bound variables as arguments and @var{body} as
4174its defining expressions, binding the @var{tag} with
4175@code{stream-lambda}. @var{tag} is in scope within body, and may be
4176called recursively. When the expanded expression defined by the
4177@code{stream-let} is evaluated, @code{stream-let} evaluates the
4178expressions in its @var{body} in an environment containing the
4179newly-bound variables, returning the value of the last expression
4180evaluated, which must yield a stream.
4181
4182@code{stream-let} provides syntactic sugar on @code{stream-lambda}, in
4183the same manner as normal @code{let} provides syntactic sugar on normal
4184@code{lambda}. However, unlike normal @code{let}, the @var{tag} is
4185required, not optional, because unnamed @code{stream-let} is
4186meaningless.
4187
4188For example, @code{stream-member} returns the first @code{stream-pair}
4189of the input @var{strm} with a @code{stream-car} @var{x} that satisfies
4190@code{(eql? obj x)}, or the null stream if @var{x} is not present in
4191@var{strm}.
4192
4193@example
4194(define-stream (stream-member eql? obj strm)
4195 (stream-let loop ((strm strm))
4196 (cond ((stream-null? strm) strm)
4197 ((eql? obj (stream-car strm)) strm)
4198 (else (loop (stream-cdr strm))))))
4199@end example
4200@end deffn
4201
4202@deffn {Scheme Procedure} stream-map proc stream @dots{}
4203Applies @var{proc} element-wise to corresponding elements of the input
4204@var{stream}s, returning a newly-allocated stream containing elements
4205that are the results of those procedure applications. The output stream
4206has as many elements as the minimum-length input stream, and may be
4207infinite.
4208@end deffn
4209
4210@deffn {Scheme Syntax} stream-match stream clause @dots{}
4211Provides pattern-matching for streams. The input @var{stream} is an
4212expression that evaluates to a stream. Clauses are of the form
4213@code{(pattern [fender] expression)}, consisting of a @var{pattern} that
4214matches a stream of a particular shape, an optional @var{fender} that
4215must succeed if the pattern is to match, and an @var{expression} that is
4216evaluated if the pattern matches. There are four types of patterns:
4217
4218@itemize @bullet
4219@item
4220() matches the null stream.
4221
4222@item
4223(@var{pat0} @var{pat1} @dots{}) matches a finite stream with length
4224exactly equal to the number of pattern elements.
4225
4226@item
4227(@var{pat0} @var{pat1} @dots{} @code{.} @var{pat-rest}) matches an
4228infinite stream, or a finite stream with length at least as great as the
4229number of pattern elements before the literal dot.
4230
4231@item
4232@var{pat} matches an entire stream. Should always appear last in the
4233list of clauses; it's not an error to appear elsewhere, but subsequent
4234clauses could never match.
4235@end itemize
4236
4237Each pattern element may be either:
4238
4239@itemize @bullet
4240@item
4241An identifier, which matches any stream element. Additionally, the
4242value of the stream element is bound to the variable named by the
4243identifier, which is in scope in the @var{fender} and @var{expression}
4244of the corresponding @var{clause}. Each identifier in a single pattern
4245must be unique.
4246
4247@item
4248A literal underscore (@code{_}), which matches any stream element but
4249creates no bindings.
4250@end itemize
4251
4252The @var{pattern}s are tested in order, left-to-right, until a matching
4253pattern is found; if @var{fender} is present, it must evaluate to a true
4254value for the match to be successful. Pattern variables are bound in
4255the corresponding @var{fender} and @var{expression}. Once the matching
4256@var{pattern} is found, the corresponding @var{expression} is evaluated
4257and returned as the result of the match. An error is signaled if no
4258pattern matches the input @var{stream}.
4259
4260@code{stream-match} is often used to distinguish null streams from
4261non-null streams, binding @var{head} and @var{tail}:
4262
4263@example
4264(define (len strm)
4265 (stream-match strm
4266 (() 0)
4267 ((head . tail) (+ 1 (len tail)))))
4268@end example
4269
4270Fenders can test the common case where two stream elements must be
4271identical; the @code{else} pattern is an identifier bound to the entire
4272stream, not a keyword as in @code{cond}.
4273
4274@example
4275(stream-match strm
4276 ((x y . _) (equal? x y) 'ok)
4277 (else 'error))
4278@end example
4279
4280A more complex example uses two nested matchers to match two different
4281stream arguments; @code{(stream-merge lt? . strms)} stably merges two or
4282more streams ordered by the @code{lt?} predicate:
4283
4284@example
4285(define-stream (stream-merge lt? . strms)
4286 (define-stream (merge xx yy)
4287 (stream-match xx (() yy) ((x . xs)
4288 (stream-match yy (() xx) ((y . ys)
4289 (if (lt? y x)
4290 (stream-cons y (merge xx ys))
4291 (stream-cons x (merge xs yy))))))))
4292 (stream-let loop ((strms strms))
4293 (cond ((null? strms) stream-null)
4294 ((null? (cdr strms)) (car strms))
4295 (else (merge (car strms)
4296 (apply stream-merge lt?
4297 (cdr strms)))))))
4298@end example
4299@end deffn
4300
4301@deffn {Scheme Syntax} stream-of expr clause @dots{}
4302Provides the syntax of stream comprehensions, which generate streams by
4303means of looping expressions. The result is a stream of objects of the
4304type returned by @var{expr}. There are four types of clauses:
4305
4306@itemize @bullet
4307@item
4308(@var{var} @code{in} @var{stream-expr}) loops over the elements of
4309@var{stream-expr}, in order from the start of the stream, binding each
4310element of the stream in turn to @var{var}. @code{stream-from} and
4311@code{stream-range} are frequently useful as generators for
4312@var{stream-expr}.
4313
4314@item
4315(@var{var} @code{is} @var{expr}) binds @var{var} to the value obtained
4316by evaluating @var{expr}.
4317
4318@item
4319(@var{pred} @var{expr}) includes in the output stream only those
4320elements @var{x} which satisfy the predicate @var{pred}.
4321@end itemize
4322
4323The scope of variables bound in the stream comprehension is the clauses
4324to the right of the binding clause (but not the binding clause itself)
4325plus the result expression.
4326
4327When two or more generators are present, the loops are processed as if
4328they are nested from left to right; that is, the rightmost generator
4329varies fastest. A consequence of this is that only the first generator
4330may be infinite and all subsequent generators must be finite. If no
4331generators are present, the result of a stream comprehension is a stream
4332containing the result expression; thus, @samp{(stream-of 1)} produces a
4333finite stream containing only the element 1.
4334
4335@example
4336(stream-of (* x x)
4337 (x in (stream-range 0 10))
4338 (even? x))
4339 @result{} 0 4 16 36 64
4340
4341(stream-of (list a b)
4342 (a in (stream-range 1 4))
4343 (b in (stream-range 1 3)))
4344 @result{} (1 1) (1 2) (2 1) (2 2) (3 1) (3 2)
4345
4346(stream-of (list i j)
4347 (i in (stream-range 1 5))
4348 (j in (stream-range (+ i 1) 5)))
4349 @result{} (1 2) (1 3) (1 4) (2 3) (2 4) (3 4)
4350@end example
4351@end deffn
4352
4353@deffn {Scheme Procedure} stream-range first past [step]
4354Creates a newly-allocated stream that contains @var{first} as its first
4355element and increments each succeeding element by @var{step}. The
4356stream is finite and ends before @var{past}, which is not an element of
4357the stream. If @var{step} is not given it defaults to 1 if @var{first}
4358is less than past and -1 otherwise. @var{first}, @var{past} and
4359@var{step} may be of any real numeric type. @code{stream-range} is
4360frequently useful as a generator in @code{stream-of} expressions. See
4361also @code{stream-from} for a similar procedure that creates infinite
4362streams.
4363
4364@example
4365(stream-range 0 10) @result{} 0 1 2 3 4 5 6 7 8 9
4366(stream-range 0 10 2) @result{} 0 2 4 6 8
4367@end example
4368
4369Successive elements of the stream are calculated by adding @var{step} to
4370@var{first}, so if any of @var{first}, @var{past} or @var{step} are
4371inexact, the length of the output stream may differ from
4372@code{(ceiling (- (/ (- past first) step) 1)}.
4373@end deffn
4374
4375@deffn {Scheme Procedure} stream-ref stream n
4376Returns the @var{n}th element of stream, counting from zero. An error
4377is signaled if @var{n} is greater than or equal to the length of stream.
4378
4379@example
4380(define (fact n)
4381 (stream-ref
4382 (stream-scan * 1 (stream-from 1))
4383 n))
4384@end example
4385@end deffn
4386
4387@deffn {Scheme Procedure} stream-reverse stream
4388Returns a newly-allocated stream containing the elements of the input
4389@var{stream} but in reverse order. @code{stream-reverse} may only be
4390used with finite streams; it enters an infinite loop with infinite
4391streams. @code{stream-reverse} does not force evaluation of the
4392elements of the stream.
4393@end deffn
4394
4395@deffn {Scheme Procedure} stream-scan proc base stream
4396Accumulates the partial folds of an input @var{stream} into a
4397newly-allocated output stream. The output stream is the @var{base}
4398followed by @code{(stream-fold proc base (stream-take i stream))} for
4399each of the first @var{i} elements of @var{stream}.
4400
4401@example
4402(stream-scan + 0 (stream-from 1))
4403 @result{} (stream 0 1 3 6 10 15 @dots{})
4404
4405(stream-scan * 1 (stream-from 1))
4406 @result{} (stream 1 1 2 6 24 120 @dots{})
4407@end example
4408@end deffn
4409
4410@deffn {Scheme Procedure} stream-take n stream
4411Returns a newly-allocated stream containing the first @var{n} elements
4412of the input @var{stream}. If the input @var{stream} has less than
4413@var{n} elements, so does the output stream. See also
4414@code{stream-drop}.
4415@end deffn
4416
4417@deffn {Scheme Procedure} stream-take-while pred stream
4418Takes a predicate and a @code{stream} and returns a newly-allocated
4419stream containing those elements @code{x} that form the maximal prefix
4420of the input stream which satisfy @var{pred}. See also
4421@code{stream-drop-while}.
4422@end deffn
4423
4424@deffn {Scheme Procedure} stream-unfold map pred gen base
4425The fundamental recursive stream constructor. It constructs a stream by
4426repeatedly applying @var{gen} to successive values of @var{base}, in the
4427manner of @code{stream-iterate}, then applying @var{map} to each of the
4428values so generated, appending each of the mapped values to the output
4429stream as long as @code{(pred? base)} returns a true value. See also
4430@code{stream-iterate} and @code{stream-unfolds}.
4431
4432The expression below creates the finite stream @samp{0 1 4 9 16 25 36 49
443364 81}. Initially the @var{base} is 0, which is less than 10, so
4434@var{map} squares the @var{base} and the mapped value becomes the first
4435element of the output stream. Then @var{gen} increments the @var{base}
4436by 1, so it becomes 1; this is less than 10, so @var{map} squares the
4437new @var{base} and 1 becomes the second element of the output stream.
4438And so on, until the base becomes 10, when @var{pred} stops the
4439recursion and stream-null ends the output stream.
4440
4441@example
4442(stream-unfold
4443 (lambda (x) (expt x 2)) ; map
4444 (lambda (x) (< x 10)) ; pred?
4445 (lambda (x) (+ x 1)) ; gen
4446 0) ; base
4447@end example
4448@end deffn
4449
4450@deffn {Scheme Procedure} stream-unfolds proc seed
4451Returns @var{n} newly-allocated streams containing those elements
4452produced by successive calls to the generator @var{proc}, which takes
4453the current @var{seed} as its argument and returns @var{n}+1 values
4454
4455(@var{proc} @var{seed}) @result{} @var{seed} @var{result_0} @dots{} @var{result_n-1}
4456
4457where the returned @var{seed} is the input @var{seed} to the next call
4458to the generator and @var{result_i} indicates how to produce the next
4459element of the @var{i}th result stream:
4460
4461@itemize @bullet
4462@item
4463(@var{value}): @var{value} is the next car of the result stream.
4464
4465@item
4466@code{#f}: no value produced by this iteration of the generator
4467@var{proc} for the result stream.
4468
4469@item
4470(): the end of the result stream.
4471@end itemize
4472
4473It may require multiple calls of @var{proc} to produce the next element
4474of any particular result stream. See also @code{stream-iterate} and
4475@code{stream-unfold}.
4476
4477@example
4478(define (stream-partition pred? strm)
4479 (stream-unfolds
4480 (lambda (s)
4481 (if (stream-null? s)
4482 (values s '() '())
4483 (let ((a (stream-car s))
4484 (d (stream-cdr s)))
4485 (if (pred? a)
4486 (values d (list a) #f)
4487 (values d #f (list a))))))
4488 strm))
4489
4490(call-with-values
4491 (lambda ()
4492 (stream-partition odd?
4493 (stream-range 1 6)))
4494 (lambda (odds evens)
4495 (list (stream->list odds)
4496 (stream->list evens))))
4497 @result{} ((1 3 5) (2 4))
4498@end example
4499@end deffn
4500
4501@deffn {Scheme Procedure} stream-zip stream @dots{}
4502Returns a newly-allocated stream in which each element is a list (not a
4503stream) of the corresponding elements of the input @var{stream}s. The
4504output stream is as long as the shortest input @var{stream}, if any of
4505the input @var{stream}s is finite, or is infinite if all the input
4506@var{stream}s are infinite.
4507@end deffn
50d08cd8 4508
fdc8fd46
AR
4509@node SRFI-42
4510@subsection SRFI-42 - Eager Comprehensions
4511@cindex SRFI-42
4512
4513See @uref{http://srfi.schemers.org/srfi-42/srfi-42.html, the
4514specification of SRFI-42}.
eeadfda1 4515
9060dc29
MW
4516@node SRFI-43
4517@subsection SRFI-43 - Vector Library
4518@cindex SRFI-43
4519
4520This subsection is based on the
4521@uref{http://srfi.schemers.org/srfi-43/srfi-43.html, specification of
4522SRFI-43} by Taylor Campbell.
4523
4524@c The copyright notice and license text of the SRFI-43 specification is
4525@c reproduced below:
4526
4527@c Copyright (C) Taylor Campbell (2003). All Rights Reserved.
4528
4529@c Permission is hereby granted, free of charge, to any person obtaining a
4530@c copy of this software and associated documentation files (the
4531@c "Software"), to deal in the Software without restriction, including
4532@c without limitation the rights to use, copy, modify, merge, publish,
4533@c distribute, sublicense, and/or sell copies of the Software, and to
4534@c permit persons to whom the Software is furnished to do so, subject to
4535@c the following conditions:
4536
4537@c The above copyright notice and this permission notice shall be included
4538@c in all copies or substantial portions of the Software.
4539
4540@c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
4541@c OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
4542@c MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
4543@c NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
4544@c LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
4545@c OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
4546@c WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4547
4548@noindent
4549SRFI-43 implements a comprehensive library of vector operations. It can
4550be made available with:
4551
4552@example
4553(use-modules (srfi srfi-43))
4554@end example
4555
4556@menu
4557* SRFI-43 Constructors::
4558* SRFI-43 Predicates::
4559* SRFI-43 Selectors::
4560* SRFI-43 Iteration::
4561* SRFI-43 Searching::
4562* SRFI-43 Mutators::
4563* SRFI-43 Conversion::
4564@end menu
4565
4566@node SRFI-43 Constructors
4567@subsubsection SRFI-43 Constructors
4568
4569@deffn {Scheme Procedure} make-vector size [fill]
4570Create and return a vector of size @var{size}, optionally filling it
4571with @var{fill}. The default value of @var{fill} is unspecified.
4572
4573@example
4574(make-vector 5 3) @result{} #(3 3 3 3 3)
4575@end example
4576@end deffn
4577
4578@deffn {Scheme Procedure} vector x @dots{}
4579Create and return a vector whose elements are @var{x} @enddots{}.
4580
4581@example
4582(vector 0 1 2 3 4) @result{} #(0 1 2 3 4)
4583@end example
4584@end deffn
4585
4586@deffn {Scheme Procedure} vector-unfold f length initial-seed @dots{}
4587The fundamental vector constructor. Create a vector whose length is
4588@var{length} and iterates across each index k from 0 up to
4589@var{length} - 1, applying @var{f} at each iteration to the current index
4590and current seeds, in that order, to receive n + 1 values: first, the
4591element to put in the kth slot of the new vector and n new seeds for
4592the next iteration. It is an error for the number of seeds to vary
4593between iterations.
4594
4595@example
4596(vector-unfold (lambda (i x) (values x (- x 1)))
4597 10 0)
4598@result{} #(0 -1 -2 -3 -4 -5 -6 -7 -8 -9)
4599
4600(vector-unfold values 10)
4601@result{} #(0 1 2 3 4 5 6 7 8 9)
4602@end example
4603@end deffn
4604
4605@deffn {Scheme Procedure} vector-unfold-right f length initial-seed @dots{}
4606Like @code{vector-unfold}, but it uses @var{f} to generate elements from
4607right-to-left, rather than left-to-right.
4608
4609@example
4610(vector-unfold-right (lambda (i x) (values x (+ x 1)))
4611 10 0)
4612@result{} #(9 8 7 6 5 4 3 2 1 0)
4613@end example
4614@end deffn
4615
4616@deffn {Scheme Procedure} vector-copy vec [start [end [fill]]]
4617Allocate a new vector whose length is @var{end} - @var{start} and fills
4618it with elements from @var{vec}, taking elements from @var{vec} starting
4619at index @var{start} and stopping at index @var{end}. @var{start}
4620defaults to 0 and @var{end} defaults to the value of
4621@code{(vector-length vec)}. If @var{end} extends beyond the length of
4622@var{vec}, the slots in the new vector that obviously cannot be filled
4623by elements from @var{vec} are filled with @var{fill}, whose default
4624value is unspecified.
4625
4626@example
4627(vector-copy '#(a b c d e f g h i))
4628@result{} #(a b c d e f g h i)
4629
4630(vector-copy '#(a b c d e f g h i) 6)
4631@result{} #(g h i)
4632
4633(vector-copy '#(a b c d e f g h i) 3 6)
4634@result{} #(d e f)
4635
4636(vector-copy '#(a b c d e f g h i) 6 12 'x)
4637@result{} #(g h i x x x)
4638@end example
4639@end deffn
4640
4641@deffn {Scheme Procedure} vector-reverse-copy vec [start [end]]
4642Like @code{vector-copy}, but it copies the elements in the reverse order
4643from @var{vec}.
4644
4645@example
4646(vector-reverse-copy '#(5 4 3 2 1 0) 1 5)
4647@result{} #(1 2 3 4)
4648@end example
4649@end deffn
4650
4651@deffn {Scheme Procedure} vector-append vec @dots{}
4652Return a newly allocated vector that contains all elements in order from
4653the subsequent locations in @var{vec} @enddots{}.
4654
4655@example
4656(vector-append '#(a) '#(b c d))
4657@result{} #(a b c d)
4658@end example
4659@end deffn
4660
4661@deffn {Scheme Procedure} vector-concatenate list-of-vectors
4662Append each vector in @var{list-of-vectors}. Equivalent to
4663@code{(apply vector-append list-of-vectors)}.
4664
4665@example
4666(vector-concatenate '(#(a b) #(c d)))
4667@result{} #(a b c d)
4668@end example
4669@end deffn
4670
4671@node SRFI-43 Predicates
4672@subsubsection SRFI-43 Predicates
4673
4674@deffn {Scheme Procedure} vector? obj
4675Return true if @var{obj} is a vector, else return false.
4676@end deffn
4677
4678@deffn {Scheme Procedure} vector-empty? vec
4679Return true if @var{vec} is empty, i.e. its length is 0, else return
4680false.
4681@end deffn
4682
4683@deffn {Scheme Procedure} vector= elt=? vec @dots{}
4684Return true if the vectors @var{vec} @dots{} have equal lengths and
4685equal elements according to @var{elt=?}. @var{elt=?} is always applied
4686to two arguments. Element comparison must be consistent with @code{eq?}
4687in the following sense: if @code{(eq? a b)} returns true, then
4688@code{(elt=? a b)} must also return true. The order in which
4689comparisons are performed is unspecified.
4690@end deffn
4691
4692@node SRFI-43 Selectors
4693@subsubsection SRFI-43 Selectors
4694
4695@deffn {Scheme Procedure} vector-ref vec i
4696Return the value that the location in @var{vec} at @var{i} is mapped to
4697in the store. Indexing is based on zero.
4698@end deffn
4699
4700@deffn {Scheme Procedure} vector-length vec
4701Return the length of @var{vec}.
4702@end deffn
4703
4704@node SRFI-43 Iteration
4705@subsubsection SRFI-43 Iteration
4706
4707@deffn {Scheme Procedure} vector-fold kons knil vec1 vec2 @dots{}
4708The fundamental vector iterator. @var{kons} is iterated over each index
4709in all of the vectors, stopping at the end of the shortest; @var{kons}
4710is applied as
4711@smalllisp
4712(kons i state (vector-ref vec1 i) (vector-ref vec2 i) ...)
4713@end smalllisp
4714where @var{state} is the current state value, and @var{i} is the current
4715index. The current state value begins with @var{knil}, and becomes
4716whatever @var{kons} returned at the respective iteration. The iteration
4717is strictly left-to-right.
4718@end deffn
4719
4720@deffn {Scheme Procedure} vector-fold-right kons knil vec1 vec2 @dots{}
4721Similar to @code{vector-fold}, but it iterates right-to-left instead of
4722left-to-right.
4723@end deffn
4724
4725@deffn {Scheme Procedure} vector-map f vec1 vec2 @dots{}
4726Return a new vector of the shortest size of the vector arguments. Each
4727element at index i of the new vector is mapped from the old vectors by
4728@smalllisp
4729(f i (vector-ref vec1 i) (vector-ref vec2 i) ...)
4730@end smalllisp
4731The dynamic order of application of @var{f} is unspecified.
4732@end deffn
4733
4734@deffn {Scheme Procedure} vector-map! f vec1 vec2 @dots{}
4735Similar to @code{vector-map}, but rather than mapping the new elements
4736into a new vector, the new mapped elements are destructively inserted
4737into @var{vec1}. The dynamic order of application of @var{f} is
4738unspecified.
4739@end deffn
4740
4741@deffn {Scheme Procedure} vector-for-each f vec1 vec2 @dots{}
4742Call @code{(f i (vector-ref vec1 i) (vector-ref vec2 i) ...)} for each
4743index i less than the length of the shortest vector passed. The
4744iteration is strictly left-to-right.
4745@end deffn
4746
4747@deffn {Scheme Procedure} vector-count pred? vec1 vec2 @dots{}
4748Count the number of parallel elements in the vectors that satisfy
4749@var{pred?}, which is applied, for each index i less than the length of
4750the smallest vector, to i and each parallel element in the vectors at
4751that index, in order.
4752
4753@example
4754(vector-count (lambda (i elt) (even? elt))
4755 '#(3 1 4 1 5 9 2 5 6))
4756@result{} 3
4757(vector-count (lambda (i x y) (< x y))
4758 '#(1 3 6 9) '#(2 4 6 8 10 12))
4759@result{} 2
4760@end example
4761@end deffn
4762
4763@node SRFI-43 Searching
4764@subsubsection SRFI-43 Searching
4765
4766@deffn {Scheme Procedure} vector-index pred? vec1 vec2 @dots{}
4767Find and return the index of the first elements in @var{vec1} @var{vec2}
4768@dots{} that satisfy @var{pred?}. If no matching element is found by
4769the end of the shortest vector, return @code{#f}.
4770
4771@example
4772(vector-index even? '#(3 1 4 1 5 9))
4773@result{} 2
4774(vector-index < '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2))
4775@result{} 1
4776(vector-index = '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2))
4777@result{} #f
4778@end example
4779@end deffn
4780
4781@deffn {Scheme Procedure} vector-index-right pred? vec1 vec2 @dots{}
4782Like @code{vector-index}, but it searches right-to-left, rather than
4783left-to-right. Note that the SRFI 43 specification requires that all
4784the vectors must have the same length, but both the SRFI 43 reference
4785implementation and Guile's implementation allow vectors with unequal
4786lengths, and start searching from the last index of the shortest vector.
4787@end deffn
4788
4789@deffn {Scheme Procedure} vector-skip pred? vec1 vec2 @dots{}
4790Find and return the index of the first elements in @var{vec1} @var{vec2}
4791@dots{} that do not satisfy @var{pred?}. If no matching element is
4792found by the end of the shortest vector, return @code{#f}. Equivalent
4793to @code{vector-index} but with the predicate inverted.
4794
4795@example
4796(vector-skip number? '#(1 2 a b 3 4 c d)) @result{} 2
4797@end example
4798@end deffn
4799
4800@deffn {Scheme Procedure} vector-skip-right pred? vec1 vec2 @dots{}
4801Like @code{vector-skip}, but it searches for a non-matching element
4802right-to-left, rather than left-to-right. Note that the SRFI 43
4803specification requires that all the vectors must have the same length,
4804but both the SRFI 43 reference implementation and Guile's implementation
4805allow vectors with unequal lengths, and start searching from the last
4806index of the shortest vector.
4807@end deffn
4808
4809@deffn {Scheme Procedure} vector-binary-search vec value cmp [start [end]]
4810Find and return an index of @var{vec} between @var{start} and @var{end}
4811whose value is @var{value} using a binary search. If no matching
4812element is found, return @code{#f}. The default @var{start} is 0 and
4813the default @var{end} is the length of @var{vec}.
4814
4815@var{cmp} must be a procedure of two arguments such that @code{(cmp a
4816b)} returns a negative integer if @math{a < b}, a positive integer if
4817@math{a > b}, or zero if @math{a = b}. The elements of @var{vec} must
4818be sorted in non-decreasing order according to @var{cmp}.
4819
4820Note that SRFI 43 does not document the @var{start} and @var{end}
4821arguments, but both its reference implementation and Guile's
4822implementation support them.
4823
4824@example
4825(define (char-cmp c1 c2)
4826 (cond ((char<? c1 c2) -1)
4827 ((char>? c1 c2) 1)
4828 (else 0)))
4829
4830(vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g #\h)
4831 #\g
4832 char-cmp)
4833@result{} 6
4834@end example
4835@end deffn
4836
4837@deffn {Scheme Procedure} vector-any pred? vec1 vec2 @dots{}
4838Find the first parallel set of elements from @var{vec1} @var{vec2}
4839@dots{} for which @var{pred?} returns a true value. If such a parallel
4840set of elements exists, @code{vector-any} returns the value that
4841@var{pred?} returned for that set of elements. The iteration is
4842strictly left-to-right.
4843@end deffn
4844
4845@deffn {Scheme Procedure} vector-every pred? vec1 vec2 @dots{}
4846If, for every index i between 0 and the length of the shortest vector
4847argument, the set of elements @code{(vector-ref vec1 i)}
4848@code{(vector-ref vec2 i)} @dots{} satisfies @var{pred?},
4849@code{vector-every} returns the value that @var{pred?} returned for the
4850last set of elements, at the last index of the shortest vector.
4851Otherwise it returns @code{#f}. The iteration is strictly
4852left-to-right.
4853@end deffn
4854
4855@node SRFI-43 Mutators
4856@subsubsection SRFI-43 Mutators
4857
4858@deffn {Scheme Procedure} vector-set! vec i value
4859Assign the contents of the location at @var{i} in @var{vec} to
4860@var{value}.
4861@end deffn
4862
4863@deffn {Scheme Procedure} vector-swap! vec i j
4864Swap the values of the locations in @var{vec} at @var{i} and @var{j}.
4865@end deffn
4866
4867@deffn {Scheme Procedure} vector-fill! vec fill [start [end]]
4868Assign the value of every location in @var{vec} between @var{start} and
4869@var{end} to @var{fill}. @var{start} defaults to 0 and @var{end}
4870defaults to the length of @var{vec}.
4871@end deffn
4872
4873@deffn {Scheme Procedure} vector-reverse! vec [start [end]]
4874Destructively reverse the contents of @var{vec} between @var{start} and
4875@var{end}. @var{start} defaults to 0 and @var{end} defaults to the
4876length of @var{vec}.
4877@end deffn
4878
4879@deffn {Scheme Procedure} vector-copy! target tstart source [sstart [send]]
4880Copy a block of elements from @var{source} to @var{target}, both of
4881which must be vectors, starting in @var{target} at @var{tstart} and
4882starting in @var{source} at @var{sstart}, ending when (@var{send} -
4883@var{sstart}) elements have been copied. It is an error for
4884@var{target} to have a length less than (@var{tstart} + @var{send} -
4885@var{sstart}). @var{sstart} defaults to 0 and @var{send} defaults to
4886the length of @var{source}.
4887@end deffn
4888
4889@deffn {Scheme Procedure} vector-reverse-copy! target tstart source [sstart [send]]
4890Like @code{vector-copy!}, but this copies the elements in the reverse
4891order. It is an error if @var{target} and @var{source} are identical
4892vectors and the @var{target} and @var{source} ranges overlap; however,
4893if @var{tstart} = @var{sstart}, @code{vector-reverse-copy!} behaves as
4894@code{(vector-reverse! target tstart send)} would.
4895@end deffn
4896
4897@node SRFI-43 Conversion
4898@subsubsection SRFI-43 Conversion
4899
4900@deffn {Scheme Procedure} vector->list vec [start [end]]
4901Return a newly allocated list containing the elements in @var{vec}
4902between @var{start} and @var{end}. @var{start} defaults to 0 and
4903@var{end} defaults to the length of @var{vec}.
4904@end deffn
4905
4906@deffn {Scheme Procedure} reverse-vector->list vec [start [end]]
4907Like @code{vector->list}, but the resulting list contains the specified
4908range of elements of @var{vec} in reverse order.
4909@end deffn
4910
4911@deffn {Scheme Procedure} list->vector proper-list [start [end]]
4912Return a newly allocated vector of the elements from @var{proper-list}
4913with indices between @var{start} and @var{end}. @var{start} defaults to
49140 and @var{end} defaults to the length of @var{proper-list}. Note that
4915SRFI 43 does not document the @var{start} and @var{end} arguments, but
4916both its reference implementation and Guile's implementation support
4917them.
4918@end deffn
4919
4920@deffn {Scheme Procedure} reverse-list->vector proper-list [start [end]]
4921Like @code{list->vector}, but the resulting vector contains the specified
4922range of elements of @var{proper-list} in reverse order. Note that SRFI
492343 does not document the @var{start} and @var{end} arguments, but both
4924its reference implementation and Guile's implementation support them.
4925@end deffn
4926
f16a2007
AR
4927@node SRFI-45
4928@subsection SRFI-45 - Primitives for Expressing Iterative Lazy Algorithms
4929@cindex SRFI-45
4930
4931This subsection is based on @uref{http://srfi.schemers.org/srfi-45/srfi-45.html, the
4932specification of SRFI-45} written by Andr@'e van Tonder.
4933
4934@c Copyright (C) André van Tonder (2003). All Rights Reserved.
4935
4936@c Permission is hereby granted, free of charge, to any person obtaining a
4937@c copy of this software and associated documentation files (the
4938@c "Software"), to deal in the Software without restriction, including
4939@c without limitation the rights to use, copy, modify, merge, publish,
4940@c distribute, sublicense, and/or sell copies of the Software, and to
4941@c permit persons to whom the Software is furnished to do so, subject to
4942@c the following conditions:
4943
4944@c The above copyright notice and this permission notice shall be included
4945@c in all copies or substantial portions of the Software.
4946
4947@c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
4948@c OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
4949@c MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
4950@c NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
4951@c LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
4952@c OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
4953@c WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4954
4955Lazy evaluation is traditionally simulated in Scheme using @code{delay}
4956and @code{force}. However, these primitives are not powerful enough to
4957express a large class of lazy algorithms that are iterative. Indeed, it
4958is folklore in the Scheme community that typical iterative lazy
4959algorithms written using delay and force will often require unbounded
4960memory.
4961
4962This SRFI provides set of three operations: @{@code{lazy}, @code{delay},
4963@code{force}@}, which allow the programmer to succinctly express lazy
4964algorithms while retaining bounded space behavior in cases that are
4965properly tail-recursive. A general recipe for using these primitives is
4966provided. An additional procedure @code{eager} is provided for the
4967construction of eager promises in cases where efficiency is a concern.
4968
4969Although this SRFI redefines @code{delay} and @code{force}, the
4970extension is conservative in the sense that the semantics of the subset
4971@{@code{delay}, @code{force}@} in isolation (i.e., as long as the
4972program does not use @code{lazy}) agrees with that in R5RS. In other
4973words, no program that uses the R5RS definitions of delay and force will
4974break if those definition are replaced by the SRFI-45 definitions of
4975delay and force.
4976
d291d799
MW
4977Guile also adds @code{promise?} to the list of exports, which is not
4978part of the official SRFI-45.
4979
4980@deffn {Scheme Procedure} promise? obj
4981Return true if @var{obj} is an SRFI-45 promise, otherwise return false.
4982@end deffn
4983
f16a2007 4984@deffn {Scheme Syntax} delay expression
65ad02b9
MW
4985Takes an expression of arbitrary type @var{a} and returns a promise of
4986type @code{(Promise @var{a})} which at some point in the future may be
4987asked (by the @code{force} procedure) to evaluate the expression and
4988deliver the resulting value.
f16a2007
AR
4989@end deffn
4990
4991@deffn {Scheme Syntax} lazy expression
65ad02b9
MW
4992Takes an expression of type @code{(Promise @var{a})} and returns a
4993promise of type @code{(Promise @var{a})} which at some point in the
4994future may be asked (by the @code{force} procedure) to evaluate the
4995expression and deliver the resulting promise.
f16a2007
AR
4996@end deffn
4997
65ad02b9
MW
4998@deffn {Scheme Procedure} force expression
4999Takes an argument of type @code{(Promise @var{a})} and returns a value
5000of type @var{a} as follows: If a value of type @var{a} has been computed
5001for the promise, this value is returned. Otherwise, the promise is
5002first evaluated, then overwritten by the obtained promise or value, and
5003then force is again applied (iteratively) to the promise.
f16a2007
AR
5004@end deffn
5005
65ad02b9
MW
5006@deffn {Scheme Procedure} eager expression
5007Takes an argument of type @var{a} and returns a value of type
5008@code{(Promise @var{a})}. As opposed to @code{delay}, the argument is
5009evaluated eagerly. Semantically, writing @code{(eager expression)} is
5010equivalent to writing
f16a2007
AR
5011
5012@lisp
5013(let ((value expression)) (delay value)).
5014@end lisp
5015
5016However, the former is more efficient since it does not require
65ad02b9
MW
5017unnecessary creation and evaluation of thunks. We also have the
5018equivalence
f16a2007
AR
5019
5020@lisp
5021(delay expression) = (lazy (eager expression))
5022@end lisp
5023@end deffn
5024
5025The following reduction rules may be helpful for reasoning about these
5026primitives. However, they do not express the memoization and memory
5027usage semantics specified above:
5028
5029@lisp
5030(force (delay expression)) -> expression
5031(force (lazy expression)) -> (force expression)
65ad02b9 5032(force (eager value)) -> value
f16a2007
AR
5033@end lisp
5034
5035@subsubheading Correct usage
5036
5037We now provide a general recipe for using the primitives @{@code{lazy},
5038@code{delay}, @code{force}@} to express lazy algorithms in Scheme. The
5039transformation is best described by way of an example: Consider the
5040stream-filter algorithm, expressed in a hypothetical lazy language as
5041
5042@lisp
5043(define (stream-filter p? s)
5044 (if (null? s) '()
5045 (let ((h (car s))
5046 (t (cdr s)))
5047 (if (p? h)
5048 (cons h (stream-filter p? t))
5049 (stream-filter p? t)))))
5050@end lisp
5051
ecb87335 5052This algorithm can be expressed as follows in Scheme:
f16a2007
AR
5053
5054@lisp
5055(define (stream-filter p? s)
5056 (lazy
5057 (if (null? (force s)) (delay '())
5058 (let ((h (car (force s)))
5059 (t (cdr (force s))))
5060 (if (p? h)
5061 (delay (cons h (stream-filter p? t)))
5062 (stream-filter p? t))))))
5063@end lisp
5064
5065In other words, we
5066
5067@itemize @bullet
5068@item
5069wrap all constructors (e.g., @code{'()}, @code{cons}) with @code{delay},
5070@item
5071apply @code{force} to arguments of deconstructors (e.g., @code{car},
5072@code{cdr} and @code{null?}),
5073@item
5074wrap procedure bodies with @code{(lazy ...)}.
5075@end itemize
5076
2d6a3144
MW
5077@node SRFI-46
5078@subsection SRFI-46 Basic syntax-rules Extensions
5079@cindex SRFI-46
5080
5081Guile's core @code{syntax-rules} supports the extensions specified by
5082SRFI-46/R7RS. Tail patterns have been supported since at least Guile
50832.0, and custom ellipsis identifiers have been supported since Guile
50842.0.10. @xref{Syntax Rules}.
5085
4ea9becb
KR
5086@node SRFI-55
5087@subsection SRFI-55 - Requiring Features
5088@cindex SRFI-55
5089
5090SRFI-55 provides @code{require-extension} which is a portable
5091mechanism to load selected SRFI modules. This is implemented in the
5092Guile core, there's no module needed to get SRFI-55 itself.
5093
df0a1002
BT
5094@deffn {library syntax} require-extension clause1 clause2 @dots{}
5095Require the features of @var{clause1} @var{clause2} @dots{} , throwing
5096an error if any are unavailable.
4ea9becb
KR
5097
5098A @var{clause} is of the form @code{(@var{identifier} arg...)}. The
5099only @var{identifier} currently supported is @code{srfi} and the
5100arguments are SRFI numbers. For example to get SRFI-1 and SRFI-6,
5101
5102@example
5103(require-extension (srfi 1 6))
5104@end example
5105
5106@code{require-extension} can only be used at the top-level.
5107
5108A Guile-specific program can simply @code{use-modules} to load SRFIs
5109not already in the core, @code{require-extension} is for programs
5110designed to be portable to other Scheme implementations.
5111@end deffn
5112
5113
8503beb8
KR
5114@node SRFI-60
5115@subsection SRFI-60 - Integers as Bits
5116@cindex SRFI-60
5117@cindex integers as bits
5118@cindex bitwise logical
5119
5120This SRFI provides various functions for treating integers as bits and
5121for bitwise manipulations. These functions can be obtained with,
5122
5123@example
5124(use-modules (srfi srfi-60))
5125@end example
5126
5127Integers are treated as infinite precision twos-complement, the same
5128as in the core logical functions (@pxref{Bitwise Operations}). And
5129likewise bit indexes start from 0 for the least significant bit. The
5130following functions in this SRFI are already in the Guile core,
5131
5132@quotation
5133@code{logand},
5134@code{logior},
5135@code{logxor},
5136@code{lognot},
5137@code{logtest},
5138@code{logcount},
5139@code{integer-length},
5140@code{logbit?},
5141@code{ash}
5142@end quotation
5143
5144@sp 1
5145@defun bitwise-and n1 ...
5146@defunx bitwise-ior n1 ...
5147@defunx bitwise-xor n1 ...
5148@defunx bitwise-not n
5149@defunx any-bits-set? j k
5150@defunx bit-set? index n
5151@defunx arithmetic-shift n count
5152@defunx bit-field n start end
5153@defunx bit-count n
5154Aliases for @code{logand}, @code{logior}, @code{logxor},
5155@code{lognot}, @code{logtest}, @code{logbit?}, @code{ash},
5156@code{bit-extract} and @code{logcount} respectively.
5157
5158Note that the name @code{bit-count} conflicts with @code{bit-count} in
5159the core (@pxref{Bit Vectors}).
5160@end defun
5161
5162@defun bitwise-if mask n1 n0
5163@defunx bitwise-merge mask n1 n0
5164Return an integer with bits selected from @var{n1} and @var{n0}
5165according to @var{mask}. Those bits where @var{mask} has 1s are taken
5166from @var{n1}, and those where @var{mask} has 0s are taken from
5167@var{n0}.
5168
5169@example
5170(bitwise-if 3 #b0101 #b1010) @result{} 9
5171@end example
5172@end defun
5173
5174@defun log2-binary-factors n
5175@defunx first-set-bit n
5176Return a count of how many factors of 2 are present in @var{n}. This
5177is also the bit index of the lowest 1 bit in @var{n}. If @var{n} is
51780, the return is @math{-1}.
5179
5180@example
5181(log2-binary-factors 6) @result{} 1
5182(log2-binary-factors -8) @result{} 3
5183@end example
5184@end defun
5185
5186@defun copy-bit index n newbit
5187Return @var{n} with the bit at @var{index} set according to
5188@var{newbit}. @var{newbit} should be @code{#t} to set the bit to 1,
5189or @code{#f} to set it to 0. Bits other than at @var{index} are
5190unchanged in the return.
5191
5192@example
5193(copy-bit 1 #b0101 #t) @result{} 7
5194@end example
5195@end defun
5196
5197@defun copy-bit-field n newbits start end
5198Return @var{n} with the bits from @var{start} (inclusive) to @var{end}
5199(exclusive) changed to the value @var{newbits}.
5200
5201The least significant bit in @var{newbits} goes to @var{start}, the
5202next to @math{@var{start}+1}, etc. Anything in @var{newbits} past the
5203@var{end} given is ignored.
5204
5205@example
5206(copy-bit-field #b10000 #b11 1 3) @result{} #b10110
5207@end example
5208@end defun
5209
5210@defun rotate-bit-field n count start end
5211Return @var{n} with the bit field from @var{start} (inclusive) to
5212@var{end} (exclusive) rotated upwards by @var{count} bits.
5213
5214@var{count} can be positive or negative, and it can be more than the
5215field width (it'll be reduced modulo the width).
5216
5217@example
5218(rotate-bit-field #b0110 2 1 4) @result{} #b1010
5219@end example
5220@end defun
5221
5222@defun reverse-bit-field n start end
5223Return @var{n} with the bits from @var{start} (inclusive) to @var{end}
5224(exclusive) reversed.
5225
5226@example
5227(reverse-bit-field #b101001 2 4) @result{} #b100101
5228@end example
5229@end defun
5230
5231@defun integer->list n [len]
5232Return bits from @var{n} in the form of a list of @code{#t} for 1 and
5233@code{#f} for 0. The least significant @var{len} bits are returned,
5234and the first list element is the most significant of those bits. If
5235@var{len} is not given, the default is @code{(integer-length @var{n})}
5236(@pxref{Bitwise Operations}).
5237
5238@example
5239(integer->list 6) @result{} (#t #t #f)
5240(integer->list 1 4) @result{} (#f #f #f #t)
5241@end example
5242@end defun
5243
5244@defun list->integer lst
5245@defunx booleans->integer bool@dots{}
5246Return an integer formed bitwise from the given @var{lst} list of
5247booleans, or for @code{booleans->integer} from the @var{bool}
5248arguments.
5249
5250Each boolean is @code{#t} for a 1 and @code{#f} for a 0. The first
5251element becomes the most significant bit in the return.
5252
5253@example
5254(list->integer '(#t #f #t #f)) @result{} 10
5255@end example
5256@end defun
5257
5258
43ed3b69
MV
5259@node SRFI-61
5260@subsection SRFI-61 - A more general @code{cond} clause
5261
5262This SRFI extends RnRS @code{cond} to support test expressions that
5263return multiple values, as well as arbitrary definitions of test
5264success. SRFI 61 is implemented in the Guile core; there's no module
5265needed to get SRFI-61 itself. Extended @code{cond} is documented in
9accf3d9 5266@ref{Conditionals,, Simple Conditional Evaluation}.
43ed3b69 5267
b306fae0
MW
5268@node SRFI-62
5269@subsection SRFI-62 - S-expression comments.
5270@cindex SRFI-62
5271
5272Starting from version 2.0, Guile's @code{read} supports SRFI-62/R7RS
5273S-expression comments by default.
5274
34e89877
MW
5275@node SRFI-64
5276@subsection SRFI-64 - A Scheme API for test suites.
5277@cindex SRFI-64
5278
5279See @uref{http://srfi.schemers.org/srfi-64/srfi-64.html, the
5280specification of SRFI-64}.
5281
8175a07e
AR
5282@node SRFI-67
5283@subsection SRFI-67 - Compare procedures
5284@cindex SRFI-67
5285
5286See @uref{http://srfi.schemers.org/srfi-67/srfi-67.html, the
5287specification of SRFI-67}.
43ed3b69 5288
1317062f
LC
5289@node SRFI-69
5290@subsection SRFI-69 - Basic hash tables
5291@cindex SRFI-69
5292
5293This is a portable wrapper around Guile's built-in hash table and weak
5294table support. @xref{Hash Tables}, for information on that built-in
5295support. Above that, this hash-table interface provides association
5296of equality and hash functions with tables at creation time, so
5297variants of each function are not required, as well as a procedure
5298that takes care of most uses for Guile hash table handles, which this
5299SRFI does not provide as such.
5300
5301Access it with:
5302
5303@lisp
5304(use-modules (srfi srfi-69))
5305@end lisp
5306
5307@menu
5308* SRFI-69 Creating hash tables::
5309* SRFI-69 Accessing table items::
5310* SRFI-69 Table properties::
5311* SRFI-69 Hash table algorithms::
5312@end menu
5313
5314@node SRFI-69 Creating hash tables
5315@subsubsection Creating hash tables
5316
5317@deffn {Scheme Procedure} make-hash-table [equal-proc hash-proc #:weak weakness start-size]
5318Create and answer a new hash table with @var{equal-proc} as the
5319equality function and @var{hash-proc} as the hashing function.
5320
5321By default, @var{equal-proc} is @code{equal?}. It can be any
5322two-argument procedure, and should answer whether two keys are the
5323same for this table's purposes.
5324
5325My default @var{hash-proc} assumes that @code{equal-proc} is no
5326coarser than @code{equal?} unless it is literally @code{string-ci=?}.
5327If provided, @var{hash-proc} should be a two-argument procedure that
5328takes a key and the current table size, and answers a reasonably good
5329hash integer between 0 (inclusive) and the size (exclusive).
5330
5331@var{weakness} should be @code{#f} or a symbol indicating how ``weak''
5332the hash table is:
5333
5334@table @code
5335@item #f
5336An ordinary non-weak hash table. This is the default.
5337
5338@item key
5339When the key has no more non-weak references at GC, remove that entry.
5340
5341@item value
5342When the value has no more non-weak references at GC, remove that
5343entry.
5344
5345@item key-or-value
5346When either has no more non-weak references at GC, remove the
5347association.
5348@end table
5349
5350As a legacy of the time when Guile couldn't grow hash tables,
5351@var{start-size} is an optional integer argument that specifies the
dfe8c13b
LC
5352approximate starting size for the hash table, which will be rounded to
5353an algorithmically-sounder number.
1317062f
LC
5354@end deffn
5355
dfe8c13b 5356By @dfn{coarser} than @code{equal?}, we mean that for all @var{x} and
1317062f
LC
5357@var{y} values where @code{(@var{equal-proc} @var{x} @var{y})},
5358@code{(equal? @var{x} @var{y})} as well. If that does not hold for
5359your @var{equal-proc}, you must provide a @var{hash-proc}.
5360
5361In the case of weak tables, remember that @dfn{references} above
5362always refers to @code{eq?}-wise references. Just because you have a
5363reference to some string @code{"foo"} doesn't mean that an association
5364with key @code{"foo"} in a weak-key table @emph{won't} be collected;
5365it only counts as a reference if the two @code{"foo"}s are @code{eq?},
5366regardless of @var{equal-proc}. As such, it is usually only sensible
5367to use @code{eq?} and @code{hashq} as the equivalence and hash
5368functions for a weak table. @xref{Weak References}, for more
5369information on Guile's built-in weak table support.
5370
5371@deffn {Scheme Procedure} alist->hash-table alist [equal-proc hash-proc #:weak weakness start-size]
5372As with @code{make-hash-table}, but initialize it with the
5373associations in @var{alist}. Where keys are repeated in @var{alist},
5374the leftmost association takes precedence.
5375@end deffn
5376
5377@node SRFI-69 Accessing table items
5378@subsubsection Accessing table items
5379
5380@deffn {Scheme Procedure} hash-table-ref table key [default-thunk]
5381@deffnx {Scheme Procedure} hash-table-ref/default table key default
5382Answer the value associated with @var{key} in @var{table}. If
5383@var{key} is not present, answer the result of invoking the thunk
5384@var{default-thunk}, which signals an error instead by default.
5385
5386@code{hash-table-ref/default} is a variant that requires a third
5387argument, @var{default}, and answers @var{default} itself instead of
5388invoking it.
5389@end deffn
5390
5391@deffn {Scheme Procedure} hash-table-set! table key new-value
5392Set @var{key} to @var{new-value} in @var{table}.
5393@end deffn
5394
5395@deffn {Scheme Procedure} hash-table-delete! table key
5396Remove the association of @var{key} in @var{table}, if present. If
5397absent, do nothing.
5398@end deffn
5399
5400@deffn {Scheme Procedure} hash-table-exists? table key
5401Answer whether @var{key} has an association in @var{table}.
5402@end deffn
5403
5404@deffn {Scheme Procedure} hash-table-update! table key modifier [default-thunk]
5405@deffnx {Scheme Procedure} hash-table-update!/default table key modifier default
5406Replace @var{key}'s associated value in @var{table} by invoking
5407@var{modifier} with one argument, the old value.
5408
5409If @var{key} is not present, and @var{default-thunk} is provided,
5410invoke it with no arguments to get the ``old value'' to be passed to
5411@var{modifier} as above. If @var{default-thunk} is not provided in
5412such a case, signal an error.
5413
5414@code{hash-table-update!/default} is a variant that requires the
5415fourth argument, which is used directly as the ``old value'' rather
5416than as a thunk to be invoked to retrieve the ``old value''.
5417@end deffn
5418
5419@node SRFI-69 Table properties
5420@subsubsection Table properties
5421
5422@deffn {Scheme Procedure} hash-table-size table
5423Answer the number of associations in @var{table}. This is guaranteed
5424to run in constant time for non-weak tables.
5425@end deffn
5426
5427@deffn {Scheme Procedure} hash-table-keys table
5428Answer an unordered list of the keys in @var{table}.
5429@end deffn
5430
5431@deffn {Scheme Procedure} hash-table-values table
5432Answer an unordered list of the values in @var{table}.
5433@end deffn
5434
5435@deffn {Scheme Procedure} hash-table-walk table proc
5436Invoke @var{proc} once for each association in @var{table}, passing
5437the key and value as arguments.
5438@end deffn
5439
5440@deffn {Scheme Procedure} hash-table-fold table proc init
5441Invoke @code{(@var{proc} @var{key} @var{value} @var{previous})} for
5442each @var{key} and @var{value} in @var{table}, where @var{previous} is
5443the result of the previous invocation, using @var{init} as the first
5444@var{previous} value. Answer the final @var{proc} result.
5445@end deffn
5446
5447@deffn {Scheme Procedure} hash-table->alist table
5448Answer an alist where each association in @var{table} is an
5449association in the result.
5450@end deffn
5451
5452@node SRFI-69 Hash table algorithms
5453@subsubsection Hash table algorithms
5454
5455Each hash table carries an @dfn{equivalence function} and a @dfn{hash
5456function}, used to implement key lookups. Beginning users should
5457follow the rules for consistency of the default @var{hash-proc}
5458specified above. Advanced users can use these to implement their own
5459equivalence and hash functions for specialized lookup semantics.
5460
5461@deffn {Scheme Procedure} hash-table-equivalence-function hash-table
5462@deffnx {Scheme Procedure} hash-table-hash-function hash-table
5463Answer the equivalence and hash function of @var{hash-table}, respectively.
5464@end deffn
5465
5466@deffn {Scheme Procedure} hash obj [size]
5467@deffnx {Scheme Procedure} string-hash obj [size]
5468@deffnx {Scheme Procedure} string-ci-hash obj [size]
5469@deffnx {Scheme Procedure} hash-by-identity obj [size]
5470Answer a hash value appropriate for equality predicate @code{equal?},
5471@code{string=?}, @code{string-ci=?}, and @code{eq?}, respectively.
5472@end deffn
5473
5474@code{hash} is a backwards-compatible replacement for Guile's built-in
5475@code{hash}.
5476
da81e75d
MW
5477@node SRFI-87
5478@subsection SRFI-87 => in case clauses
5479@cindex SRFI-87
5480
5481Starting from version 2.0.6, Guile's core @code{case} syntax supports
5482@code{=>} in clauses, as specified by SRFI-87/R7RS.
5483@xref{Conditionals}.
5484
189681f5
LC
5485@node SRFI-88
5486@subsection SRFI-88 Keyword Objects
5487@cindex SRFI-88
5488@cindex keyword objects
5489
e36280cb 5490@uref{http://srfi.schemers.org/srfi-88/srfi-88.html, SRFI-88} provides
189681f5
LC
5491@dfn{keyword objects}, which are equivalent to Guile's keywords
5492(@pxref{Keywords}). SRFI-88 keywords can be entered using the
5493@dfn{postfix keyword syntax}, which consists of an identifier followed
1518f649 5494by @code{:} (@pxref{Scheme Read, @code{postfix} keyword syntax}).
189681f5
LC
5495SRFI-88 can be made available with:
5496
5497@example
5498(use-modules (srfi srfi-88))
5499@end example
5500
5501Doing so installs the right reader option for keyword syntax, using
5502@code{(read-set! keywords 'postfix)}. It also provides the procedures
5503described below.
5504
5505@deffn {Scheme Procedure} keyword? obj
5506Return @code{#t} if @var{obj} is a keyword. This is the same procedure
5507as the same-named built-in procedure (@pxref{Keyword Procedures,
5508@code{keyword?}}).
5509
5510@example
5511(keyword? foo:) @result{} #t
5512(keyword? 'foo:) @result{} #t
5513(keyword? "foo") @result{} #f
5514@end example
5515@end deffn
5516
5517@deffn {Scheme Procedure} keyword->string kw
5518Return the name of @var{kw} as a string, i.e., without the trailing
5519colon. The returned string may not be modified, e.g., with
5520@code{string-set!}.
5521
5522@example
5523(keyword->string foo:) @result{} "foo"
5524@end example
5525@end deffn
5526
5527@deffn {Scheme Procedure} string->keyword str
5528Return the keyword object whose name is @var{str}.
5529
5530@example
5531(keyword->string (string->keyword "a b c")) @result{} "a b c"
5532@end example
5533@end deffn
5534
922d417b
JG
5535@node SRFI-98
5536@subsection SRFI-98 Accessing environment variables.
5537@cindex SRFI-98
5538@cindex environment variables
5539
5540This is a portable wrapper around Guile's built-in support for
5541interacting with the current environment, @xref{Runtime Environment}.
5542
5543@deffn {Scheme Procedure} get-environment-variable name
5544Returns a string containing the value of the environment variable
5545given by the string @code{name}, or @code{#f} if the named
5546environment variable is not found. This is equivalent to
5547@code{(getenv name)}.
5548@end deffn
5549
5550@deffn {Scheme Procedure} get-environment-variables
5551Returns the names and values of all the environment variables as an
5552association list in which both the keys and the values are strings.
5553@end deffn
1317062f 5554
bf9eb54a
MW
5555@node SRFI-105
5556@subsection SRFI-105 Curly-infix expressions.
5557@cindex SRFI-105
5558@cindex curly-infix
5559@cindex curly-infix-and-bracket-lists
5560
5561Guile's built-in reader includes support for SRFI-105 curly-infix
5562expressions. See @uref{http://srfi.schemers.org/srfi-105/srfi-105.html,
5563the specification of SRFI-105}. Some examples:
5564
5565@example
5566@{n <= 5@} @result{} (<= n 5)
5567@{a + b + c@} @result{} (+ a b c)
5568@{a * @{b + c@}@} @result{} (* a (+ b c))
5569@{(- a) / b@} @result{} (/ (- a) b)
5570@{-(a) / b@} @result{} (/ (- a) b) as well
5571@{(f a b) + (g h)@} @result{} (+ (f a b) (g h))
5572@{f(a b) + g(h)@} @result{} (+ (f a b) (g h)) as well
5573@{f[a b] + g(h)@} @result{} (+ ($bracket-apply$ f a b) (g h))
5574'@{a + f(b) + x@} @result{} '(+ a (f b) x)
5575@{length(x) >= 6@} @result{} (>= (length x) 6)
5576@{n-1 + n-2@} @result{} (+ n-1 n-2)
5577@{n * factorial@{n - 1@}@} @result{} (* n (factorial (- n 1)))
5578@{@{a > 0@} and @{b >= 1@}@} @result{} (and (> a 0) (>= b 1))
5579@{f@{n - 1@}(x)@} @result{} ((f (- n 1)) x)
5580@{a . z@} @result{} ($nfx$ a . z)
5581@{a + b - c@} @result{} ($nfx$ a + b - c)
5582@end example
5583
5584To enable curly-infix expressions within a file, place the reader
5585directive @code{#!curly-infix} before the first use of curly-infix
5586notation. To globally enable curly-infix expressions in Guile's reader,
5587set the @code{curly-infix} read option.
5588
5589Guile also implements the following non-standard extension to SRFI-105:
5590if @code{curly-infix} is enabled and there is no other meaning assigned
5591to square brackets (i.e. the @code{square-brackets} read option is
5592turned off), then lists within square brackets are read as normal lists
5593but with the special symbol @code{$bracket-list$} added to the front.
5594To enable this combination of read options within a file, use the reader
5595directive @code{#!curly-infix-and-bracket-lists}. For example:
5596
5597@example
5598[a b] @result{} ($bracket-list$ a b)
5599[a . b] @result{} ($bracket-list$ a . b)
5600@end example
5601
5602
5603For more information on reader options, @xref{Scheme Read}.
5604
3e2e4965
MW
5605@node SRFI-111
5606@subsection SRFI-111 Boxes.
5607@cindex SRFI-111
5608
5609@uref{http://srfi.schemers.org/srfi-111/srfi-111.html, SRFI-111}
5610provides boxes: objects with a single mutable cell.
5611
5612@deffn {Scheme Procedure} box value
5613Return a newly allocated box whose contents is initialized to
5614@var{value}.
5615@end deffn
5616
5617@deffn {Scheme Procedure} box? obj
5618Return true if @var{obj} is a box, otherwise return false.
5619@end deffn
5620
5621@deffn {Scheme Procedure} unbox box
5622Return the current contents of @var{box}.
5623@end deffn
5624
5625@deffn {Scheme Procedure} set-box! box value
5626Set the contents of @var{box} to @var{value}.
5627@end deffn
5628
12991fed 5629@c srfi-modules.texi ends here
193239f1
KR
5630
5631@c Local Variables:
5632@c TeX-master: "guile.texi"
5633@c End: