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