*** empty log message ***
[bpt/guile.git] / doc / scheme-data.texi
CommitLineData
38a93523
NJ
1@page
2@node Data Types
3@chapter Data Types for Generic Use
4
5This chapter describes all the data types that Guile provides for
6``generic use''.
7
8One of the great strengths of Scheme is that there is no straightforward
9distinction between ``data'' and ``functionality''. For example,
10Guile's support for dynamic linking could be described
11
239d2912 12@itemize @bullet
38a93523
NJ
13@item
14either in a ``data-centric'' way, as the behaviour and properties of the
15``dynamically linked object'' data type, and the operations that may be
16applied to instances of this type
17
18@item
19or in a ``functionality-centric'' way, as the set of procedures that
20constitute Guile's support for dynamic linking, in the context of the
21module system.
22@end itemize
23
24The contents of this chapter are, therefore, a matter of judgement. By
25``generic use'', we mean to select those data types whose typical use as
26@emph{data} in a wide variety of programming contexts is more important
27than their use in the implementation of a particular piece of
28@emph{functionality}.
29
30@ifinfo
31The following menu
32@end ifinfo
33@iftex
34The table of contents for this chapter
35@end iftex
36@ifhtml
37The following table of contents
38@end ifhtml
39shows the data types that are documented in this chapter. The final
40section of this chapter lists all the core Guile data types that are not
41documented here, and provides links to the ``functionality-centric''
42sections of this manual that cover them.
43
44@menu
45* Booleans:: True/false values.
46* Numbers:: Numerical data types.
47* Characters:: New character names.
48* Strings:: Special things about strings.
49* Regular Expressions:: Pattern matching and substitution.
50* Symbols and Variables:: Manipulating the Scheme symbol table.
51* Keywords:: Self-quoting, customizable display keywords.
52* Pairs:: Scheme's basic building block.
53* Lists:: Special list functions supported by Guile.
b576faf1
MG
54* Records::
55* Structures::
f4f2b29a
MG
56* Arrays:: Arrays of values.
57* Association Lists and Hash Tables:: Dictionary data types.
58* Vectors:: One-dimensional arrays of Scheme objects.
38a93523
NJ
59* Hooks:: User-customizable event lists.
60* Other Data Types:: Data types that are documented elsewhere.
61@end menu
62
63
64@node Booleans
65@section Booleans
66
67The two boolean values are @code{#t} for true and @code{#f} for false.
68
69Boolean values are returned by predicate procedures, such as the general
70equality predicates @code{eq?}, @code{eqv?} and @code{equal?}
71(@pxref{Equality}) and numerical and string comparison operators like
72@code{string=?} (REFFIXME) and @code{<=} (REFFIXME).
73
74@lisp
75(<= 3 8)
76@result{}
77#t
78
79(<= 3 -3)
80@result{}
81#f
82
83(equal? "house" "houses")
84@result{}
85#f
86
87(eq? #f #f)
88@result{}
89#t
90@end lisp
91
92In test condition contexts like @code{if} (REFFIXME) and @code{cond}
93(REFFIXME), where a group of subexpressions will be evaluated only if a
94@var{condition} expression evaluates to ``true'', ``true'' means any
95value at all except @code{#f}.
96
97@lisp
98(if #t "yes" "no")
99@result{}
100"yes"
101
102(if 0 "yes" "no")
103@result{}
104"yes"
105
106(if #f "yes" "no")
107@result{}
108"no"
109@end lisp
110
111A result of this asymmetry is that typical Scheme source code more often
112uses @code{#f} explicitly than @code{#t}: @code{#f} is necessary to
113represent an @code{if} or @code{cond} false value, whereas @code{#t} is
114not necessary to represent an @code{if} or @code{cond} true value.
115
116It is important to note that @code{#f} is @strong{not} equivalent to any
117other Scheme value. In particular, @code{#f} is not the same as the
118number 0 (like in C and C++), and not the same as the ``empty list''
119(like in some Lisp dialects).
120
121The @code{not} procedure returns the boolean inverse of its argument:
122
5c4b24e1 123@rnindex not
38a93523
NJ
124@deffn primitive not x
125Return @code{#t} iff @var{x} is @code{#f}, else return @code{#f}.
126@end deffn
127
128The @code{boolean?} procedure is a predicate that returns @code{#t} if
129its argument is one of the boolean values, otherwise @code{#f}.
130
5c4b24e1 131@rnindex boolean?
38a93523
NJ
132@deffn primitive boolean? obj
133Return @code{#t} iff @var{obj} is either @code{#t} or @code{#f}.
134@end deffn
135
136
137@node Numbers
138@section Numerical data types
139
140Guile supports a rich ``tower'' of numerical types --- integer,
141rational, real and complex --- and provides an extensive set of
142mathematical and scientific functions for operating on numerical
143data. This section of the manual documents those types and functions.
144
145You may also find it illuminating to read R5RS's presentation of numbers
146in Scheme, which is particularly clear and accessible: see
147@xref{Numbers,,,r5rs}.
148
149@menu
150* Numerical Tower:: Scheme's numerical "tower".
151* Integers:: Whole numbers.
152* Reals and Rationals:: Real and rational numbers.
153* Complex Numbers:: Complex numbers.
154* Exactness:: Exactness and inexactness.
b576faf1 155* Number Syntax:: Read syntax for numerical data.
38a93523
NJ
156* Integer Operations:: Operations on integer values.
157* Comparison:: Comparison predicates.
158* Conversion:: Converting numbers to and from strings.
159* Complex:: Complex number operations.
160* Arithmetic:: Arithmetic functions.
161* Scientific:: Scientific functions.
162* Primitive Numerics:: Primitive numeric functions.
163* Bitwise Operations:: Logical AND, OR, NOT, and so on.
164* Random:: Random number generation.
165@end menu
166
167
168@node Numerical Tower
169@subsection Scheme's Numerical ``Tower''
5c4b24e1 170@rnindex number?
38a93523
NJ
171
172Scheme's numerical ``tower'' consists of the following categories of
173numbers:
174
239d2912 175@itemize @bullet
38a93523
NJ
176@item
177integers (whole numbers)
178
179@item
180rationals (the set of numbers that can be expressed as P/Q where P and Q
181are integers)
182
183@item
184real numbers (the set of numbers that describes all possible positions
185along a one dimensional line)
186
187@item
188complex numbers (the set of numbers that describes all possible
189positions in a two dimensional space)
190@end itemize
191
192It is called a tower because each category ``sits on'' the one that
193follows it, in the sense that every integer is also a rational, every
194rational is also real, and every real number is also a complex number
195(but with zero imaginary part).
196
197Of these, Guile implements integers, reals and complex numbers as
198distinct types. Rationals are implemented as regards the read syntax
199for rational numbers that is specified by R5RS, but are immediately
200converted by Guile to the corresponding real number.
201
202The @code{number?} predicate may be applied to any Scheme value to
203discover whether the value is any of the supported numerical types.
204
38a93523
NJ
205@deffn primitive number? obj
206Return @code{#t} if @var{obj} is any kind of number, @code{#f} else.
207@end deffn
208
209For example:
210
211@lisp
212(number? 3)
213@result{}
214#t
215
216(number? "hello there!")
217@result{}
218#f
219
220(define pi 3.141592654)
221(number? pi)
222@result{}
223#t
224@end lisp
225
226The next few subsections document each of Guile's numerical data types
227in detail.
228
229
230@node Integers
231@subsection Integers
5c4b24e1 232@rnindex integer?
38a93523
NJ
233
234Integers are whole numbers, that is numbers with no fractional part,
235such as 2, 83 and -3789.
236
237Integers in Guile can be arbitrarily big, as shown by the following
238example.
239
240@lisp
241(define (factorial n)
242 (let loop ((n n) (product 1))
243 (if (= n 0)
244 product
245 (loop (- n 1) (* product n)))))
246
247(factorial 3)
248@result{}
2496
250
251(factorial 20)
252@result{}
2532432902008176640000
254
255(- (factorial 45))
256@result{}
257-119622220865480194561963161495657715064383733760000000000
258@end lisp
259
260Readers whose background is in programming languages where integers are
261limited by the need to fit into just 4 or 8 bytes of memory may find
262this surprising, or suspect that Guile's representation of integers is
263inefficient. In fact, Guile achieves a near optimal balance of
264convenience and efficiency by using the host computer's native
265representation of integers where possible, and a more general
266representation where the required number does not fit in the native
267form. Conversion between these two representations is automatic and
268completely invisible to the Scheme level programmer.
269
270@c REFFIXME Maybe point here to discussion of handling immediates/bignums
271@c on the C level, where the conversion is not so automatic - NJ
272
780ee65e
NJ
273@deffn primitive integer? x
274Return @code{#t} if @var{x} is an integer number, @code{#f} else.
38a93523
NJ
275
276@lisp
277(integer? 487)
278@result{}
279#t
280
281(integer? -3.4)
282@result{}
283#f
284@end lisp
285@end deffn
286
287
288@node Reals and Rationals
289@subsection Real and Rational Numbers
5c4b24e1
MG
290@rnindex real?
291@rnindex rational?
38a93523
NJ
292
293Mathematically, the real numbers are the set of numbers that describe
294all possible points along a continuous, infinite, one-dimensional line.
295The rational numbers are the set of all numbers that can be written as
296fractions P/Q, where P and Q are integers. All rational numbers are
297also real, but there are real numbers that are not rational, for example
298the square root of 2, and pi.
299
300Guile represents both real and rational numbers approximately using a
301floating point encoding with limited precision. Even though the actual
302encoding is in binary, it may be helpful to think of it as a decimal
303number with a limited number of significant figures and a decimal point
304somewhere, since this corresponds to the standard notation for non-whole
305numbers. For example:
306
307@lisp
3080.34
309-0.00000142857931198
310-5648394822220000000000.0
3114.0
312@end lisp
313
314The limited precision of Guile's encoding means that any ``real'' number
315in Guile can be written in a rational form, by multiplying and then dividing
316by sufficient powers of 10 (or in fact, 2). For example,
317@code{-0.00000142857931198} is the same as @code{142857931198} divided by
318@code{100000000000000000}. In Guile's current incarnation, therefore,
319the @code{rational?} and @code{real?} predicates are equivalent.
320
321Another aspect of this equivalence is that Guile currently does not
322preserve the exactness that is possible with rational arithmetic.
323If such exactness is needed, it is of course possible to implement
324exact rational arithmetic at the Scheme level using Guile's arbitrary
325size integers.
326
327A planned future revision of Guile's numerical tower will make it
328possible to implement exact representations and arithmetic for both
329rational numbers and real irrational numbers such as square roots,
330and in such a way that the new kinds of number integrate seamlessly
331with those that are already implemented.
332
38a93523
NJ
333@deffn primitive real? obj
334Return @code{#t} if @var{obj} is a real number, @code{#f} else.
335Note that the sets of integer and rational values form subsets
336of the set of real numbers, so the predicate will also be fulfilled
337if @var{obj} is an integer number or a rational number.
338@end deffn
339
780ee65e
NJ
340@deffn primitive rational? x
341Return @code{#t} if @var{x} is a rational number, @code{#f}
342else. Note that the set of integer values forms a subset of
343the set of rational numbers, i. e. the predicate will also be
344fulfilled if @var{x} is an integer number. Real numbers
345will also satisfy this predicate, because of their limited
346precision.
38a93523
NJ
347@end deffn
348
349
350@node Complex Numbers
351@subsection Complex Numbers
5c4b24e1 352@rnindex complex?
38a93523
NJ
353
354Complex numbers are the set of numbers that describe all possible points
355in a two-dimensional space. The two coordinates of a particular point
356in this space are known as the @dfn{real} and @dfn{imaginary} parts of
357the complex number that describes that point.
358
359In Guile, complex numbers are written in rectangular form as the sum of
360their real and imaginary parts, using the symbol @code{i} to indicate
361the imaginary part.
362
363@lisp
3643+4i
365@result{}
3663.0+4.0i
367
368(* 3-8i 2.3+0.3i)
369@result{}
3709.3-17.5i
371@end lisp
372
373Guile represents a complex number as a pair of numbers both of which are
374real, so the real and imaginary parts of a complex number have the same
375properties of inexactness and limited precision as single real numbers.
376
780ee65e
NJ
377@deffn primitive complex? x
378Return @code{#t} if @var{x} is a complex number, @code{#f}
379else. Note that the sets of real, rational and integer
380values form subsets of the set of complex numbers, i. e. the
381predicate will also be fulfilled if @var{x} is a real,
382rational or integer number.
38a93523
NJ
383@end deffn
384
385
386@node Exactness
387@subsection Exact and Inexact Numbers
5c4b24e1
MG
388@rnindex exact?
389@rnindex inexact?
390@rnindex exact->inexact
391@rnindex inexact->exact
38a93523
NJ
392
393R5RS requires that a calculation involving inexact numbers always
394produces an inexact result. To meet this requirement, Guile
395distinguishes between an exact integer value such as @code{5} and the
396corresponding inexact real value which, to the limited precision
397available, has no fractional part, and is printed as @code{5.0}. Guile
398will only convert the latter value to the former when forced to do so by
399an invocation of the @code{inexact->exact} procedure.
400
38a93523 401@deffn primitive exact? x
780ee65e
NJ
402Return @code{#t} if @var{x} is an exact number, @code{#f}
403otherwise.
38a93523
NJ
404@end deffn
405
38a93523 406@deffn primitive inexact? x
780ee65e
NJ
407Return @code{#t} if @var{x} is an inexact number, @code{#f}
408else.
38a93523
NJ
409@end deffn
410
38a93523 411@deffn primitive inexact->exact z
ae9f3a15 412Return an exact number that is numerically closest to @var{z}.
38a93523
NJ
413@end deffn
414
415@c begin (texi-doc-string "guile" "exact->inexact")
fcaedf99
MG
416@deffn primitive exact->inexact z
417Convert the number @var{z} to its inexact representation.
38a93523
NJ
418@end deffn
419
420
421@node Number Syntax
422@subsection Read Syntax for Numerical Data
423
424The read syntax for integers is a string of digits, optionally
425preceded by a minus or plus character, a code indicating the
426base in which the integer is encoded, and a code indicating whether
427the number is exact or inexact. The supported base codes are:
428
429@itemize @bullet
430@item
431@code{#b}, @code{#B} --- the integer is written in binary (base 2)
432
433@item
434@code{#o}, @code{#O} --- the integer is written in octal (base 8)
435
436@item
437@code{#d}, @code{#D} --- the integer is written in decimal (base 10)
438
439@item
440@code{#x}, @code{#X} --- the integer is written in hexadecimal (base 16).
441@end itemize
442
443If the base code is omitted, the integer is assumed to be decimal. The
444following examples show how these base codes are used.
445
446@lisp
447-13
448@result{}
449-13
450
451#d-13
452@result{}
453-13
454
455#x-13
456@result{}
457-19
458
459#b+1101
460@result{}
46113
462
463#o377
464@result{}
465255
466@end lisp
467
468The codes for indicating exactness (which can, incidentally, be applied
469to all numerical values) are:
470
471@itemize @bullet
472@item
473@code{#e}, @code{#E} --- the number is exact
474
475@item
476@code{#i}, @code{#I} --- the number is inexact.
477@end itemize
478
479If the exactness indicator is omitted, the integer is assumed to be exact,
480since Guile's internal representation for integers is always exact.
481Real numbers have limited precision similar to the precision of the
482@code{double} type in C. A consequence of the limited precision is that
483all real numbers in Guile are also rational, since any number R with a
484limited number of decimal places, say N, can be made into an integer by
485multiplying by 10^N.
486
487
488@node Integer Operations
489@subsection Operations on Integer Values
5c4b24e1
MG
490@rnindex odd?
491@rnindex even?
492@rnindex quotient
493@rnindex remainder
494@rnindex modulo
495@rnindex gcd
496@rnindex lcm
38a93523 497
38a93523 498@deffn primitive odd? n
780ee65e
NJ
499Return @code{#t} if @var{n} is an odd number, @code{#f}
500otherwise.
38a93523
NJ
501@end deffn
502
38a93523 503@deffn primitive even? n
780ee65e
NJ
504Return @code{#t} if @var{n} is an even number, @code{#f}
505otherwise.
38a93523
NJ
506@end deffn
507
508@c begin (texi-doc-string "guile" "quotient")
509@deffn primitive quotient
fcaedf99 510Return the quotient of the numbers @var{x} and @var{y}.
38a93523
NJ
511@end deffn
512
513@c begin (texi-doc-string "guile" "remainder")
514@deffn primitive remainder
fcaedf99
MG
515Return the remainder of the numbers @var{x} and @var{y}.
516@lisp
517(remainder 13 4) @result{} 1
518(remainder -13 4) @result{} -1
519@end lisp
38a93523
NJ
520@end deffn
521
522@c begin (texi-doc-string "guile" "modulo")
523@deffn primitive modulo
fcaedf99
MG
524Return the modulo of the numbers @var{x} and @var{y}.
525@lisp
526(modulo 13 4) @result{} 1
527(modulo -13 4) @result{} 3
528@end lisp
38a93523
NJ
529@end deffn
530
531@c begin (texi-doc-string "guile" "gcd")
532@deffn primitive gcd
fcaedf99
MG
533Return the greatest common divisor of all arguments.
534If called without arguments, 0 is returned.
38a93523
NJ
535@end deffn
536
537@c begin (texi-doc-string "guile" "lcm")
538@deffn primitive lcm
fcaedf99
MG
539Return the least common multiple of the arguments.
540If called without arguments, 1 is returned.
38a93523
NJ
541@end deffn
542
543
544@node Comparison
545@subsection Comparison Predicates
5c4b24e1
MG
546@rnindex zero?
547@rnindex positive?
548@rnindex negative?
38a93523
NJ
549
550@c begin (texi-doc-string "guile" "=")
551@deffn primitive =
fcaedf99 552Return @code{#t} if all parameters are numerically equal.
38a93523
NJ
553@end deffn
554
555@c begin (texi-doc-string "guile" "<")
556@deffn primitive <
fcaedf99
MG
557Return @code{#t} if the list of parameters is monotonically
558increasing.
38a93523
NJ
559@end deffn
560
561@c begin (texi-doc-string "guile" ">")
562@deffn primitive >
fcaedf99
MG
563Return @code{#t} if the list of parameters is monotonically
564decreasing.
38a93523
NJ
565@end deffn
566
567@c begin (texi-doc-string "guile" "<=")
568@deffn primitive <=
fcaedf99
MG
569Return @code{#t} if the list of parameters is monotonically
570non-decreasing.
38a93523
NJ
571@end deffn
572
573@c begin (texi-doc-string "guile" ">=")
574@deffn primitive >=
fcaedf99
MG
575Return @code{#t} if the list of parameters is monotonically
576non-increasing.
38a93523
NJ
577@end deffn
578
579@c begin (texi-doc-string "guile" "zero?")
580@deffn primitive zero?
fcaedf99
MG
581Return @code{#t} if @var{z} is an exact or inexact number equal to
582zero.
38a93523
NJ
583@end deffn
584
585@c begin (texi-doc-string "guile" "positive?")
586@deffn primitive positive?
fcaedf99
MG
587Return @code{#t} if @var{x} is an exact or inexact number greater than
588zero.
38a93523
NJ
589@end deffn
590
591@c begin (texi-doc-string "guile" "negative?")
592@deffn primitive negative?
fcaedf99
MG
593Return @code{#t} if @var{x} is an exact or inexact number less than
594zero.
38a93523
NJ
595@end deffn
596
597
598@node Conversion
599@subsection Converting Numbers To and From Strings
5c4b24e1
MG
600@rnindex number->string
601@rnindex string->number
38a93523 602
38a93523
NJ
603@deffn primitive number->string n [radix]
604Return a string holding the external representation of the
780ee65e
NJ
605number @var{n} in the given @var{radix}. If @var{n} is
606inexact, a radix of 10 will be used.
38a93523
NJ
607@end deffn
608
38a93523 609@deffn primitive string->number string [radix]
ae9f3a15 610Return a number of the maximally precise representation
780ee65e
NJ
611expressed by the given @var{string}. @var{radix} must be an
612exact integer, either 2, 8, 10, or 16. If supplied, @var{radix}
613is a default radix that may be overridden by an explicit radix
614prefix in @var{string} (e.g. "#o177"). If @var{radix} is not
615supplied, then the default radix is 10. If string is not a
616syntactically valid notation for a number, then
617@code{string->number} returns @code{#f}.
38a93523
NJ
618@end deffn
619
620
621@node Complex
622@subsection Complex Number Operations
5c4b24e1
MG
623@rnindex make-rectangular
624@rnindex make-polar
625@rnindex real-part
626@rnindex imag-part
627@rnindex magnitude
628@rnindex angle
38a93523 629
38a93523 630@deffn primitive make-rectangular real imaginary
780ee65e
NJ
631Return a complex number constructed of the given @var{real} and
632@var{imaginary} parts.
38a93523
NJ
633@end deffn
634
38a93523 635@deffn primitive make-polar x y
780ee65e 636Return the complex number @var{x} * e^(i * @var{y}).
38a93523
NJ
637@end deffn
638
639@c begin (texi-doc-string "guile" "real-part")
640@deffn primitive real-part
fcaedf99 641Return the real part of the number @var{z}.
38a93523
NJ
642@end deffn
643
644@c begin (texi-doc-string "guile" "imag-part")
645@deffn primitive imag-part
fcaedf99 646Return the imaginary part of the number @var{z}.
38a93523
NJ
647@end deffn
648
649@c begin (texi-doc-string "guile" "magnitude")
650@deffn primitive magnitude
fcaedf99
MG
651Return the magnitude of the number @var{z}. This is the same as
652@code{abs} for real arguments, but also allows complex numbers.
38a93523
NJ
653@end deffn
654
655@c begin (texi-doc-string "guile" "angle")
656@deffn primitive angle
fcaedf99 657Return the angle of the complex number @var{z}.
38a93523
NJ
658@end deffn
659
660
661@node Arithmetic
662@subsection Arithmetic Functions
5c4b24e1
MG
663@rnindex max
664@rnindex min
665@rnindex +
666@rnindex *
667@rnindex -
668@rnindex /
669@rnindex abs
670@rnindex floor
671@rnindex ceiling
672@rnindex truncate
673@rnindex round
38a93523
NJ
674
675@c begin (texi-doc-string "guile" "+")
fcaedf99
MG
676@deffn primitive + z1 @dots{}
677Return the sum of all parameter values. Return 0 if called without any
678parameters.
38a93523
NJ
679@end deffn
680
681@c begin (texi-doc-string "guile" "-")
fcaedf99
MG
682@deffn primitive - z1 z2 @dots{}
683If called without arguments, 0 is returned. Otherwise the sum of all but
684the first argument are subtracted from the first argument.
38a93523
NJ
685@end deffn
686
687@c begin (texi-doc-string "guile" "*")
fcaedf99
MG
688@deffn primitive * z1 @dots{}
689Return the product of all arguments. If called without arguments, 1 is
690returned.
38a93523
NJ
691@end deffn
692
693@c begin (texi-doc-string "guile" "/")
fcaedf99
MG
694@deffn primitive / z1 z2 @dots{}
695Divide the first argument by the product of the remaining arguments.
38a93523
NJ
696@end deffn
697
698@c begin (texi-doc-string "guile" "abs")
fcaedf99
MG
699@deffn primitive abs x
700Return the absolute value of @var{x}.
38a93523
NJ
701@end deffn
702
703@c begin (texi-doc-string "guile" "max")
fcaedf99
MG
704@deffn primitive max x1 x2 @dots{}
705Return the maximum of all parameter values.
38a93523
NJ
706@end deffn
707
708@c begin (texi-doc-string "guile" "min")
fcaedf99
MG
709@deffn primitive min x1 x2 @dots{}
710Return the minium of all parameter values.
38a93523
NJ
711@end deffn
712
713@c begin (texi-doc-string "guile" "truncate")
714@deffn primitive truncate
fcaedf99 715Round the inexact number @var{x} towards zero.
38a93523
NJ
716@end deffn
717
718@c begin (texi-doc-string "guile" "round")
fcaedf99
MG
719@deffn primitive round x
720Round the inexact number @var{x} towards zero.
38a93523
NJ
721@end deffn
722
723@c begin (texi-doc-string "guile" "floor")
fcaedf99
MG
724@deffn primitive floor x
725Round the number @var{x} towards minus infinity.
38a93523
NJ
726@end deffn
727
728@c begin (texi-doc-string "guile" "ceiling")
fcaedf99
MG
729@deffn primitive ceiling x
730Round the number @var{x} towards infinity.
38a93523
NJ
731@end deffn
732
733
734@node Scientific
735@subsection Scientific Functions
5c4b24e1
MG
736@rnindex exp
737@rnindex log
738@rnindex sin
739@rnindex cos
740@rnindex tan
741@rnindex asin
742@rnindex acos
743@rnindex atan
744@rnindex sqrt
745@rnindex expt
38a93523
NJ
746
747The following procedures accept any kind of number as arguments,
748including complex numbers.
749
750@c begin (texi-doc-string "guile" "sqrt")
751@deffn procedure sqrt z
752Return the square root of @var{z}.
753@end deffn
754
755@c begin (texi-doc-string "guile" "expt")
756@deffn procedure expt z1 z2
757Return @var{z1} raised to the power of @var{z2}.
758@end deffn
759
760@c begin (texi-doc-string "guile" "sin")
761@deffn procedure sin z
762Return the sine of @var{z}.
763@end deffn
764
765@c begin (texi-doc-string "guile" "cos")
766@deffn procedure cos z
767Return the cosine of @var{z}.
768@end deffn
769
770@c begin (texi-doc-string "guile" "tan")
771@deffn procedure tan z
772Return the tangent of @var{z}.
773@end deffn
774
775@c begin (texi-doc-string "guile" "asin")
776@deffn procedure asin z
777Return the arcsine of @var{z}.
778@end deffn
779
780@c begin (texi-doc-string "guile" "acos")
781@deffn procedure acos z
782Return the arccosine of @var{z}.
783@end deffn
784
785@c begin (texi-doc-string "guile" "atan")
786@deffn procedure atan z
787Return the arctangent of @var{z}.
788@end deffn
789
790@c begin (texi-doc-string "guile" "exp")
791@deffn procedure exp z
792Return e to the power of @var{z}, where e is the base of natural
793logarithms (2.71828@dots{}).
794@end deffn
795
796@c begin (texi-doc-string "guile" "log")
797@deffn procedure log z
798Return the natural logarithm of @var{z}.
799@end deffn
800
801@c begin (texi-doc-string "guile" "log10")
802@deffn procedure log10 z
803Return the base 10 logarithm of @var{z}.
804@end deffn
805
806@c begin (texi-doc-string "guile" "sinh")
807@deffn procedure sinh z
808Return the hyperbolic sine of @var{z}.
809@end deffn
810
811@c begin (texi-doc-string "guile" "cosh")
812@deffn procedure cosh z
813Return the hyperbolic cosine of @var{z}.
814@end deffn
815
816@c begin (texi-doc-string "guile" "tanh")
817@deffn procedure tanh z
818Return the hyperbolic tangent of @var{z}.
819@end deffn
820
821@c begin (texi-doc-string "guile" "asinh")
822@deffn procedure asinh z
823Return the hyperbolic arcsine of @var{z}.
824@end deffn
825
826@c begin (texi-doc-string "guile" "acosh")
827@deffn procedure acosh z
828Return the hyperbolic arccosine of @var{z}.
829@end deffn
830
831@c begin (texi-doc-string "guile" "atanh")
832@deffn procedure atanh z
833Return the hyperbolic arctangent of @var{z}.
834@end deffn
835
836
837@node Primitive Numerics
838@subsection Primitive Numeric Functions
839
840Many of Guile's numeric procedures which accept any kind of numbers as
841arguments, including complex numbers, are implemented as Scheme
842procedures that use the following real number-based primitives. These
843primitives signal an error if they are called with complex arguments.
844
845@c begin (texi-doc-string "guile" "$abs")
846@deffn primitive $abs x
847Return the absolute value of @var{x}.
848@end deffn
849
850@c begin (texi-doc-string "guile" "$sqrt")
851@deffn primitive $sqrt x
852Return the square root of @var{x}.
853@end deffn
854
38a93523
NJ
855@deffn primitive $expt x y
856Return @var{x} raised to the power of @var{y}. This
857procedure does not accept complex arguments.
858@end deffn
859
860@c begin (texi-doc-string "guile" "$sin")
861@deffn primitive $sin x
862Return the sine of @var{x}.
863@end deffn
864
865@c begin (texi-doc-string "guile" "$cos")
866@deffn primitive $cos x
867Return the cosine of @var{x}.
868@end deffn
869
870@c begin (texi-doc-string "guile" "$tan")
871@deffn primitive $tan x
872Return the tangent of @var{x}.
873@end deffn
874
875@c begin (texi-doc-string "guile" "$asin")
876@deffn primitive $asin x
877Return the arcsine of @var{x}.
878@end deffn
879
880@c begin (texi-doc-string "guile" "$acos")
881@deffn primitive $acos x
882Return the arccosine of @var{x}.
883@end deffn
884
885@c begin (texi-doc-string "guile" "$atan")
886@deffn primitive $atan x
887Return the arctangent of @var{x} in the range -PI/2 to PI/2.
888@end deffn
889
38a93523
NJ
890@deffn primitive $atan2 x y
891Return the arc tangent of the two arguments @var{x} and
892@var{y}. This is similar to calculating the arc tangent of
893@var{x} / @var{y}, except that the signs of both arguments
894are used to determine the quadrant of the result. This
895procedure does not accept complex arguments.
896@end deffn
897
898@c begin (texi-doc-string "guile" "$exp")
899@deffn primitive $exp x
900Return e to the power of @var{x}, where e is the base of natural
901logarithms (2.71828@dots{}).
902@end deffn
903
904@c begin (texi-doc-string "guile" "$log")
905@deffn primitive $log x
906Return the natural logarithm of @var{x}.
907@end deffn
908
909@c begin (texi-doc-string "guile" "$sinh")
910@deffn primitive $sinh x
911Return the hyperbolic sine of @var{x}.
912@end deffn
913
914@c begin (texi-doc-string "guile" "$cosh")
915@deffn primitive $cosh x
916Return the hyperbolic cosine of @var{x}.
917@end deffn
918
919@c begin (texi-doc-string "guile" "$tanh")
920@deffn primitive $tanh x
921Return the hyperbolic tangent of @var{x}.
922@end deffn
923
924@c begin (texi-doc-string "guile" "$asinh")
925@deffn primitive $asinh x
926Return the hyperbolic arcsine of @var{x}.
927@end deffn
928
929@c begin (texi-doc-string "guile" "$acosh")
930@deffn primitive $acosh x
931Return the hyperbolic arccosine of @var{x}.
932@end deffn
933
934@c begin (texi-doc-string "guile" "$atanh")
935@deffn primitive $atanh x
936Return the hyperbolic arctangent of @var{x}.
937@end deffn
938
939
940@node Bitwise Operations
941@subsection Bitwise Operations
942
38a93523 943@deffn primitive logand n1 n2
ae9f3a15 944Return the integer which is the bit-wise AND of the two integer
38a93523 945arguments.
38a93523
NJ
946@lisp
947(number->string (logand #b1100 #b1010) 2)
948 @result{} "1000"
949@end lisp
950@end deffn
951
38a93523 952@deffn primitive logior n1 n2
ae9f3a15 953Return the integer which is the bit-wise OR of the two integer
38a93523 954arguments.
38a93523
NJ
955@lisp
956(number->string (logior #b1100 #b1010) 2)
957 @result{} "1110"
958@end lisp
959@end deffn
960
38a93523 961@deffn primitive logxor n1 n2
ae9f3a15 962Return the integer which is the bit-wise XOR of the two integer
38a93523 963arguments.
38a93523
NJ
964@lisp
965(number->string (logxor #b1100 #b1010) 2)
966 @result{} "110"
967@end lisp
968@end deffn
969
38a93523 970@deffn primitive lognot n
ae9f3a15
MG
971Return the integer which is the 2s-complement of the integer
972argument.
38a93523
NJ
973@lisp
974(number->string (lognot #b10000000) 2)
975 @result{} "-10000001"
976(number->string (lognot #b0) 2)
977 @result{} "-1"
978@end lisp
979@end deffn
980
ae9f3a15
MG
981@deffn primitive logtest j k
982@lisp
38a93523
NJ
983(logtest j k) @equiv{} (not (zero? (logand j k)))
984
985(logtest #b0100 #b1011) @result{} #f
986(logtest #b0100 #b0111) @result{} #t
ae9f3a15 987@end lisp
38a93523
NJ
988@end deffn
989
38a93523 990@deffn primitive logbit? index j
ae9f3a15 991@lisp
38a93523
NJ
992(logbit? index j) @equiv{} (logtest (integer-expt 2 index) j)
993
994(logbit? 0 #b1101) @result{} #t
995(logbit? 1 #b1101) @result{} #f
996(logbit? 2 #b1101) @result{} #t
997(logbit? 3 #b1101) @result{} #t
998(logbit? 4 #b1101) @result{} #f
ae9f3a15 999@end lisp
38a93523
NJ
1000@end deffn
1001
38a93523 1002@deffn primitive ash n cnt
ae9f3a15
MG
1003The function ash performs an arithmetic shift left by @var{cnt}
1004bits (or shift right, if @var{cnt} is negative). 'Arithmetic'
1005means, that the function does not guarantee to keep the bit
1006structure of @var{n}, but rather guarantees that the result
1007will always be rounded towards minus infinity. Therefore, the
1008results of ash and a corresponding bitwise shift will differ if
1009@var{n} is negative.
38a93523 1010Formally, the function returns an integer equivalent to
780ee65e 1011@code{(inexact->exact (floor (* @var{n} (expt 2 @var{cnt}))))}.
38a93523 1012@lisp
ae9f3a15
MG
1013(number->string (ash #b1 3) 2) @result{} "1000"
1014(number->string (ash #b1010 -1) 2) @result{} "101"
38a93523
NJ
1015@end lisp
1016@end deffn
1017
38a93523 1018@deffn primitive logcount n
ae9f3a15
MG
1019Return the number of bits in integer @var{n}. If integer is
1020positive, the 1-bits in its binary representation are counted.
1021If negative, the 0-bits in its two's-complement binary
1022representation are counted. If 0, 0 is returned.
38a93523
NJ
1023@lisp
1024(logcount #b10101010)
1025 @result{} 4
1026(logcount 0)
1027 @result{} 0
1028(logcount -2)
1029 @result{} 1
1030@end lisp
1031@end deffn
1032
38a93523 1033@deffn primitive integer-length n
ae9f3a15 1034Return the number of bits neccessary to represent @var{n}.
38a93523
NJ
1035@lisp
1036(integer-length #b10101010)
1037 @result{} 8
1038(integer-length 0)
1039 @result{} 0
1040(integer-length #b1111)
1041 @result{} 4
1042@end lisp
1043@end deffn
1044
38a93523 1045@deffn primitive integer-expt n k
ae9f3a15
MG
1046Return @var{n} raised to the non-negative integer exponent
1047@var{k}.
38a93523
NJ
1048@lisp
1049(integer-expt 2 5)
1050 @result{} 32
1051(integer-expt -3 3)
1052 @result{} -27
1053@end lisp
1054@end deffn
1055
38a93523 1056@deffn primitive bit-extract n start end
ae9f3a15
MG
1057Return the integer composed of the @var{start} (inclusive)
1058through @var{end} (exclusive) bits of @var{n}. The
1059@var{start}th bit becomes the 0-th bit in the result.
38a93523
NJ
1060@lisp
1061(number->string (bit-extract #b1101101010 0 4) 2)
1062 @result{} "1010"
1063(number->string (bit-extract #b1101101010 4 9) 2)
1064 @result{} "10110"
1065@end lisp
1066@end deffn
1067
1068
1069@node Random
1070@subsection Random Number Generation
1071
38a93523
NJ
1072@deffn primitive copy-random-state [state]
1073Return a copy of the random state @var{state}.
1074@end deffn
1075
38a93523
NJ
1076@deffn primitive random n [state]
1077Return a number in [0,N).
1078Accepts a positive integer or real n and returns a
1079number of the same type between zero (inclusive) and
1080N (exclusive). The values returned have a uniform
1081distribution.
1082The optional argument @var{state} must be of the type produced
1083by @code{seed->random-state}. It defaults to the value of the
1084variable @var{*random-state*}. This object is used to maintain
1085the state of the pseudo-random-number generator and is altered
1086as a side effect of the random operation.
1087@end deffn
1088
38a93523 1089@deffn primitive random:exp [state]
ae9f3a15
MG
1090Return an inexact real in an exponential distribution with mean
10911. For an exponential distribution with mean u use (* u
1092(random:exp)).
38a93523
NJ
1093@end deffn
1094
38a93523
NJ
1095@deffn primitive random:hollow-sphere! v [state]
1096Fills vect with inexact real random numbers
1097the sum of whose squares is equal to 1.0.
1098Thinking of vect as coordinates in space of
1099dimension n = (vector-length vect), the coordinates
1100are uniformly distributed over the surface of the
1101unit n-shere.
1102@end deffn
1103
38a93523 1104@deffn primitive random:normal [state]
ae9f3a15
MG
1105Return an inexact real in a normal distribution. The
1106distribution used has mean 0 and standard deviation 1. For a
1107normal distribution with mean m and standard deviation d use
1108@code{(+ m (* d (random:normal)))}.
38a93523
NJ
1109@end deffn
1110
38a93523
NJ
1111@deffn primitive random:normal-vector! v [state]
1112Fills vect with inexact real random numbers that are
1113independent and standard normally distributed
1114(i.e., with mean 0 and variance 1).
1115@end deffn
1116
38a93523
NJ
1117@deffn primitive random:solid-sphere! v [state]
1118Fills vect with inexact real random numbers
1119the sum of whose squares is less than 1.0.
1120Thinking of vect as coordinates in space of
1121dimension n = (vector-length vect), the coordinates
1122are uniformly distributed within the unit n-shere.
1123The sum of the squares of the numbers is returned.
1124@end deffn
1125
38a93523 1126@deffn primitive random:uniform [state]
ae9f3a15
MG
1127Return a uniformly distributed inexact real random number in
1128[0,1).
38a93523
NJ
1129@end deffn
1130
38a93523
NJ
1131@deffn primitive seed->random-state seed
1132Return a new random state using @var{seed}.
1133@end deffn
1134
1135
1136@node Characters
1137@section Characters
fcaedf99 1138
38a93523
NJ
1139
1140Most of the characters in the ASCII character set may be referred to by
1141name: for example, @code{#\tab}, @code{#\esc}, @code{#\stx}, and so on.
1142The following table describes the ASCII names for each character.
1143
1144@multitable @columnfractions .25 .25 .25 .25
1145@item 0 = @code{#\nul}
1146 @tab 1 = @code{#\soh}
1147 @tab 2 = @code{#\stx}
1148 @tab 3 = @code{#\etx}
1149@item 4 = @code{#\eot}
1150 @tab 5 = @code{#\enq}
1151 @tab 6 = @code{#\ack}
1152 @tab 7 = @code{#\bel}
1153@item 8 = @code{#\bs}
1154 @tab 9 = @code{#\ht}
1155 @tab 10 = @code{#\nl}
1156 @tab 11 = @code{#\vt}
1157@item 12 = @code{#\np}
1158 @tab 13 = @code{#\cr}
1159 @tab 14 = @code{#\so}
1160 @tab 15 = @code{#\si}
1161@item 16 = @code{#\dle}
1162 @tab 17 = @code{#\dc1}
1163 @tab 18 = @code{#\dc2}
1164 @tab 19 = @code{#\dc3}
1165@item 20 = @code{#\dc4}
1166 @tab 21 = @code{#\nak}
1167 @tab 22 = @code{#\syn}
1168 @tab 23 = @code{#\etb}
1169@item 24 = @code{#\can}
1170 @tab 25 = @code{#\em}
1171 @tab 26 = @code{#\sub}
1172 @tab 27 = @code{#\esc}
1173@item 28 = @code{#\fs}
1174 @tab 29 = @code{#\gs}
1175 @tab 30 = @code{#\rs}
1176 @tab 31 = @code{#\us}
1177@item 32 = @code{#\sp}
1178@end multitable
1179
1180The @code{delete} character (octal 177) may be referred to with the name
1181@code{#\del}.
1182
1183Several characters have more than one name:
1184
1185@itemize @bullet
1186@item
1187#\space, #\sp
1188@item
1189#\newline, #\nl
1190@item
1191#\tab, #\ht
1192@item
1193#\backspace, #\bs
1194@item
1195#\return, #\cr
1196@item
1197#\page, #\np
1198@item
1199#\null, #\nul
1200@end itemize
1201
f4f2b29a 1202@rnindex char?
38a93523
NJ
1203@deffn primitive char? x
1204Return @code{#t} iff @var{x} is a character, else @code{#f}.
1205@end deffn
1206
f4f2b29a 1207@rnindex char=?
38a93523
NJ
1208@deffn primitive char=? x y
1209Return @code{#t} iff @var{x} is the same character as @var{y}, else @code{#f}.
1210@end deffn
1211
f4f2b29a 1212@rnindex char<?
38a93523
NJ
1213@deffn primitive char<? x y
1214Return @code{#t} iff @var{x} is less than @var{y} in the ASCII sequence,
1215else @code{#f}.
1216@end deffn
1217
f4f2b29a 1218@rnindex char<=?
38a93523
NJ
1219@deffn primitive char<=? x y
1220Return @code{#t} iff @var{x} is less than or equal to @var{y} in the
1221ASCII sequence, else @code{#f}.
1222@end deffn
1223
f4f2b29a 1224@rnindex char>?
38a93523
NJ
1225@deffn primitive char>? x y
1226Return @code{#t} iff @var{x} is greater than @var{y} in the ASCII
1227sequence, else @code{#f}.
1228@end deffn
1229
f4f2b29a 1230@rnindex char>=?
38a93523
NJ
1231@deffn primitive char>=? x y
1232Return @code{#t} iff @var{x} is greater than or equal to @var{y} in the
1233ASCII sequence, else @code{#f}.
1234@end deffn
1235
f4f2b29a 1236@rnindex char-ci=?
38a93523
NJ
1237@deffn primitive char-ci=? x y
1238Return @code{#t} iff @var{x} is the same character as @var{y} ignoring
1239case, else @code{#f}.
1240@end deffn
1241
f4f2b29a 1242@rnindex char-ci<?
38a93523
NJ
1243@deffn primitive char-ci<? x y
1244Return @code{#t} iff @var{x} is less than @var{y} in the ASCII sequence
1245ignoring case, else @code{#f}.
1246@end deffn
1247
f4f2b29a 1248@rnindex char-ci<=?
38a93523
NJ
1249@deffn primitive char-ci<=? x y
1250Return @code{#t} iff @var{x} is less than or equal to @var{y} in the
1251ASCII sequence ignoring case, else @code{#f}.
1252@end deffn
1253
f4f2b29a 1254@rnindex char-ci>?
38a93523
NJ
1255@deffn primitive char-ci>? x y
1256Return @code{#t} iff @var{x} is greater than @var{y} in the ASCII
1257sequence ignoring case, else @code{#f}.
1258@end deffn
1259
f4f2b29a 1260@rnindex char-ci>=?
38a93523
NJ
1261@deffn primitive char-ci>=? x y
1262Return @code{#t} iff @var{x} is greater than or equal to @var{y} in the
1263ASCII sequence ignoring case, else @code{#f}.
1264@end deffn
1265
f4f2b29a 1266@rnindex char-alphabetic?
38a93523
NJ
1267@deffn primitive char-alphabetic? chr
1268Return @code{#t} iff @var{chr} is alphabetic, else @code{#f}.
1269Alphabetic means the same thing as the isalpha C library function.
1270@end deffn
1271
f4f2b29a 1272@rnindex char-numeric?
38a93523
NJ
1273@deffn primitive char-numeric? chr
1274Return @code{#t} iff @var{chr} is numeric, else @code{#f}.
1275Numeric means the same thing as the isdigit C library function.
1276@end deffn
1277
f4f2b29a 1278@rnindex char-whitespace?
38a93523
NJ
1279@deffn primitive char-whitespace? chr
1280Return @code{#t} iff @var{chr} is whitespace, else @code{#f}.
1281Whitespace means the same thing as the isspace C library function.
1282@end deffn
1283
f4f2b29a 1284@rnindex char-upper-case?
38a93523
NJ
1285@deffn primitive char-upper-case? chr
1286Return @code{#t} iff @var{chr} is uppercase, else @code{#f}.
1287Uppercase means the same thing as the isupper C library function.
1288@end deffn
1289
f4f2b29a 1290@rnindex char-lower-case?
38a93523
NJ
1291@deffn primitive char-lower-case? chr
1292Return @code{#t} iff @var{chr} is lowercase, else @code{#f}.
1293Lowercase means the same thing as the islower C library function.
1294@end deffn
1295
38a93523
NJ
1296@deffn primitive char-is-both? chr
1297Return @code{#t} iff @var{chr} is either uppercase or lowercase, else @code{#f}.
1298Uppercase and lowercase are as defined by the isupper and islower
1299C library functions.
1300@end deffn
1301
f4f2b29a 1302@rnindex char->integer
38a93523
NJ
1303@deffn primitive char->integer chr
1304Return the number corresponding to ordinal position of @var{chr} in the
1305ASCII sequence.
1306@end deffn
1307
f4f2b29a 1308@rnindex integer->char
38a93523
NJ
1309@deffn primitive integer->char n
1310Return the character at position @var{n} in the ASCII sequence.
1311@end deffn
1312
f4f2b29a 1313@rnindex char-upcase
38a93523
NJ
1314@deffn primitive char-upcase chr
1315Return the uppercase character version of @var{chr}.
1316@end deffn
1317
f4f2b29a 1318@rnindex char-downcase
38a93523
NJ
1319@deffn primitive char-downcase chr
1320Return the lowercase character version of @var{chr}.
1321@end deffn
1322
1323
1324@node Strings
1325@section Strings
1326
b576faf1
MG
1327Strings are fixed--length sequences of characters. They can be created
1328by calling constructor procedures, but they can also literally get
1329entered at the REPL or in Scheme source files.
1330
b576faf1
MG
1331Guile provides a rich set of string processing procedures, because text
1332handling is very important when Guile is used as a scripting language.
38a93523 1333
5c4b24e1
MG
1334Strings always carry the information about how many characters they are
1335composed of with them, so there is no special end--of--string character,
1336like in C. That means that Scheme strings can contain any character,
1337even the NUL character @code{'\0'}. But note: Since most operating
1338system calls dealing with strings (such as for file operations) expect
1339strings to be zero--terminated, they might do unexpected things when
1340called with string containing unusal characters.
1341
38a93523 1342@menu
5c4b24e1 1343* String Syntax:: Read syntax for strings.
b576faf1
MG
1344* String Predicates:: Testing strings for certain properties.
1345* String Constructors:: Creating new string objects.
1346* List/String Conversion:: Converting from/to lists of characters.
1347* String Selection:: Select portions from strings.
1348* String Modification:: Modify parts or whole strings.
1349* String Comparison:: Lexicographic ordering predicates.
1350* String Searching:: Searching in strings.
1351* Alphabetic Case Mapping:: Convert the alphabetic case of strings.
1352* Appending Strings:: Appending strings to form a new string.
1353* String Miscellanea:: Miscellaneous string procedures.
38a93523
NJ
1354@end menu
1355
5c4b24e1
MG
1356@node String Syntax
1357@subsection String Read Syntax
1358
da54ce85
MG
1359The read syntax for strings is an arbitrarily long sequence of
1360characters enclosed in double quotes (@code{"}). @footnote{Actually, the
1361current implementation restricts strings to a length of 2^24
1362characters.} If you want to insert a double quote character into a
1363string literal, it must be prefixed with a backslash @code{\} character
1364(called an @emph{escape character}).
5c4b24e1
MG
1365
1366The following are examples of string literals:
1367
1368@lisp
1369"foo"
1370"bar plonk"
1371"Hello World"
1372"\"Hi\", he said."
1373@end lisp
1374
1375@c FIXME::martin: What about escape sequences like \r, \n etc.?
1376
b576faf1
MG
1377@node String Predicates
1378@subsection String Predicates
1379
1380The following procedures can be used to check whether a given string
1381fulfills some specified property.
1382
5c4b24e1 1383@rnindex string?
b576faf1 1384@deffn primitive string? obj
ae9f3a15 1385Return @code{#t} iff @var{obj} is a string, else returns
b576faf1
MG
1386@code{#f}.
1387@end deffn
1388
b576faf1 1389@deffn primitive string-null? str
ae9f3a15
MG
1390Return @code{#t} if @var{str}'s length is nonzero, and
1391@code{#f} otherwise.
1392@lisp
b576faf1 1393(string-null? "") @result{} #t
ae9f3a15
MG
1394y @result{} "foo"
1395(string-null? y) @result{} #f
1396@end lisp
b576faf1
MG
1397@end deffn
1398
1399@node String Constructors
1400@subsection String Constructors
1401
1402The string constructor procedures create new string objects, possibly
1403initializing them with some specified character data.
1404
1405@c FIXME::martin: list->string belongs into `List/String Conversion'
38a93523 1406
5c4b24e1
MG
1407@rnindex string
1408@rnindex list->string
38a93523
NJ
1409@deffn primitive string . chrs
1410@deffnx primitive list->string chrs
ae9f3a15 1411Return a newly allocated string composed of the arguments,
38a93523
NJ
1412@var{chrs}.
1413@end deffn
1414
5c4b24e1 1415@rnindex make-string
38a93523
NJ
1416@deffn primitive make-string k [chr]
1417Return a newly allocated string of
1418length @var{k}. If @var{chr} is given, then all elements of
1419the string are initialized to @var{chr}, otherwise the contents
1420of the @var{string} are unspecified.
1421@end deffn
1422
b576faf1
MG
1423@node List/String Conversion
1424@subsection List/String conversion
1425
1426When processing strings, it is often convenient to first convert them
1427into a list representation by using the procedure @code{string->list},
1428work with the resulting list, and then convert it back into a string.
1429These procedures are useful for similar tasks.
1430
5c4b24e1 1431@rnindex string->list
b576faf1 1432@deffn primitive string->list str
ae9f3a15
MG
1433Return a newly allocated list of the characters that make up
1434the given string @var{str}. @code{string->list} and
1435@code{list->string} are inverses as far as @samp{equal?} is
1436concerned.
38a93523
NJ
1437@end deffn
1438
76f944c3
MG
1439@deffn primitive string-split str chr
1440Split the string @var{str} into the a list of the substrings delimited
1441by appearances of the character @var{chr}. Note that an empty substring
1442between separator characters will result in an empty string in the
1443result list.
1444@lisp
1445(string-split "root:x:0:0:root:/root:/bin/bash" #\:)
1446@result{}
1447("root" "x" "0" "0" "root" "/root" "/bin/bash")
1448
1449(string-split "::" #\:)
1450@result{}
1451("" "" "")
1452
1453(string-split "" #\:)
1454@result{}
1455("")
1456@end lisp
1457@end deffn
1458
1459
b576faf1
MG
1460@node String Selection
1461@subsection String Selection
1462
1463Portions of strings can be extracted by these procedures.
1464@code{string-ref} delivers individual characters whereas
1465@code{substring} can be used to extract substrings from longer strings.
1466
5c4b24e1 1467@rnindex string-length
38a93523
NJ
1468@deffn primitive string-length string
1469Return the number of characters in @var{string}.
1470@end deffn
1471
5c4b24e1 1472@rnindex string-ref
38a93523
NJ
1473@deffn primitive string-ref str k
1474Return character @var{k} of @var{str} using zero-origin
1475indexing. @var{k} must be a valid index of @var{str}.
1476@end deffn
1477
5c4b24e1 1478@rnindex string-copy
b576faf1 1479@deffn primitive string-copy str
ae9f3a15 1480Return a newly allocated copy of the given @var{string}.
38a93523
NJ
1481@end deffn
1482
5c4b24e1 1483@rnindex substring
38a93523
NJ
1484@deffn primitive substring str start [end]
1485Return a newly allocated string formed from the characters
1486of @var{str} beginning with index @var{start} (inclusive) and
1487ending with index @var{end} (exclusive).
1488@var{str} must be a string, @var{start} and @var{end} must be
1489exact integers satisfying:
1490
14910 <= @var{start} <= @var{end} <= (string-length @var{str}).
1492@end deffn
1493
b576faf1
MG
1494@node String Modification
1495@subsection String Modification
38a93523 1496
b576faf1
MG
1497These procedures are for modifying strings in--place. That means, that
1498not a new string is the result of a string operation, but that the
1499actual memory representation of a string is modified.
38a93523 1500
5c4b24e1 1501@rnindex string-set!
b576faf1
MG
1502@deffn primitive string-set! str k chr
1503Store @var{chr} in element @var{k} of @var{str} and return
1504an unspecified value. @var{k} must be a valid index of
1505@var{str}.
1506@end deffn
38a93523 1507
5c4b24e1 1508@rnindex string-fill!
b576faf1 1509@deffn primitive string-fill! str chr
ae9f3a15
MG
1510Store @var{char} in every element of the given @var{string} and
1511return an unspecified value.
38a93523
NJ
1512@end deffn
1513
b576faf1 1514@deffn primitive substring-fill! str start end fill
ae9f3a15
MG
1515Change every character in @var{str} between @var{start} and
1516@var{end} to @var{fill}.
1517@lisp
b576faf1
MG
1518(define y "abcdefg")
1519(substring-fill! y 1 3 #\r)
1520y
1521@result{} "arrdefg"
ae9f3a15 1522@end lisp
38a93523
NJ
1523@end deffn
1524
38a93523
NJ
1525@deffn primitive substring-move! str1 start1 end1 str2 start2
1526@deffnx primitive substring-move-left! str1 start1 end1 str2 start2
1527@deffnx primitive substring-move-right! str1 start1 end1 str2 start2
1528Copy the substring of @var{str1} bounded by @var{start1} and @var{end1}
1529into @var{str2} beginning at position @var{end2}.
1530@code{substring-move-right!} begins copying from the rightmost character
1531and moves left, and @code{substring-move-left!} copies from the leftmost
1532character moving right.
1533
1534It is useful to have two functions that copy in different directions so
1535that substrings can be copied back and forth within a single string. If
1536you wish to copy text from the left-hand side of a string to the
1537right-hand side of the same string, and the source and destination
1538overlap, you must be careful to copy the rightmost characters of the
1539text first, to avoid clobbering your data. Hence, when @var{str1} and
1540@var{str2} are the same string, you should use
1541@code{substring-move-right!} when moving text from left to right, and
1542@code{substring-move-left!} otherwise. If @code{str1} and @samp{str2}
1543are different strings, it does not matter which function you use.
1544@end deffn
1545
1546@deffn primitive substring-move-left! str1 start1 end1 str2 start2
1547@end deffn
1548@deftypefn {C Function} SCM scm_substring_move_left_x (SCM @var{str1}, SCM @var{start1}, SCM @var{end1}, SCM @var{str2}, SCM @var{start2})
1549[@strong{Note:} this is only valid if you've applied the strop patch].
1550
1551Moves a substring of @var{str1}, from @var{start1} to @var{end1}
1552(@var{end1} is exclusive), into @var{str2}, starting at
1553@var{start2}. Allows overlapping strings.
1554
1555@example
1556(define x (make-string 10 #\a))
1557(define y "bcd")
1558(substring-move-left! x 2 5 y 0)
1559y
1560@result{} "aaa"
1561
1562x
1563@result{} "aaaaaaaaaa"
1564
1565(define y "bcdefg")
1566(substring-move-left! x 2 5 y 0)
1567y
1568@result{} "aaaefg"
1569
1570(define y "abcdefg")
1571(substring-move-left! y 2 5 y 3)
1572y
1573@result{} "abccccg"
1574@end example
1575@end deftypefn
1576
1577@deffn substring-move-right! str1 start1 end1 str2 start2
1578@end deffn
1579@deftypefn {C Function} SCM scm_substring_move_right_x (SCM @var{str1}, SCM @var{start1}, SCM @var{end1}, SCM @var{str2}, SCM @var{start2})
1580[@strong{Note:} this is only valid if you've applied the strop patch, if
1581it hasn't made it into the guile tree].
1582
1583Does much the same thing as @code{substring-move-left!}, except it
1584starts moving at the end of the sequence, rather than the beginning.
1585@example
1586(define y "abcdefg")
1587(substring-move-right! y 2 5 y 0)
1588y
1589@result{} "ededefg"
1590
1591(define y "abcdefg")
1592(substring-move-right! y 2 5 y 3)
1593y
1594@result{} "abccdeg"
1595@end example
1596@end deftypefn
1597
38a93523 1598
b576faf1
MG
1599@node String Comparison
1600@subsection String Comparison
38a93523 1601
b576faf1
MG
1602The procedures in this section are similar to the character ordering
1603predicates (REFFIXME), but are defined on character sequences. They all
1604return @code{#t} on success and @code{#f} on failure. The predicates
1605ending in @code{-ci} ignore the character case when comparing strings.
38a93523 1606
2954ad93 1607
5c4b24e1 1608@rnindex string=?
2954ad93
MG
1609@deffn primitive string=? s1 s2
1610Lexicographic equality predicate; return @code{#t} if the two
1611strings are the same length and contain the same characters in
1612the same positions, otherwise return @code{#f}.
1613The procedure @code{string-ci=?} treats upper and lower case
1614letters as though they were the same character, but
1615@code{string=?} treats upper and lower case as distinct
1616characters.
1617@end deffn
1618
5c4b24e1 1619@rnindex string<?
2954ad93
MG
1620@deffn primitive string<? s1 s2
1621Lexicographic ordering predicate; return @code{#t} if @var{s1}
1622is lexicographically less than @var{s2}.
1623@end deffn
1624
5c4b24e1 1625@rnindex string<=?
2954ad93
MG
1626@deffn primitive string<=? s1 s2
1627Lexicographic ordering predicate; return @code{#t} if @var{s1}
1628is lexicographically less than or equal to @var{s2}.
38a93523
NJ
1629@end deffn
1630
5c4b24e1 1631@rnindex string>?
2954ad93
MG
1632@deffn primitive string>? s1 s2
1633Lexicographic ordering predicate; return @code{#t} if @var{s1}
1634is lexicographically greater than @var{s2}.
1635@end deffn
1636
5c4b24e1 1637@rnindex string>=?
2954ad93
MG
1638@deffn primitive string>=? s1 s2
1639Lexicographic ordering predicate; return @code{#t} if @var{s1}
1640is lexicographically greater than or equal to @var{s2}.
38a93523
NJ
1641@end deffn
1642
5c4b24e1 1643@rnindex string-ci=?
38a93523 1644@deffn primitive string-ci=? s1 s2
ae9f3a15
MG
1645Case-insensitive string equality predicate; return @code{#t} if
1646the two strings are the same length and their component
780ee65e 1647characters match (ignoring case) at each position; otherwise
ae9f3a15 1648return @code{#f}.
38a93523
NJ
1649@end deffn
1650
5c4b24e1 1651@rnindex string-ci<
2954ad93 1652@deffn primitive string-ci<? s1 s2
ae9f3a15 1653Case insensitive lexicographic ordering predicate; return
2954ad93
MG
1654@code{#t} if @var{s1} is lexicographically less than @var{s2}
1655regardless of case.
1656@end deffn
1657
5c4b24e1 1658@rnindex string<=?
2954ad93
MG
1659@deffn primitive string-ci<=? s1 s2
1660Case insensitive lexicographic ordering predicate; return
1661@code{#t} if @var{s1} is lexicographically less than or equal
1662to @var{s2} regardless of case.
38a93523
NJ
1663@end deffn
1664
5c4b24e1 1665@rnindex string-ci>?
38a93523 1666@deffn primitive string-ci>? s1 s2
ae9f3a15
MG
1667Case insensitive lexicographic ordering predicate; return
1668@code{#t} if @var{s1} is lexicographically greater than
1669@var{s2} regardless of case.
38a93523
NJ
1670@end deffn
1671
5c4b24e1 1672@rnindex string-ci>=?
2954ad93
MG
1673@deffn primitive string-ci>=? s1 s2
1674Case insensitive lexicographic ordering predicate; return
1675@code{#t} if @var{s1} is lexicographically greater than or
1676equal to @var{s2} regardless of case.
38a93523
NJ
1677@end deffn
1678
38a93523 1679
b576faf1
MG
1680@node String Searching
1681@subsection String Searching
1682
1683When searching the index of a character in a string, these procedures
1684can be used.
1685
b576faf1 1686@deffn primitive string-index str chr [frm [to]]
ae9f3a15
MG
1687Return the index of the first occurrence of @var{chr} in
1688@var{str}. The optional integer arguments @var{frm} and
1689@var{to} limit the search to a portion of the string. This
1690procedure essentially implements the @code{index} or
1691@code{strchr} functions from the C library.
1692@lisp
b576faf1
MG
1693(string-index "weiner" #\e)
1694@result{} 1
1695
1696(string-index "weiner" #\e 2)
1697@result{} 4
1698
1699(string-index "weiner" #\e 2 4)
1700@result{} #f
ae9f3a15 1701@end lisp
38a93523
NJ
1702@end deffn
1703
b576faf1 1704@deffn primitive string-rindex str chr [frm [to]]
ae9f3a15
MG
1705Like @code{string-index}, but search from the right of the
1706string rather than from the left. This procedure essentially
1707implements the @code{rindex} or @code{strrchr} functions from
1708the C library.
1709@lisp
b576faf1
MG
1710(string-rindex "weiner" #\e)
1711@result{} 4
1712
1713(string-rindex "weiner" #\e 2 4)
1714@result{} #f
1715
1716(string-rindex "weiner" #\e 2 5)
1717@result{} 4
ae9f3a15 1718@end lisp
38a93523
NJ
1719@end deffn
1720
b576faf1
MG
1721@node Alphabetic Case Mapping
1722@subsection Alphabetic Case Mapping
1723
1724These are procedures for mapping strings to their upper-- or lower--case
1725equivalents, respectively, or for capitalizing strings.
1726
2954ad93
MG
1727@deffn primitive string-upcase str
1728Return a freshly allocated string containing the characters of
1729@var{str} in upper case.
1730@end deffn
1731
b576faf1 1732@deffn primitive string-upcase! str
ae9f3a15
MG
1733Destructively upcase every character in @var{str} and return
1734@var{str}.
1735@lisp
1736y @result{} "arrdefg"
1737(string-upcase! y) @result{} "ARRDEFG"
1738y @result{} "ARRDEFG"
1739@end lisp
38a93523
NJ
1740@end deffn
1741
2954ad93
MG
1742@deffn primitive string-downcase str
1743Return a freshly allocation string containing the characters in
1744@var{str} in lower case.
b576faf1
MG
1745@end deffn
1746
b576faf1 1747@deffn primitive string-downcase! str
ae9f3a15
MG
1748Destructively downcase every character in @var{str} and return
1749@var{str}.
1750@lisp
1751y @result{} "ARRDEFG"
1752(string-downcase! y) @result{} "arrdefg"
1753y @result{} "arrdefg"
1754@end lisp
b576faf1
MG
1755@end deffn
1756
2954ad93
MG
1757@deffn primitive string-capitalize str
1758Return a freshly allocated string with the characters in
1759@var{str}, where the first character of every word is
1760capitalized.
b576faf1
MG
1761@end deffn
1762
b576faf1 1763@deffn primitive string-capitalize! str
ae9f3a15
MG
1764Upcase the first character of every word in @var{str}
1765destructively and return @var{str}.
1766@lisp
1767y @result{} "hello world"
1768(string-capitalize! y) @result{} "Hello World"
1769y @result{} "Hello World"
1770@end lisp
b576faf1
MG
1771@end deffn
1772
b576faf1
MG
1773
1774@node Appending Strings
1775@subsection Appending Strings
1776
1777The procedure @code{string-append} appends several strings together to
1778form a longer result string.
1779
5c4b24e1 1780@rnindex string-append
b576faf1
MG
1781@deffn primitive string-append . args
1782Return a newly allocated string whose characters form the
1783concatenation of the given strings, @var{args}.
1784@end deffn
1785
1786
1787@node String Miscellanea
1788@subsection String Miscellanea
1789
1790This section contains several remaining string procedures.
1791
b576faf1 1792@deffn primitive string-ci->symbol str
ae9f3a15
MG
1793Return the symbol whose name is @var{str}. @var{str} is
1794converted to lowercase before the conversion is done, if Guile
1795is currently reading symbols case--insensitively.
38a93523
NJ
1796@end deffn
1797
1798
38a93523
NJ
1799@node Regular Expressions
1800@section Regular Expressions
1801
1802@cindex regular expressions
1803@cindex regex
1804@cindex emacs regexp
1805
1806A @dfn{regular expression} (or @dfn{regexp}) is a pattern that
1807describes a whole class of strings. A full description of regular
1808expressions and their syntax is beyond the scope of this manual;
1809an introduction can be found in the Emacs manual (@pxref{Regexps,
1810, Syntax of Regular Expressions, emacs, The GNU Emacs Manual}, or
1811in many general Unix reference books.
1812
1813If your system does not include a POSIX regular expression library, and
1814you have not linked Guile with a third-party regexp library such as Rx,
1815these functions will not be available. You can tell whether your Guile
1816installation includes regular expression support by checking whether the
1817@code{*features*} list includes the @code{regex} symbol.
1818
1819@menu
1820* Regexp Functions:: Functions that create and match regexps.
1821* Match Structures:: Finding what was matched by a regexp.
1822* Backslash Escapes:: Removing the special meaning of regexp metacharacters.
1823* Rx Interface:: Tom Lord's Rx library does things differently.
1824@end menu
1825
1826[FIXME: it may be useful to include an Examples section. Parts of this
1827interface are bewildering on first glance.]
1828
1829@node Regexp Functions
1830@subsection Regexp Functions
1831
1832By default, Guile supports POSIX extended regular expressions.
1833That means that the characters @samp{(}, @samp{)}, @samp{+} and
1834@samp{?} are special, and must be escaped if you wish to match the
1835literal characters.
1836
1837This regular expression interface was modeled after that
1838implemented by SCSH, the Scheme Shell. It is intended to be
1839upwardly compatible with SCSH regular expressions.
1840
1841@c begin (scm-doc-string "regex.scm" "string-match")
1842@deffn procedure string-match pattern str [start]
1843Compile the string @var{pattern} into a regular expression and compare
1844it with @var{str}. The optional numeric argument @var{start} specifies
1845the position of @var{str} at which to begin matching.
1846
1847@code{string-match} returns a @dfn{match structure} which
1848describes what, if anything, was matched by the regular
1849expression. @xref{Match Structures}. If @var{str} does not match
1850@var{pattern} at all, @code{string-match} returns @code{#f}.
1851@end deffn
1852
1853Each time @code{string-match} is called, it must compile its
1854@var{pattern} argument into a regular expression structure. This
1855operation is expensive, which makes @code{string-match} inefficient if
1856the same regular expression is used several times (for example, in a
1857loop). For better performance, you can compile a regular expression in
1858advance and then match strings against the compiled regexp.
1859
38a93523 1860@deffn primitive make-regexp pat . flags
ae9f3a15
MG
1861Compile the regular expression described by @var{pat}, and
1862return the compiled regexp structure. If @var{pat} does not
1863describe a legal regular expression, @code{make-regexp} throws
1864a @code{regular-expression-syntax} error.
1865The @var{flags} arguments change the behavior of the compiled
1866regular expression. The following flags may be supplied:
38a93523
NJ
1867@table @code
1868@item regexp/icase
ae9f3a15
MG
1869Consider uppercase and lowercase letters to be the same when
1870matching.
38a93523 1871@item regexp/newline
ae9f3a15
MG
1872If a newline appears in the target string, then permit the
1873@samp{^} and @samp{$} operators to match immediately after or
1874immediately before the newline, respectively. Also, the
1875@samp{.} and @samp{[^...]} operators will never match a newline
1876character. The intent of this flag is to treat the target
1877string as a buffer containing many lines of text, and the
1878regular expression as a pattern that may match a single one of
1879those lines.
38a93523
NJ
1880@item regexp/basic
1881Compile a basic (``obsolete'') regexp instead of the extended
ae9f3a15
MG
1882(``modern'') regexps that are the default. Basic regexps do
1883not consider @samp{|}, @samp{+} or @samp{?} to be special
1884characters, and require the @samp{@{...@}} and @samp{(...)}
1885metacharacters to be backslash-escaped (@pxref{Backslash
1886Escapes}). There are several other differences between basic
1887and extended regular expressions, but these are the most
1888significant.
38a93523 1889@item regexp/extended
ae9f3a15
MG
1890Compile an extended regular expression rather than a basic
1891regexp. This is the default behavior; this flag will not
1892usually be needed. If a call to @code{make-regexp} includes
1893both @code{regexp/basic} and @code{regexp/extended} flags, the
1894one which comes last will override the earlier one.
38a93523
NJ
1895@end table
1896@end deffn
1897
38a93523 1898@deffn primitive regexp-exec rx str [start [flags]]
ae9f3a15
MG
1899Match the compiled regular expression @var{rx} against
1900@code{str}. If the optional integer @var{start} argument is
1901provided, begin matching from that position in the string.
1902Return a match structure describing the results of the match,
1903or @code{#f} if no match could be found.
38a93523
NJ
1904@end deffn
1905
ae9f3a15
MG
1906@deffn primitive regexp? obj
1907Return @code{#t} if @var{obj} is a compiled regular expression,
1908or @code{#f} otherwise.
38a93523
NJ
1909@end deffn
1910
1911Regular expressions are commonly used to find patterns in one string and
1912replace them with the contents of another string.
1913
1914@c begin (scm-doc-string "regex.scm" "regexp-substitute")
1915@deffn procedure regexp-substitute port match [item@dots{}]
1916Write to the output port @var{port} selected contents of the match
1917structure @var{match}. Each @var{item} specifies what should be
1918written, and may be one of the following arguments:
1919
1920@itemize @bullet
1921@item
1922A string. String arguments are written out verbatim.
1923
1924@item
1925An integer. The submatch with that number is written.
1926
1927@item
1928The symbol @samp{pre}. The portion of the matched string preceding
1929the regexp match is written.
1930
1931@item
1932The symbol @samp{post}. The portion of the matched string following
1933the regexp match is written.
1934@end itemize
1935
1936@var{port} may be @code{#f}, in which case nothing is written; instead,
1937@code{regexp-substitute} constructs a string from the specified
1938@var{item}s and returns that.
1939@end deffn
1940
1941@c begin (scm-doc-string "regex.scm" "regexp-substitute")
1942@deffn procedure regexp-substitute/global port regexp target [item@dots{}]
1943Similar to @code{regexp-substitute}, but can be used to perform global
1944substitutions on @var{str}. Instead of taking a match structure as an
1945argument, @code{regexp-substitute/global} takes two string arguments: a
1946@var{regexp} string describing a regular expression, and a @var{target}
1947string which should be matched against this regular expression.
1948
1949Each @var{item} behaves as in @var{regexp-substitute}, with the
1950following exceptions:
1951
1952@itemize @bullet
1953@item
1954A function may be supplied. When this function is called, it will be
1955passed one argument: a match structure for a given regular expression
1956match. It should return a string to be written out to @var{port}.
1957
1958@item
1959The @samp{post} symbol causes @code{regexp-substitute/global} to recurse
1960on the unmatched portion of @var{str}. This @emph{must} be supplied in
1961order to perform global search-and-replace on @var{str}; if it is not
1962present among the @var{item}s, then @code{regexp-substitute/global} will
1963return after processing a single match.
1964@end itemize
1965@end deffn
1966
1967@node Match Structures
1968@subsection Match Structures
1969
1970@cindex match structures
1971
1972A @dfn{match structure} is the object returned by @code{string-match} and
1973@code{regexp-exec}. It describes which portion of a string, if any,
1974matched the given regular expression. Match structures include: a
1975reference to the string that was checked for matches; the starting and
1976ending positions of the regexp match; and, if the regexp included any
1977parenthesized subexpressions, the starting and ending positions of each
1978submatch.
1979
1980In each of the regexp match functions described below, the @code{match}
1981argument must be a match structure returned by a previous call to
1982@code{string-match} or @code{regexp-exec}. Most of these functions
1983return some information about the original target string that was
1984matched against a regular expression; we will call that string
1985@var{target} for easy reference.
1986
1987@c begin (scm-doc-string "regex.scm" "regexp-match?")
1988@deffn procedure regexp-match? obj
1989Return @code{#t} if @var{obj} is a match structure returned by a
1990previous call to @code{regexp-exec}, or @code{#f} otherwise.
1991@end deffn
1992
1993@c begin (scm-doc-string "regex.scm" "match:substring")
1994@deffn procedure match:substring match [n]
1995Return the portion of @var{target} matched by subexpression number
1996@var{n}. Submatch 0 (the default) represents the entire regexp match.
1997If the regular expression as a whole matched, but the subexpression
1998number @var{n} did not match, return @code{#f}.
1999@end deffn
2000
2001@c begin (scm-doc-string "regex.scm" "match:start")
2002@deffn procedure match:start match [n]
2003Return the starting position of submatch number @var{n}.
2004@end deffn
2005
2006@c begin (scm-doc-string "regex.scm" "match:end")
2007@deffn procedure match:end match [n]
2008Return the ending position of submatch number @var{n}.
2009@end deffn
2010
2011@c begin (scm-doc-string "regex.scm" "match:prefix")
2012@deffn procedure match:prefix match
2013Return the unmatched portion of @var{target} preceding the regexp match.
2014@end deffn
2015
2016@c begin (scm-doc-string "regex.scm" "match:suffix")
2017@deffn procedure match:suffix match
2018Return the unmatched portion of @var{target} following the regexp match.
2019@end deffn
2020
2021@c begin (scm-doc-string "regex.scm" "match:count")
2022@deffn procedure match:count match
2023Return the number of parenthesized subexpressions from @var{match}.
2024Note that the entire regular expression match itself counts as a
2025subexpression, and failed submatches are included in the count.
2026@end deffn
2027
2028@c begin (scm-doc-string "regex.scm" "match:string")
2029@deffn procedure match:string match
2030Return the original @var{target} string.
2031@end deffn
2032
2033@node Backslash Escapes
2034@subsection Backslash Escapes
2035
2036Sometimes you will want a regexp to match characters like @samp{*} or
2037@samp{$} exactly. For example, to check whether a particular string
2038represents a menu entry from an Info node, it would be useful to match
2039it against a regexp like @samp{^* [^:]*::}. However, this won't work;
2040because the asterisk is a metacharacter, it won't match the @samp{*} at
2041the beginning of the string. In this case, we want to make the first
2042asterisk un-magic.
2043
2044You can do this by preceding the metacharacter with a backslash
2045character @samp{\}. (This is also called @dfn{quoting} the
2046metacharacter, and is known as a @dfn{backslash escape}.) When Guile
2047sees a backslash in a regular expression, it considers the following
2048glyph to be an ordinary character, no matter what special meaning it
2049would ordinarily have. Therefore, we can make the above example work by
2050changing the regexp to @samp{^\* [^:]*::}. The @samp{\*} sequence tells
2051the regular expression engine to match only a single asterisk in the
2052target string.
2053
2054Since the backslash is itself a metacharacter, you may force a regexp to
2055match a backslash in the target string by preceding the backslash with
2056itself. For example, to find variable references in a @TeX{} program,
2057you might want to find occurrences of the string @samp{\let\} followed
2058by any number of alphabetic characters. The regular expression
2059@samp{\\let\\[A-Za-z]*} would do this: the double backslashes in the
2060regexp each match a single backslash in the target string.
2061
2062@c begin (scm-doc-string "regex.scm" "regexp-quote")
2063@deffn procedure regexp-quote str
2064Quote each special character found in @var{str} with a backslash, and
2065return the resulting string.
2066@end deffn
2067
2068@strong{Very important:} Using backslash escapes in Guile source code
2069(as in Emacs Lisp or C) can be tricky, because the backslash character
2070has special meaning for the Guile reader. For example, if Guile
2071encounters the character sequence @samp{\n} in the middle of a string
2072while processing Scheme code, it replaces those characters with a
2073newline character. Similarly, the character sequence @samp{\t} is
2074replaced by a horizontal tab. Several of these @dfn{escape sequences}
2075are processed by the Guile reader before your code is executed.
2076Unrecognized escape sequences are ignored: if the characters @samp{\*}
2077appear in a string, they will be translated to the single character
2078@samp{*}.
2079
2080This translation is obviously undesirable for regular expressions, since
2081we want to be able to include backslashes in a string in order to
2082escape regexp metacharacters. Therefore, to make sure that a backslash
2083is preserved in a string in your Guile program, you must use @emph{two}
2084consecutive backslashes:
2085
2086@lisp
2087(define Info-menu-entry-pattern (make-regexp "^\\* [^:]*"))
2088@end lisp
2089
2090The string in this example is preprocessed by the Guile reader before
2091any code is executed. The resulting argument to @code{make-regexp} is
2092the string @samp{^\* [^:]*}, which is what we really want.
2093
2094This also means that in order to write a regular expression that matches
2095a single backslash character, the regular expression string in the
2096source code must include @emph{four} backslashes. Each consecutive pair
2097of backslashes gets translated by the Guile reader to a single
2098backslash, and the resulting double-backslash is interpreted by the
2099regexp engine as matching a single backslash character. Hence:
2100
2101@lisp
2102(define tex-variable-pattern (make-regexp "\\\\let\\\\=[A-Za-z]*"))
2103@end lisp
2104
2105The reason for the unwieldiness of this syntax is historical. Both
2106regular expression pattern matchers and Unix string processing systems
2107have traditionally used backslashes with the special meanings
2108described above. The POSIX regular expression specification and ANSI C
2109standard both require these semantics. Attempting to abandon either
2110convention would cause other kinds of compatibility problems, possibly
2111more severe ones. Therefore, without extending the Scheme reader to
2112support strings with different quoting conventions (an ungainly and
2113confusing extension when implemented in other languages), we must adhere
2114to this cumbersome escape syntax.
2115
2116@node Rx Interface
2117@subsection Rx Interface
2118
f4f2b29a
MG
2119@c FIXME::martin: Shouldn't this be removed or moved to the
2120@c ``Guile Modules'' chapter? The functions are not available in
2121@c plain Guile...
2122
38a93523
NJ
2123[FIXME: this is taken from Gary and Mark's quick summaries and should be
2124reviewed and expanded. Rx is pretty stable, so could already be done!]
2125
2126@cindex rx
2127@cindex finite automaton
2128
2129Guile includes an interface to Tom Lord's Rx library (currently only to
2130POSIX regular expressions). Use of the library requires a two step
2131process: compile a regular expression into an efficient structure, then
2132use the structure in any number of string comparisons.
2133
2134For example, given the
2135regular expression @samp{abc.} (which matches any string containing
2136@samp{abc} followed by any single character):
2137
2138@smalllisp
2139guile> @kbd{(define r (regcomp "abc."))}
2140guile> @kbd{r}
2141#<rgx abc.>
2142guile> @kbd{(regexec r "abc")}
2143#f
2144guile> @kbd{(regexec r "abcd")}
2145#((0 . 4))
2146guile>
2147@end smalllisp
2148
2149The definitions of @code{regcomp} and @code{regexec} are as follows:
2150
2151@c NJFIXME not in libguile!
2152@deffn primitive regcomp pattern [flags]
2153Compile the regular expression pattern using POSIX rules. Flags is
2154optional and should be specified using symbolic names:
2155@defvar REG_EXTENDED
2156use extended POSIX syntax
2157@end defvar
2158@defvar REG_ICASE
2159use case-insensitive matching
2160@end defvar
2161@defvar REG_NEWLINE
2162allow anchors to match after newline characters in the
2163string and prevents @code{.} or @code{[^...]} from matching newlines.
2164@end defvar
2165
2166The @code{logior} procedure can be used to combine multiple flags.
2167The default is to use
2168POSIX basic syntax, which makes @code{+} and @code{?} literals and @code{\+}
2169and @code{\?}
2170operators. Backslashes in @var{pattern} must be escaped if specified in a
2171literal string e.g., @code{"\\(a\\)\\?"}.
2172@end deffn
2173
2174@c NJFIXME not in libguile!
2175@deffn primitive regexec regex string [match-pick] [flags]
2176
2177Match @var{string} against the compiled POSIX regular expression
2178@var{regex}.
2179@var{match-pick} and @var{flags} are optional. Possible flags (which can be
2180combined using the logior procedure) are:
2181
2182@defvar REG_NOTBOL
2183The beginning of line operator won't match the beginning of
2184@var{string} (presumably because it's not the beginning of a line)
2185@end defvar
2186
2187@defvar REG_NOTEOL
2188Similar to REG_NOTBOL, but prevents the end of line operator
2189from matching the end of @var{string}.
2190@end defvar
2191
2192If no match is possible, regexec returns #f. Otherwise @var{match-pick}
2193determines the return value:
2194
2195@code{#t} or unspecified: a newly-allocated vector is returned,
2196containing pairs with the indices of the matched part of @var{string} and any
2197substrings.
2198
2199@code{""}: a list is returned: the first element contains a nested list
2200with the matched part of @var{string} surrounded by the the unmatched parts.
2201Remaining elements are matched substrings (if any). All returned
2202substrings share memory with @var{string}.
2203
2204@code{#f}: regexec returns #t if a match is made, otherwise #f.
2205
2206vector: the supplied vector is returned, with the first element replaced
2207by a pair containing the indices of the matched portion of @var{string} and
2208further elements replaced by pairs containing the indices of matched
2209substrings (if any).
2210
2211list: a list will be returned, with each member of the list
2212specified by a code in the corresponding position of the supplied list:
2213
2214a number: the numbered matching substring (0 for the entire match).
2215
2216@code{#\<}: the beginning of @var{string} to the beginning of the part matched
2217by regex.
2218
2219@code{#\>}: the end of the matched part of @var{string} to the end of
2220@var{string}.
2221
2222@code{#\c}: the "final tag", which seems to be associated with the "cut
2223operator", which doesn't seem to be available through the posix
2224interface.
2225
2226e.g., @code{(list #\< 0 1 #\>)}. The returned substrings share memory with
2227@var{string}.
2228@end deffn
2229
2230Here are some other procedures that might be used when using regular
2231expressions:
2232
2233@c NJFIXME not in libguile!
2234@deffn primitive compiled-regexp? obj
2235Test whether obj is a compiled regular expression.
2236@end deffn
2237
2238@c NJFIXME not in libguile!
2239@deffn primitive regexp->dfa regex [flags]
2240@end deffn
2241
2242@c NJFIXME not in libguile!
2243@deffn primitive dfa-fork dfa
2244@end deffn
2245
2246@c NJFIXME not in libguile!
2247@deffn primitive reset-dfa! dfa
2248@end deffn
2249
2250@c NJFIXME not in libguile!
2251@deffn primitive dfa-final-tag dfa
2252@end deffn
2253
2254@c NJFIXME not in libguile!
2255@deffn primitive dfa-continuable? dfa
2256@end deffn
2257
2258@c NJFIXME not in libguile!
2259@deffn primitive advance-dfa! dfa string
2260@end deffn
2261
2262
2263@node Symbols and Variables
2264@section Symbols and Variables
fcaedf99 2265
f4f2b29a 2266@c FIXME::martin: Review me!
38a93523 2267
f4f2b29a
MG
2268Symbols are a data type with a special property. On the one hand,
2269symbols are used for denoting variables in a Scheme program, on the
2270other they can be used as literal data as well.
38a93523 2271
f4f2b29a
MG
2272The association between symbols and values is maintained in special data
2273structures, the symbol tables.
38a93523 2274
f4f2b29a
MG
2275In addition, Guile offers variables as first--class objects. They can
2276be used for interacting with the module system.
38a93523 2277
f4f2b29a
MG
2278@menu
2279* Symbols:: All about symbols as a data type.
2280* Symbol Tables:: Tables for mapping symbols to values.
2281* Variables:: First--class variables.
2282@end menu
38a93523 2283
f4f2b29a
MG
2284@node Symbols
2285@subsection Symbols
38a93523 2286
f4f2b29a
MG
2287@c FIXME::martin: Review me!
2288
2289Symbols are especially useful because two symbols which are spelled the
2290same way are equivalent in the sense of @code{eq?}. That means that
2291they are actually the same Scheme object. The advantage is that symbols
2292can be compared extremely efficiently, although they carry more
2293information for the human reader than, say, numbers.
2294
2295It is very common in Scheme programs to use symbols as keys in
2296association lists (REFFIXME) or hash tables (REFFIXME), because this
2297usage improves the readability a lot, and does not cause any performance
2298loss.
38a93523 2299
f4f2b29a
MG
2300The read syntax for symbols is a sequence of letters, digits, and
2301@emph{extended alphabetic characters} that begins with a character that
2302cannot begin a number is an identifier. In addition, @code{+},
2303@code{-}, and @code{...} are identifiers.
38a93523 2304
f4f2b29a
MG
2305Extended alphabetic characters may be used within identifiers as if
2306they were letters. The following are extended alphabetic characters:
2307
2308@example
2309! $ % & * + - . / : < = > ? @@ ^ _ ~
2310@end example
2311
2312In addition to the read syntax defined above (which is taken from R5RS
2313(REFFIXME)), Guile provides a method for writing symbols with unusual
2314characters, such as space characters. If you (for whatever reason) need
2315to write a symbol containing characters not mentioned above, you write
2316symbols as follows:
2317
2318@itemize @bullet
239d2912
MG
2319@item
2320Begin the symbol with the two character @code{#@{},
2321
2322@item
2323write the characters of the symbol and
2324
2325@item
2326finish the symbol with the characters @code{@}#}.
f4f2b29a
MG
2327@end itemize
2328
2329Here are a few examples of this form of read syntax; the first
2330containing a space character, the second containing a line break and the
2331last one looks like a number.
2332
2333@lisp
2334#@{foo bar@}#
2335#@{what
2336ever@}#
2337#@{4242@}#
2338@end lisp
2339
2340Usage of this form of read syntax is discouraged, because it is not
2341portable at all, and is not very readable.
2342
2343@rnindex symbol?
2344@deffn primitive symbol? obj
2345Return @code{#t} if @var{obj} is a symbol, otherwise return
2346@code{#f}.
38a93523
NJ
2347@end deffn
2348
5c4b24e1 2349@rnindex string->symbol
38a93523 2350@deffn primitive string->symbol string
ae9f3a15
MG
2351Return the symbol whose name is @var{string}. This procedure
2352can create symbols with names containing special characters or
2353letters in the non-standard case, but it is usually a bad idea
2354to create such symbols because in some implementations of
2355Scheme they cannot be read as themselves. See
2356@code{symbol->string}.
780ee65e
NJ
2357The following examples assume that the implementation's
2358standard case is lower case:
780ee65e
NJ
2359@lisp
2360(eq? 'mISSISSIppi 'mississippi) @result{} #t
2361(string->symbol "mISSISSIppi") @result{} @r{the symbol with name "mISSISSIppi"}
2362(eq? 'bitBlt (string->symbol "bitBlt")) @result{} #f
38a93523 2363(eq? 'JollyWog
780ee65e 2364 (string->symbol (symbol->string 'JollyWog))) @result{} #t
38a93523 2365(string=? "K. Harper, M.D."
780ee65e
NJ
2366 (symbol->string
2367 (string->symbol "K. Harper, M.D."))) @result{}#t
2368@end lisp
38a93523
NJ
2369@end deffn
2370
5c4b24e1 2371@rnindex symbol->string
780ee65e 2372@deffn primitive symbol->string s
ae9f3a15
MG
2373Return the name of @var{symbol} as a string. If the symbol was
2374part of an object returned as the value of a literal expression
8c34cf5b 2375(section @pxref{Literal expressions,,,r5rs, The Revised^5
ae9f3a15
MG
2376Report on Scheme}) or by a call to the @code{read} procedure,
2377and its name contains alphabetic characters, then the string
2378returned will contain characters in the implementation's
2379preferred standard case---some implementations will prefer
2380upper case, others lower case. If the symbol was returned by
2381@code{string->symbol}, the case of characters in the string
2382returned will be the same as the case in the string that was
2383passed to @code{string->symbol}. It is an error to apply
2384mutation procedures like @code{string-set!} to strings returned
2385by this procedure.
780ee65e
NJ
2386The following examples assume that the implementation's
2387standard case is lower case:
780ee65e 2388@lisp
ae9f3a15
MG
2389(symbol->string 'flying-fish) @result{} "flying-fish"
2390(symbol->string 'Martin) @result{} "martin"
38a93523 2391(symbol->string
780ee65e
NJ
2392 (string->symbol "Malvina")) @result{} "Malvina"
2393@end lisp
38a93523
NJ
2394@end deffn
2395
f4f2b29a
MG
2396@node Symbol Tables
2397@subsection Symbol Tables
2398
2399@c FIXME::martin: Review me!
2400
2401@c FIXME::martin: Are all these procedures still relevant?
2402
2403Guile symbol tables are hash tables. Each hash table, also called an
2404@dfn{obarray} (for `object array'), is a vector of association lists.
2405Each entry in the alists is a pair (@var{SYMBOL} . @var{VALUE}). To
2406@dfn{intern} a symbol in a symbol table means to return its
2407(@var{SYMBOL} . @var{VALUE}) pair, adding a new entry to the symbol
2408table (with an undefined value) if none is yet present.
2409
2410@c FIXME::martin: According to NEWS, removed. Remove here too, or
2411@c leave for compatibility?
2412@c @c docstring begin (texi-doc-string "guile" "builtin-bindings")
2413@c @deffn primitive builtin-bindings
2414@c Create and return a copy of the global symbol table, removing all
2415@c unbound symbols.
2416@c @end deffn
2417
2418@deffn primitive gensym [prefix]
2419Create a new symbol with a name constructed from a prefix and
2420a counter value. The string @var{prefix} can be specified as
2421an optional argument. Default prefix is @code{g}. The counter
2422is increased by 1 at each call. There is no provision for
2423resetting the counter.
2424@end deffn
2425
2426@deffn primitive gentemp [prefix [obarray]]
2427Create a new symbol with a name unique in an obarray.
2428The name is constructed from an optional string @var{prefix}
2429and a counter value. The default prefix is @code{t}. The
2430@var{obarray} is specified as a second optional argument.
2431Default is the system obarray where all normal symbols are
2432interned. The counter is increased by 1 at each
2433call. There is no provision for resetting the counter.
2434@end deffn
2435
2436@deffn primitive intern-symbol obarray string
2437Add a new symbol to @var{obarray} with name @var{string}, bound to an
2438unspecified initial value. The symbol table is not modified if a symbol
2439with this name is already present.
2440@end deffn
2441
2442@deffn primitive string->obarray-symbol obarray string [soft?]
2443Intern a new symbol in @var{obarray}, a symbol table, with name
2444@var{string}.
2445@end deffn
2446
38a93523
NJ
2447@deffn primitive symbol-binding obarray string
2448Look up in @var{obarray} the symbol whose name is @var{string}, and
2449return the value to which it is bound. If @var{obarray} is @code{#f},
2450use the global symbol table. If @var{string} is not interned in
2451@var{obarray}, an error is signalled.
2452@end deffn
2453
38a93523 2454@deffn primitive symbol-bound? obarray string
780ee65e 2455Return @code{#t} if @var{obarray} contains a symbol with name
38a93523 2456@var{string} bound to a defined value. This differs from
780ee65e
NJ
2457@var{symbol-interned?} in that the mere mention of a symbol
2458usually causes it to be interned; @code{symbol-bound?}
2459determines whether a symbol has been given any meaningful
2460value.
38a93523
NJ
2461@end deffn
2462
38a93523
NJ
2463@deffn primitive symbol-fref symbol
2464Return the contents of @var{symbol}'s @dfn{function slot}.
2465@end deffn
2466
38a93523
NJ
2467@deffn primitive symbol-fset! symbol value
2468Change the binding of @var{symbol}'s function slot.
2469@end deffn
2470
38a93523
NJ
2471@deffn primitive symbol-hash symbol
2472Return a hash value for @var{symbol}.
2473@end deffn
2474
38a93523 2475@deffn primitive symbol-interned? obarray string
780ee65e
NJ
2476Return @code{#t} if @var{obarray} contains a symbol with name
2477@var{string}, and @code{#f} otherwise.
38a93523
NJ
2478@end deffn
2479
38a93523
NJ
2480@deffn primitive symbol-pref symbol
2481Return the @dfn{property list} currently associated with @var{symbol}.
2482@end deffn
2483
38a93523
NJ
2484@deffn primitive symbol-pset! symbol value
2485Change the binding of @var{symbol}'s property slot.
2486@end deffn
2487
38a93523
NJ
2488@deffn primitive symbol-set! obarray string value
2489Find the symbol in @var{obarray} whose name is @var{string}, and rebind
2490it to @var{value}. An error is signalled if @var{string} is not present
2491in @var{obarray}.
2492@end deffn
2493
38a93523
NJ
2494@deffn primitive unintern-symbol obarray string
2495Remove the symbol with name @var{string} from @var{obarray}. This
2496function returns @code{#t} if the symbol was present and @code{#f}
2497otherwise.
2498@end deffn
2499
f4f2b29a
MG
2500@node Variables
2501@subsection Variables
2502
2503@c FIXME::martin: Review me!
2504
2505Variables are objects with two fields. They contain a value and they
2506can contain a symbol, which is the name of the variable. A variable is
2507said to be bound if it does not contain the object denoting unbound
2508variables in the value slot.
2509
2510Variables do not have a read syntax, they have to be created by calling
2511one of the constructor procedures @code{make-variable} or
2512@code{make-undefined-variable} or retrieved by @code{builtin-variable}.
2513
2514First--class variables are especially useful for interacting with the
2515current module system (REFFIXME).
2516
38a93523
NJ
2517@deffn primitive builtin-variable name
2518Return the built-in variable with the name @var{name}.
2519@var{name} must be a symbol (not a string).
2520Then use @code{variable-ref} to access its value.
2521@end deffn
2522
38a93523
NJ
2523@deffn primitive make-undefined-variable [name-hint]
2524Return a variable object initialized to an undefined value.
2525If given, uses @var{name-hint} as its internal (debugging)
2526name, otherwise just treat it as an anonymous variable.
2527Remember, of course, that multiple bindings to the same
2528variable may exist, so @var{name-hint} is just that---a hint.
2529@end deffn
2530
38a93523
NJ
2531@deffn primitive make-variable init [name-hint]
2532Return a variable object initialized to value @var{init}.
2533If given, uses @var{name-hint} as its internal (debugging)
2534name, otherwise just treat it as an anonymous variable.
2535Remember, of course, that multiple bindings to the same
2536variable may exist, so @var{name-hint} is just that---a hint.
2537@end deffn
2538
38a93523
NJ
2539@deffn primitive variable-bound? var
2540Return @code{#t} iff @var{var} is bound to a value.
2541Throws an error if @var{var} is not a variable object.
2542@end deffn
2543
38a93523
NJ
2544@deffn primitive variable-ref var
2545Dereference @var{var} and return its value.
2546@var{var} must be a variable object; see @code{make-variable}
2547and @code{make-undefined-variable}.
2548@end deffn
2549
38a93523
NJ
2550@deffn primitive variable-set! var val
2551Set the value of the variable @var{var} to @var{val}.
2552@var{var} must be a variable object, @var{val} can be any
2553value. Return an unspecified value.
2554@end deffn
2555
38a93523
NJ
2556@deffn primitive variable? obj
2557Return @code{#t} iff @var{obj} is a variable object, else
2558return @code{#f}
2559@end deffn
2560
2561
2562@node Keywords
2563@section Keywords
2564
2565Keywords are self-evaluating objects with a convenient read syntax that
2566makes them easy to type.
2567
8c34cf5b 2568Guile's keyword support conforms to R5RS, and adds a (switchable) read
38a93523
NJ
2569syntax extension to permit keywords to begin with @code{:} as well as
2570@code{#:}.
2571
2572@menu
5c4b24e1
MG
2573* Why Use Keywords?:: Motivation for keyword usage.
2574* Coding With Keywords:: How to use keywords.
2575* Keyword Read Syntax:: Read syntax for keywords.
2576* Keyword Primitives:: Procedures for dealing with keywords.
38a93523
NJ
2577@end menu
2578
2579@node Why Use Keywords?
2580@subsection Why Use Keywords?
2581
2582Keywords are useful in contexts where a program or procedure wants to be
2583able to accept a large number of optional arguments without making its
2584interface unmanageable.
2585
2586To illustrate this, consider a hypothetical @code{make-window}
2587procedure, which creates a new window on the screen for drawing into
2588using some graphical toolkit. There are many parameters that the caller
2589might like to specify, but which could also be sensibly defaulted, for
2590example:
2591
2592@itemize @bullet
2593@item
2594colour depth -- Default: the colour depth for the screen
2595
2596@item
2597background colour -- Default: white
2598
2599@item
2600width -- Default: 600
2601
2602@item
2603height -- Default: 400
2604@end itemize
2605
2606If @code{make-window} did not use keywords, the caller would have to
2607pass in a value for each possible argument, remembering the correct
2608argument order and using a special value to indicate the default value
2609for that argument:
2610
2611@lisp
2612(make-window 'default ;; Colour depth
2613 'default ;; Background colour
2614 800 ;; Width
2615 100 ;; Height
2616 @dots{}) ;; More make-window arguments
2617@end lisp
2618
2619With keywords, on the other hand, defaulted arguments are omitted, and
2620non-default arguments are clearly tagged by the appropriate keyword. As
2621a result, the invocation becomes much clearer:
2622
2623@lisp
2624(make-window #:width 800 #:height 100)
2625@end lisp
2626
2627On the other hand, for a simpler procedure with few arguments, the use
2628of keywords would be a hindrance rather than a help. The primitive
2629procedure @code{cons}, for example, would not be improved if it had to
2630be invoked as
2631
2632@lisp
2633(cons #:car x #:cdr y)
2634@end lisp
2635
2636So the decision whether to use keywords or not is purely pragmatic: use
2637them if they will clarify the procedure invocation at point of call.
2638
2639@node Coding With Keywords
2640@subsection Coding With Keywords
2641
2642If a procedure wants to support keywords, it should take a rest argument
2643and then use whatever means is convenient to extract keywords and their
2644corresponding arguments from the contents of that rest argument.
2645
2646The following example illustrates the principle: the code for
2647@code{make-window} uses a helper procedure called
2648@code{get-keyword-value} to extract individual keyword arguments from
2649the rest argument.
2650
2651@lisp
2652(define (get-keyword-value args keyword default)
2653 (let ((kv (memq keyword args)))
2654 (if (and kv (>= (length kv) 2))
2655 (cadr kv)
2656 default)))
2657
2658(define (make-window . args)
2659 (let ((depth (get-keyword-value args #:depth screen-depth))
2660 (bg (get-keyword-value args #:bg "white"))
2661 (width (get-keyword-value args #:width 800))
2662 (height (get-keyword-value args #:height 100))
2663 @dots{})
2664 @dots{}))
2665@end lisp
2666
2667But you don't need to write @code{get-keyword-value}. The @code{(ice-9
2668optargs)} module provides a set of powerful macros that you can use to
2669implement keyword-supporting procedures like this:
2670
2671@lisp
2672(use-modules (ice-9 optargs))
2673
2674(define (make-window . args)
2675 (let-keywords args #f ((depth screen-depth)
2676 (bg "white")
2677 (width 800)
2678 (height 100))
2679 ...))
2680@end lisp
2681
2682@noindent
2683Or, even more economically, like this:
2684
2685@lisp
2686(use-modules (ice-9 optargs))
2687
2688(define* (make-window #:key (depth screen-depth)
2689 (bg "white")
2690 (width 800)
2691 (height 100))
2692 ...)
2693@end lisp
2694
2695For further details on @code{let-keywords}, @code{define*} and other
2696facilities provided by the @code{(ice-9 optargs)} module, @ref{Optional
2697Arguments}.
2698
2699
2700@node Keyword Read Syntax
2701@subsection Keyword Read Syntax
2702
2703Guile, by default, only recognizes the keyword syntax specified by R5RS.
2704A token of the form @code{#:NAME}, where @code{NAME} has the same syntax
2705as a Scheme symbol, is the external representation of the keyword named
2706@code{NAME}. Keyword objects print using this syntax as well, so values
2707containing keyword objects can be read back into Guile. When used in an
2708expression, keywords are self-quoting objects.
2709
2710If the @code{keyword} read option is set to @code{'prefix}, Guile also
2711recognizes the alternative read syntax @code{:NAME}. Otherwise, tokens
8c34cf5b 2712of the form @code{:NAME} are read as symbols, as required by R5RS.
38a93523 2713
8c34cf5b 2714To enable and disable the alternative non-R5RS keyword syntax, you use
38a93523
NJ
2715the @code{read-options} procedure documented in @ref{General option
2716interface} and @ref{Reader options}.
2717
2718@smalllisp
2719(read-set! keywords 'prefix)
2720
2721#:type
2722@result{}
2723#:type
2724
2725:type
2726@result{}
2727#:type
2728
2729(read-set! keywords #f)
2730
2731#:type
2732@result{}
2733#:type
2734
2735:type
2736@result{}
2737ERROR: In expression :type:
2738ERROR: Unbound variable: :type
2739ABORT: (unbound-variable)
2740@end smalllisp
2741
2742@node Keyword Primitives
2743@subsection Keyword Primitives
2744
2745Internally, a keyword is implemented as something like a tagged symbol,
2746where the tag identifies the keyword as being self-evaluating, and the
2747symbol, known as the keyword's @dfn{dash symbol} has the same name as
2748the keyword name but prefixed by a single dash. For example, the
2749keyword @code{#:name} has the corresponding dash symbol @code{-name}.
2750
2751Most keyword objects are constructed automatically by the reader when it
2752reads a token beginning with @code{#:}. However, if you need to
2753construct a keyword object programmatically, you can do so by calling
2754@code{make-keyword-from-dash-symbol} with the corresponding dash symbol
2755(as the reader does). The dash symbol for a keyword object can be
2756retrieved using the @code{keyword-dash-symbol} procedure.
2757
38a93523
NJ
2758@deffn primitive make-keyword-from-dash-symbol symbol
2759Make a keyword object from a @var{symbol} that starts with a dash.
2760@end deffn
2761
38a93523 2762@deffn primitive keyword? obj
ae9f3a15
MG
2763Return @code{#t} if the argument @var{obj} is a keyword, else
2764@code{#f}.
38a93523
NJ
2765@end deffn
2766
38a93523
NJ
2767@deffn primitive keyword-dash-symbol keyword
2768Return the dash symbol for @var{keyword}.
2769This is the inverse of @code{make-keyword-from-dash-symbol}.
2770@end deffn
2771
2772
2773@node Pairs
2774@section Pairs
5c4b24e1
MG
2775
2776@c FIXME::martin: Review me!
2777
2778Pairs are used to combine two Scheme objects into one compound object.
2779Hence the name: A pair stores a pair of objects.
2780
2781The data type @emph{pair} is extremely important in Scheme, just like in
2782any other Lisp dialect. The reason is that pairs are not only used to
2783make two values available as one object, but that pairs are used for
2784constructing lists of values. Because lists are so important in Scheme,
2785they are described in a section of their own (@pxref{Lists}).
2786
2787Pairs can literally get entered in source code or at the REPL, in the
2788so-called @dfn{dotted list} syntax. This syntax consists of an opening
2789parentheses, the first element of the pair, a dot, the second element
2790and a closing parentheses. The following example shows how a pair
2791consisting of the two numbers 1 and 2, and a pair containing the symbols
2792@code{foo} and @code{bar} can be entered. It is very important to write
2793the whitespace before and after the dot, because otherwise the Scheme
2794parser whould not be able to figure out where to split the tokens.
2795
2796@lisp
2797(1 . 2)
2798(foo . bar)
2799@end lisp
2800
2801But beware, if you want to try out these examples, you have to
2802@dfn{quote} the expressions. More information about quotation is
2803available in the section (REFFIXME). The correct way to try these
2804examples is as follows.
2805
2806@lisp
2807'(1 . 2)
2808@result{}
2809(1 . 2)
2810'(foo . bar)
2811@result{}
2812(foo . bar)
2813@end lisp
2814
2815A new pair is made by calling the procedure @code{cons} with two
2816arguments. Then the argument values are stored into a newly allocated
2817pair, and the pair is returned. The name @code{cons} stands for
2818@emph{construct}. Use the procedure @code{pair?} to test whether a
2819given Scheme object is a pair or not.
2820
2821@rnindex cons
38a93523 2822@deffn primitive cons x y
ae9f3a15
MG
2823Return a newly allocated pair whose car is @var{x} and whose
2824cdr is @var{y}. The pair is guaranteed to be different (in the
2825sense of @code{eq?}) from every previously existing object.
38a93523
NJ
2826@end deffn
2827
5c4b24e1 2828@rnindex pair?
38a93523 2829@deffn primitive pair? x
ae9f3a15
MG
2830Return @code{#t} if @var{x} is a pair; otherwise return
2831@code{#f}.
38a93523
NJ
2832@end deffn
2833
5c4b24e1
MG
2834The two parts of a pair are traditionally called @emph{car} and
2835@emph{cdr}. They can be retrieved with procedures of the same name
2836(@code{car} and @code{cdr}), and can be modified with the procedures
2837@code{set-car!} and @code{set-cdr!}. Since a very common operation in
2838Scheme programs is to access the car of a pair, or the car of the cdr of
2839a pair, etc., the procedures called @code{caar}, @code{cadr} and so on
2840are also predefined.
2841
2842@rnindex car
2843@rnindex cdr
fcaedf99
MG
2844@deffn primitive car pair
2845@deffnx primitive cdr pair
2846Return the car or the cdr of @var{pair}, respectively.
2847@end deffn
2848
2849@deffn primitive caar pair
2850@deffnx primitive cadr pair @dots{}
2851@deffnx primitive cdddar pair
2852@deffnx primitive cddddr pair
2853These procedures are compositions of @code{car} and @code{cdr}, where
2854for example @code{caddr} could be defined by
2855
2856@lisp
2857(define caddr (lambda (x) (car (cdr (cdr x)))))
2858@end lisp
2859@end deffn
2860
5c4b24e1 2861@rnindex set-car!
38a93523
NJ
2862@deffn primitive set-car! pair value
2863Stores @var{value} in the car field of @var{pair}. The value returned
2864by @code{set-car!} is unspecified.
2865@end deffn
2866
5c4b24e1 2867@rnindex set-cdr!
38a93523
NJ
2868@deffn primitive set-cdr! pair value
2869Stores @var{value} in the cdr field of @var{pair}. The value returned
2870by @code{set-cdr!} is unspecified.
2871@end deffn
2872
2873
2874@node Lists
2875@section Lists
fcaedf99 2876
f4f2b29a
MG
2877@c FIXME::martin: Review me!
2878
2879A very important data type in Scheme---as well as in all other Lisp
5c4b24e1
MG
2880dialects---is the data type @dfn{list}.@footnote{Strictly speaking,
2881Scheme does not have a real datatype @emph{list}. Lists are made up of
f4f2b29a 2882chained @emph{pairs}, and only exist by definition---a list is a chain
5c4b24e1
MG
2883of pairs which looks like a list.}
2884
2885This is the short definition of what a list is:
2886
2887@itemize @bullet
239d2912
MG
2888@item
2889Either the empty list @code{()},
2890
2891@item
2892or a pair which has a list in its cdr.
5c4b24e1
MG
2893@end itemize
2894
2895@c FIXME::martin: Describe the pair chaining in more detail.
2896
2897@c FIXME::martin: What is a proper, what an improper list?
2898@c What is a circular list?
2899
2900@c FIXME::martin: Maybe steal some graphics from the Elisp reference
2901@c manual?
2902
2903@menu
2904* List Syntax:: Writing literal lists.
2905* List Predicates:: Testing lists.
2906* List Constructors:: Creating new lists.
2907* List Selection:: Selecting from lists, getting their length.
2908* Append/Reverse:: Appending and reversing lists.
2909* List Modifification:: Modifying list structure.
2910* List Searching:: Searching for list elements
2911* List Mapping:: Applying procedures to lists.
2912@end menu
2913
2914@node List Syntax
2915@subsection List Read Syntax
2916
f4f2b29a
MG
2917@c FIXME::martin: Review me!
2918
5c4b24e1
MG
2919The syntax for lists is an opening parentheses, then all the elements of
2920the list (separated by whitespace) and finally a closing
2921parentheses.@footnote{Note that there is no separation character between
2922the list elements, like a comma or a semicolon.}.
2923
2924@lisp
2925(1 2 3) ; @r{a list of the numbers 1, 2 and 3}
2926("foo" bar 3.1415) ; @r{a string, a symbol and a real number}
2927() ; @r{the empty list}
2928@end lisp
2929
2930The last example needs a bit more explanation. A list with no elements,
2931called the @dfn{empty list}, is special in some ways. It is used for
2932terminating lists by storing it into the cdr of the last pair that makes
2933up a list. An example will clear that up:
38a93523 2934
5c4b24e1
MG
2935@lisp
2936(car '(1))
2937@result{}
29381
2939(cdr '(1))
2940@result{}
2941()
2942@end lisp
2943
2944This example also shows that lists have to be quoted (REFFIXME) when
2945written, because they would otherwise be mistakingly taken as procedure
2946applications (REFFIXME).
2947
2948
2949@node List Predicates
2950@subsection List Predicates
2951
f4f2b29a
MG
2952@c FIXME::martin: Review me!
2953
5c4b24e1
MG
2954Often it is useful to test whether a given Scheme object is a list or
2955not. List--processing procedures could use this information to test
2956whether their input is valid, or they could do different things
2957depending on the datatype of their arguments.
2958
2959@rnindex list?
5c4b24e1
MG
2960@deffn primitive list? x
2961Return @code{#t} iff @var{x} is a proper list, else @code{#f}.
2962@end deffn
2963
2964The predicate @code{null?} is often used in list--processing code to
2965tell whether a given list has run out of elements. That is, a loop
2966somehow deals with the elements of a list until the list satisfies
2967@code{null?}. Then, teh algorithm terminates.
2968
2969@rnindex null?
5c4b24e1
MG
2970@deffn primitive null? x
2971Return @code{#t} iff @var{x} is the empty list, else @code{#f}.
2972@end deffn
2973
2974@node List Constructors
2975@subsection List Constructors
2976
2977This section describes the procedures for constructing new lists.
2978@code{list} simply returns a list where the elements are the arguments,
2979@code{cons*} is similar, but the last argument is stored in the cdr of
2980the last pair of the list.
2981
2982@rnindex list
5c4b24e1 2983@deffn primitive list arg1 @dots{}
780ee65e
NJ
2984Return a list containing @var{objs}, the arguments to
2985@code{list}.
38a93523
NJ
2986@end deffn
2987
5c4b24e1 2988@deffn primitive cons* arg1 arg2 @dots{}
780ee65e
NJ
2989Like @code{list}, but the last arg provides the tail of the
2990constructed list, returning @code{(cons @var{arg1} (cons
8d009ee4 2991@var{arg2} (cons @dots{} @var{argn})))}. Requires at least one
780ee65e
NJ
2992argument. If given one argument, that argument is returned as
2993result. This function is called @code{list*} in some other
2994Schemes and in Common LISP.
38a93523
NJ
2995@end deffn
2996
5c4b24e1
MG
2997@deffn primitive list-copy lst
2998Return a (newly-created) copy of @var{lst}.
38a93523
NJ
2999@end deffn
3000
5c4b24e1
MG
3001Note that @code{list-copy} only makes a copy of the pairs which make up
3002the spine of the lists. The list elements are not copied, which means
3003that modifying the elements of the new list also modyfies the elements
3004of the old list. On the other hand, applying procedures like
3005@code{set-cdr!} or @code{delv!} to the new list will not alter the old
3006list. If you also need to copy the list elements (making a deep copy),
3007use the procedure @code{copy-tree} (REFFIXME).
38a93523 3008
5c4b24e1
MG
3009@node List Selection
3010@subsection List Selection
3011
f4f2b29a
MG
3012@c FIXME::martin: Review me!
3013
5c4b24e1
MG
3014These procedures are used to get some information about a list, or to
3015retrieve one or more elements of a list.
3016
3017@rnindex length
38a93523 3018@deffn primitive length lst
780ee65e 3019Return the number of elements in list @var{lst}.
38a93523
NJ
3020@end deffn
3021
5c4b24e1
MG
3022@deffn primitive last-pair lst
3023Return a pointer to the last pair in @var{lst}, signalling an error if
3024@var{lst} is circular.
3025@end deffn
3026
3027@rnindex list-ref
5c4b24e1
MG
3028@deffn primitive list-ref list k
3029Return the @var{k}th element from @var{list}.
3030@end deffn
3031
3032@rnindex list-tail
5c4b24e1
MG
3033@deffn primitive list-tail lst k
3034@deffnx primitive list-cdr-ref lst k
3035Return the "tail" of @var{lst} beginning with its @var{k}th element.
3036The first element of the list is considered to be element 0.
3037
3038@code{list-tail} and @code{list-cdr-ref} are identical. It may help to
3039think of @code{list-cdr-ref} as accessing the @var{k}th cdr of the list,
3040or returning the results of cdring @var{k} times down @var{lst}.
3041@end deffn
3042
5c4b24e1
MG
3043@deffn primitive list-head lst k
3044Copy the first @var{k} elements from @var{lst} into a new list, and
3045return it.
3046@end deffn
3047
3048@node Append/Reverse
3049@subsection Append and Reverse
3050
f4f2b29a
MG
3051@c FIXME::martin: Review me!
3052
5c4b24e1
MG
3053@code{append} and @code{append!} are used to concatenate two or more
3054lists in order to form a new list. @code{reverse} and @code{reverse!}
3055return lists with the same elements as their arguments, but in reverse
3056order. The procedure variants with an @code{!} directly modify the
3057pairs which form the list, whereas the other procedures create new
3058pairs. This is why you should be careful when using the side--effecting
3059variants.
3060
3061@rnindex append
38a93523 3062@deffn primitive append . args
780ee65e
NJ
3063Return a list consisting of the elements the lists passed as
3064arguments.
ae9f3a15 3065@lisp
780ee65e
NJ
3066(append '(x) '(y)) @result{} (x y)
3067(append '(a) '(b c d)) @result{} (a b c d)
3068(append '(a (b)) '((c))) @result{} (a (b) (c))
ae9f3a15 3069@end lisp
780ee65e
NJ
3070The resulting list is always newly allocated, except that it
3071shares structure with the last list argument. The last
3072argument may actually be any object; an improper list results
3073if the last argument is not a proper list.
ae9f3a15 3074@lisp
780ee65e
NJ
3075(append '(a b) '(c . d)) @result{} (a b c . d)
3076(append '() 'a) @result{} a
ae9f3a15 3077@end lisp
38a93523
NJ
3078@end deffn
3079
ae9f3a15
MG
3080@deffn primitive append! . lists
3081A destructive version of @code{append} (@pxref{Pairs and
8c34cf5b 3082lists,,,r5rs, The Revised^5 Report on Scheme}). The cdr field
ae9f3a15
MG
3083of each list's final pair is changed to point to the head of
3084the next list, so no consing is performed. Return a pointer to
3085the mutated list.
38a93523
NJ
3086@end deffn
3087
5c4b24e1 3088@rnindex reverse
38a93523 3089@deffn primitive reverse lst
780ee65e
NJ
3090Return a new list that contains the elements of @var{lst} but
3091in reverse order.
38a93523
NJ
3092@end deffn
3093
3094@c NJFIXME explain new_tail
38a93523 3095@deffn primitive reverse! lst [new_tail]
8c34cf5b
NJ
3096A destructive version of @code{reverse} (@pxref{Pairs and lists,,,r5rs,
3097The Revised^5 Report on Scheme}). The cdr of each cell in @var{lst} is
38a93523
NJ
3098modified to point to the previous list element. Return a pointer to the
3099head of the reversed list.
3100
3101Caveat: because the list is modified in place, the tail of the original
3102list now becomes its head, and the head of the original list now becomes
3103the tail. Therefore, the @var{lst} symbol to which the head of the
3104original list was bound now points to the tail. To ensure that the head
3105of the modified list is not lost, it is wise to save the return value of
3106@code{reverse!}
3107@end deffn
3108
5c4b24e1
MG
3109@node List Modifification
3110@subsection List Modification
3111
f4f2b29a
MG
3112@c FIXME::martin: Review me!
3113
5c4b24e1
MG
3114The following procedures modify existing list. @code{list-set!} and
3115@code{list-cdr-set!} change which elements a list contains, the various
3116deletion procedures @code{delq}, @code{delv} etc.
38a93523 3117
38a93523
NJ
3118@deffn primitive list-set! list k val
3119Set the @var{k}th element of @var{list} to @var{val}.
3120@end deffn
3121
38a93523
NJ
3122@deffn primitive list-cdr-set! list k val
3123Set the @var{k}th cdr of @var{list} to @var{val}.
3124@end deffn
3125
38a93523 3126@deffn primitive delq item lst
780ee65e
NJ
3127Return a newly-created copy of @var{lst} with elements
3128@code{eq?} to @var{item} removed. This procedure mirrors
3129@code{memq}: @code{delq} compares elements of @var{lst} against
3130@var{item} with @code{eq?}.
38a93523
NJ
3131@end deffn
3132
38a93523 3133@deffn primitive delv item lst
780ee65e
NJ
3134Return a newly-created copy of @var{lst} with elements
3135@code{eqv?} to @var{item} removed. This procedure mirrors
3136@code{memv}: @code{delv} compares elements of @var{lst} against
3137@var{item} with @code{eqv?}.
38a93523
NJ
3138@end deffn
3139
38a93523 3140@deffn primitive delete item lst
780ee65e
NJ
3141Return a newly-created copy of @var{lst} with elements
3142@code{equal?} to @var{item} removed. This procedure mirrors
3143@code{member}: @code{delete} compares elements of @var{lst}
3144against @var{item} with @code{equal?}.
38a93523
NJ
3145@end deffn
3146
38a93523
NJ
3147@deffn primitive delq! item lst
3148@deffnx primitive delv! item lst
3149@deffnx primitive delete! item lst
3150These procedures are destructive versions of @code{delq}, @code{delv}
3151and @code{delete}: they modify the pointers in the existing @var{lst}
3152rather than creating a new list. Caveat evaluator: Like other
3153destructive list functions, these functions cannot modify the binding of
3154@var{lst}, and so cannot be used to delete the first element of
3155@var{lst} destructively.
3156@end deffn
3157
38a93523 3158@deffn primitive delq1! item lst
780ee65e
NJ
3159Like @code{delq!}, but only deletes the first occurrence of
3160@var{item} from @var{lst}. Tests for equality using
3161@code{eq?}. See also @code{delv1!} and @code{delete1!}.
38a93523
NJ
3162@end deffn
3163
38a93523 3164@deffn primitive delv1! item lst
780ee65e
NJ
3165Like @code{delv!}, but only deletes the first occurrence of
3166@var{item} from @var{lst}. Tests for equality using
3167@code{eqv?}. See also @code{delq1!} and @code{delete1!}.
38a93523
NJ
3168@end deffn
3169
38a93523 3170@deffn primitive delete1! item lst
780ee65e
NJ
3171Like @code{delete!}, but only deletes the first occurrence of
3172@var{item} from @var{lst}. Tests for equality using
3173@code{equal?}. See also @code{delq1!} and @code{delv1!}.
38a93523
NJ
3174@end deffn
3175
5c4b24e1
MG
3176@node List Searching
3177@subsection List Searching
3178
f4f2b29a
MG
3179@c FIXME::martin: Review me!
3180
5c4b24e1
MG
3181The following procedures search lists for particular elements. They use
3182different comparison predicates for comparing list elements with the
3183object to be seached. When they fail, they return @code{#f}, otherwise
3184they return the sublist whose car is equal to the search object, where
3185equality depends on the equality predicate used.
3186
3187@rnindex memq
5c4b24e1
MG
3188@deffn primitive memq x lst
3189Return the first sublist of @var{lst} whose car is @code{eq?}
3190to @var{x} where the sublists of @var{lst} are the non-empty
3191lists returned by @code{(list-tail @var{lst} @var{k})} for
3192@var{k} less than the length of @var{lst}. If @var{x} does not
3193occur in @var{lst}, then @code{#f} (not the empty list) is
3194returned.
3195@end deffn
3196
3197@rnindex memv
5c4b24e1
MG
3198@deffn primitive memv x lst
3199Return the first sublist of @var{lst} whose car is @code{eqv?}
3200to @var{x} where the sublists of @var{lst} are the non-empty
3201lists returned by @code{(list-tail @var{lst} @var{k})} for
3202@var{k} less than the length of @var{lst}. If @var{x} does not
3203occur in @var{lst}, then @code{#f} (not the empty list) is
3204returned.
3205@end deffn
3206
3207@rnindex member
5c4b24e1
MG
3208@deffn primitive member x lst
3209Return the first sublist of @var{lst} whose car is
3210@code{equal?} to @var{x} where the sublists of @var{lst} are
3211the non-empty lists returned by @code{(list-tail @var{lst}
3212@var{k})} for @var{k} less than the length of @var{lst}. If
3213@var{x} does not occur in @var{lst}, then @code{#f} (not the
3214empty list) is returned.
3215@end deffn
3216
38a93523
NJ
3217[FIXME: is there any reason to have the `sloppy' functions available at
3218high level at all? Maybe these docs should be relegated to a "Guile
3219Internals" node or something. -twp]
3220
38a93523
NJ
3221@deffn primitive sloppy-memq x lst
3222This procedure behaves like @code{memq}, but does no type or error checking.
3223Its use is recommended only in writing Guile internals,
3224not for high-level Scheme programs.
3225@end deffn
3226
38a93523
NJ
3227@deffn primitive sloppy-memv x lst
3228This procedure behaves like @code{memv}, but does no type or error checking.
3229Its use is recommended only in writing Guile internals,
3230not for high-level Scheme programs.
3231@end deffn
3232
38a93523
NJ
3233@deffn primitive sloppy-member x lst
3234This procedure behaves like @code{member}, but does no type or error checking.
3235Its use is recommended only in writing Guile internals,
3236not for high-level Scheme programs.
3237@end deffn
3238
5c4b24e1
MG
3239@node List Mapping
3240@subsection List Mapping
3241
f4f2b29a
MG
3242@c FIXME::martin: Review me!
3243
5c4b24e1
MG
3244List processing is very convenient in Scheme because the process of
3245iterating over the elements of a list can be highly abstracted. The
3246procedures in this section are the most basic iterating procedures for
3247lists. They take a procedure and one or more lists as arguments, and
3248apply the procedure to each element of the list. They differ in what
3249the result of the invocation is.
3250
3251@rnindex map
38a93523 3252@c begin (texi-doc-string "guile" "map")
5c4b24e1
MG
3253@deffn primitive map proc arg1 arg2 @dots{}
3254@deffnx primitive map-in-order proc arg1 arg2 @dots{}
3255Apply @var{proc} to each element of the list @var{arg1} (if only two
3256arguments are given), or to the corresponding elements of the argument
3257lists (if more than two arguments are given). The result(s) of the
3258procedure applications are saved and returned in a list. For
3259@code{map}, the order of procedure applications is not specified,
3260@code{map-in-order} applies the procedure from left to right to the list
3261elements.
3262@end deffn
3263
3264@rnindex for-each
38a93523 3265@c begin (texi-doc-string "guile" "for-each")
5c4b24e1
MG
3266@deffn primitive for-each proc arg1 arg2 @dots{}
3267Like @code{map}, but the procedure is always applied from left to right,
3268and the result(s) of the procedure applications are thrown away. The
3269return value is not specified.
38a93523
NJ
3270@end deffn
3271
3272
3273@node Records
3274@section Records
3275
3276[FIXME: this is pasted in from Tom Lord's original guile.texi and should
3277be reviewed]
3278
3279A @dfn{record type} is a first class object representing a user-defined
3280data type. A @dfn{record} is an instance of a record type.
3281
3282@deffn procedure record? obj
3283Returns @code{#t} if @var{obj} is a record of any type and @code{#f}
3284otherwise.
3285
3286Note that @code{record?} may be true of any Scheme value; there is no
3287promise that records are disjoint with other Scheme types.
3288@end deffn
3289
3290@deffn procedure make-record-type type-name field-names
3291Returns a @dfn{record-type descriptor}, a value representing a new data
3292type disjoint from all others. The @var{type-name} argument must be a
3293string, but is only used for debugging purposes (such as the printed
3294representation of a record of the new type). The @var{field-names}
3295argument is a list of symbols naming the @dfn{fields} of a record of the
3296new type. It is an error if the list contains any duplicates. It is
3297unspecified how record-type descriptors are represented.@refill
3298@end deffn
3299
3300@deffn procedure record-constructor rtd [field-names]
3301Returns a procedure for constructing new members of the type represented
3302by @var{rtd}. The returned procedure accepts exactly as many arguments
3303as there are symbols in the given list, @var{field-names}; these are
3304used, in order, as the initial values of those fields in a new record,
3305which is returned by the constructor procedure. The values of any
3306fields not named in that list are unspecified. The @var{field-names}
3307argument defaults to the list of field names in the call to
3308@code{make-record-type} that created the type represented by @var{rtd};
3309if the @var{field-names} argument is provided, it is an error if it
3310contains any duplicates or any symbols not in the default list.@refill
3311@end deffn
3312
3313@deffn procedure record-predicate rtd
3314Returns a procedure for testing membership in the type represented by
3315@var{rtd}. The returned procedure accepts exactly one argument and
3316returns a true value if the argument is a member of the indicated record
3317type; it returns a false value otherwise.@refill
3318@end deffn
3319
3320@deffn procedure record-accessor rtd field-name
3321Returns a procedure for reading the value of a particular field of a
3322member of the type represented by @var{rtd}. The returned procedure
3323accepts exactly one argument which must be a record of the appropriate
3324type; it returns the current value of the field named by the symbol
3325@var{field-name} in that record. The symbol @var{field-name} must be a
3326member of the list of field-names in the call to @code{make-record-type}
3327that created the type represented by @var{rtd}.@refill
3328@end deffn
3329
3330@deffn procedure record-modifier rtd field-name
3331Returns a procedure for writing the value of a particular field of a
3332member of the type represented by @var{rtd}. The returned procedure
3333accepts exactly two arguments: first, a record of the appropriate type,
3334and second, an arbitrary Scheme value; it modifies the field named by
3335the symbol @var{field-name} in that record to contain the given value.
3336The returned value of the modifier procedure is unspecified. The symbol
3337@var{field-name} must be a member of the list of field-names in the call
3338to @code{make-record-type} that created the type represented by
3339@var{rtd}.@refill
3340@end deffn
3341
3342@deffn procedure record-type-descriptor record
3343Returns a record-type descriptor representing the type of the given
3344record. That is, for example, if the returned descriptor were passed to
3345@code{record-predicate}, the resulting predicate would return a true
3346value when passed the given record. Note that it is not necessarily the
3347case that the returned descriptor is the one that was passed to
3348@code{record-constructor} in the call that created the constructor
3349procedure that created the given record.@refill
3350@end deffn
3351
3352@deffn procedure record-type-name rtd
3353Returns the type-name associated with the type represented by rtd. The
3354returned value is @code{eqv?} to the @var{type-name} argument given in
3355the call to @code{make-record-type} that created the type represented by
3356@var{rtd}.@refill
3357@end deffn
3358
3359@deffn procedure record-type-fields rtd
3360Returns a list of the symbols naming the fields in members of the type
3361represented by @var{rtd}. The returned value is @code{equal?} to the
3362field-names argument given in the call to @code{make-record-type} that
3363created the type represented by @var{rtd}.@refill
3364@end deffn
3365
3366
3367@node Structures
3368@section Structures
3369
3370[FIXME: this is pasted in from Tom Lord's original guile.texi and should
3371be reviewed]
3372
3373A @dfn{structure type} is a first class user-defined data type. A
3374@dfn{structure} is an instance of a structure type. A structure type is
3375itself a structure.
3376
3377Structures are less abstract and more general than traditional records.
3378In fact, in Guile Scheme, records are implemented using structures.
3379
3380@menu
3381* Structure Concepts:: The structure of Structures
3382* Structure Layout:: Defining the layout of structure types
3383* Structure Basics:: make-, -ref and -set! procedures for structs
3384* Vtables:: Accessing type-specific data
3385@end menu
3386
3387@node Structure Concepts
3388@subsection Structure Concepts
3389
3390A structure object consists of a handle, structure data, and a vtable.
3391The handle is a Scheme value which points to both the vtable and the
3392structure's data. Structure data is a dynamically allocated region of
3393memory, private to the structure, divided up into typed fields. A
3394vtable is another structure used to hold type-specific data. Multiple
3395structures can share a common vtable.
3396
3397Three concepts are key to understanding structures.
3398
3399@itemize @bullet{}
3400@item @dfn{layout specifications}
3401
3402Layout specifications determine how memory allocated to structures is
3403divided up into fields. Programmers must write a layout specification
3404whenever a new type of structure is defined.
3405
3406@item @dfn{structural accessors}
3407
3408Structure access is by field number. There is only one set of
3409accessors common to all structure objects.
3410
3411@item @dfn{vtables}
3412
3413Vtables, themselves structures, are first class representations of
3414disjoint sub-types of structures in general. In most cases, when a
3415new structure is created, programmers must specifiy a vtable for the
3416new structure. Each vtable has a field describing the layout of its
3417instances. Vtables can have additional, user-defined fields as well.
3418@end itemize
3419
3420
3421
3422@node Structure Layout
3423@subsection Structure Layout
3424
3425When a structure is created, a region of memory is allocated to hold its
3426state. The @dfn{layout} of the structure's type determines how that
3427memory is divided into fields.
3428
3429Each field has a specified type. There are only three types allowed, each
3430corresponding to a one letter code. The allowed types are:
3431
3432@itemize @bullet{}
3433@item 'u' -- unprotected
3434
3435The field holds binary data that is not GC protected.
3436
3437@item 'p' -- protected
3438
3439The field holds a Scheme value and is GC protected.
3440
3441@item 's' -- self
3442
3443The field holds a Scheme value and is GC protected. When a structure is
3444created with this type of field, the field is initialized to refer to
3445the structure's own handle. This kind of field is mainly useful when
3446mixing Scheme and C code in which the C code may need to compute a
3447structure's handle given only the address of its malloced data.
3448@end itemize
3449
3450
3451Each field also has an associated access protection. There are only
3452three kinds of protection, each corresponding to a one letter code.
3453The allowed protections are:
3454
3455@itemize @bullet{}
3456@item 'w' -- writable
3457
3458The field can be read and written.
3459
3460@item 'r' -- readable
3461
3462The field can be read, but not written.
3463
3464@item 'o' -- opaque
3465
3466The field can be neither read nor written. This kind
3467of protection is for fields useful only to built-in routines.
3468@end itemize
3469
3470A layout specification is described by stringing together pairs
3471of letters: one to specify a field type and one to specify a field
3472protection. For example, a traditional cons pair type object could
3473be described as:
3474
3475@example
3476; cons pairs have two writable fields of Scheme data
3477"pwpw"
3478@end example
3479
3480A pair object in which the first field is held constant could be:
3481
3482@example
3483"prpw"
3484@end example
3485
3486Binary fields, (fields of type "u"), hold one @emph{word} each. The
3487size of a word is a machine dependent value defined to be equal to the
3488value of the C expression: @code{sizeof (long)}.
3489
3490The last field of a structure layout may specify a tail array.
3491A tail array is indicated by capitalizing the field's protection
3492code ('W', 'R' or 'O'). A tail-array field is replaced by
3493a read-only binary data field containing an array size. The array
3494size is determined at the time the structure is created. It is followed
3495by a corresponding number of fields of the type specified for the
3496tail array. For example, a conventional Scheme vector can be
3497described as:
3498
3499@example
3500; A vector is an arbitrary number of writable fields holding Scheme
3501; values:
3502"pW"
3503@end example
3504
3505In the above example, field 0 contains the size of the vector and
3506fields beginning at 1 contain the vector elements.
3507
3508A kind of tagged vector (a constant tag followed by conventioal
3509vector elements) might be:
3510
3511@example
3512"prpW"
3513@end example
3514
3515
3516Structure layouts are represented by specially interned symbols whose
3517name is a string of type and protection codes. To create a new
3518structure layout, use this procedure:
3519
38a93523
NJ
3520@deffn primitive make-struct-layout fields
3521Return a new structure layout object.
3522
3523@var{fields} must be a string made up of pairs of characters
3524strung together. The first character of each pair describes a field
3525type, the second a field protection. Allowed types are 'p' for
3526GC-protected Scheme data, 'u' for unprotected binary data, and 's' for
3527a field that points to the structure itself. Allowed protections
3528are 'w' for mutable fields, 'r' for read-only fields, and 'o' for opaque
3529fields. The last field protection specification may be capitalized to
3530indicate that the field is a tail-array.
3531@end deffn
3532
3533
3534
3535@node Structure Basics
3536@subsection Structure Basics
3537
3538This section describes the basic procedures for creating and accessing
3539structures.
3540
38a93523
NJ
3541@deffn primitive make-struct vtable tail_array_size . init
3542Create a new structure.
3543
3544@var{type} must be a vtable structure (@pxref{Vtables}).
3545
3546@var{tail-elts} must be a non-negative integer. If the layout
3547specification indicated by @var{type} includes a tail-array,
3548this is the number of elements allocated to that array.
3549
3550The @var{init1}, @dots{} are optional arguments describing how
3551successive fields of the structure should be initialized. Only fields
3552with protection 'r' or 'w' can be initialized, except for fields of
3553type 's', which are automatically initialized to point to the new
3554structure itself; fields with protection 'o' can not be initialized by
3555Scheme programs.
3556
3557If fewer optional arguments than initializable fields are supplied,
3558fields of type 'p' get default value #f while fields of type 'u' are
3559initialized to 0.
3560
3561Structs are currently the basic representation for record-like data
3562structures in Guile. The plan is to eventually replace them with a
3563new representation which will at the same time be easier to use and
3564more powerful.
3565
3566For more information, see the documentation for @code{make-vtable-vtable}.
3567@end deffn
3568
38a93523 3569@deffn primitive struct? x
780ee65e
NJ
3570Return @code{#t} iff @var{obj} is a structure object, else
3571@code{#f}.
38a93523
NJ
3572@end deffn
3573
3574
38a93523
NJ
3575@deffn primitive struct-ref handle pos
3576@deffnx primitive struct-set! struct n value
3577Access (or modify) the @var{n}th field of @var{struct}.
3578
3579If the field is of type 'p', then it can be set to an arbitrary value.
3580
3581If the field is of type 'u', then it can only be set to a non-negative
3582integer value small enough to fit in one machine word.
3583@end deffn
3584
3585
3586
3587@node Vtables
3588@subsection Vtables
3589
3590Vtables are structures that are used to represent structure types. Each
3591vtable contains a layout specification in field
3592@code{vtable-index-layout} -- instances of the type are laid out
3593according to that specification. Vtables contain additional fields
3594which are used only internally to libguile. The variable
3595@code{vtable-offset-user} is bound to a field number. Vtable fields
3596at that position or greater are user definable.
3597
38a93523
NJ
3598@deffn primitive struct-vtable handle
3599Return the vtable structure that describes the type of @var{struct}.
3600@end deffn
3601
38a93523 3602@deffn primitive struct-vtable? x
780ee65e 3603Return @code{#t} iff obj is a vtable structure.
38a93523
NJ
3604@end deffn
3605
3606If you have a vtable structure, @code{V}, you can create an instance of
3607the type it describes by using @code{(make-struct V ...)}. But where
3608does @code{V} itself come from? One possibility is that @code{V} is an
3609instance of a user-defined vtable type, @code{V'}, so that @code{V} is
3610created by using @code{(make-struct V' ...)}. Another possibility is
3611that @code{V} is an instance of the type it itself describes. Vtable
3612structures of the second sort are created by this procedure:
3613
38a93523
NJ
3614@deffn primitive make-vtable-vtable user_fields tail_array_size . init
3615Return a new, self-describing vtable structure.
3616
3617@var{user-fields} is a string describing user defined fields of the
3618vtable beginning at index @code{vtable-offset-user}
3619(see @code{make-struct-layout}).
3620
3621@var{tail-size} specifies the size of the tail-array (if any) of
3622this vtable.
3623
3624@var{init1}, @dots{} are the optional initializers for the fields of
3625the vtable.
3626
3627Vtables have one initializable system field---the struct printer.
3628This field comes before the user fields in the initializers passed
3629to @code{make-vtable-vtable} and @code{make-struct}, and thus works as
3630a third optional argument to @code{make-vtable-vtable} and a fourth to
3631@code{make-struct} when creating vtables:
3632
3633If the value is a procedure, it will be called instead of the standard
3634printer whenever a struct described by this vtable is printed.
3635The procedure will be called with arguments STRUCT and PORT.
3636
3637The structure of a struct is described by a vtable, so the vtable is
3638in essence the type of the struct. The vtable is itself a struct with
3639a vtable. This could go on forever if it weren't for the
3640vtable-vtables which are self-describing vtables, and thus terminate
3641the chain.
3642
3643There are several potential ways of using structs, but the standard
3644one is to use three kinds of structs, together building up a type
3645sub-system: one vtable-vtable working as the root and one or several
3646"types", each with a set of "instances". (The vtable-vtable should be
3647compared to the class <class> which is the class of itself.)
3648
ae9f3a15 3649@lisp
38a93523
NJ
3650(define ball-root (make-vtable-vtable "pr" 0))
3651
3652(define (make-ball-type ball-color)
3653 (make-struct ball-root 0
3654 (make-struct-layout "pw")
3655 (lambda (ball port)
3656 (format port "#<a ~A ball owned by ~A>"
3657 (color ball)
3658 (owner ball)))
3659 ball-color))
3660(define (color ball) (struct-ref (struct-vtable ball) vtable-offset-user))
3661(define (owner ball) (struct-ref ball 0))
3662
3663(define red (make-ball-type 'red))
3664(define green (make-ball-type 'green))
3665
3666(define (make-ball type owner) (make-struct type 0 owner))
3667
3668(define ball (make-ball green 'Nisse))
3669ball @result{} #<a green ball owned by Nisse>
ae9f3a15 3670@end lisp
38a93523
NJ
3671@end deffn
3672
38a93523
NJ
3673@deffn primitive struct-vtable-name vtable
3674Return the name of the vtable @var{vtable}.
3675@end deffn
3676
38a93523
NJ
3677@deffn primitive set-struct-vtable-name! vtable name
3678Set the name of the vtable @var{vtable} to @var{name}.
3679@end deffn
3680
38a93523
NJ
3681@deffn primitive struct-vtable-tag handle
3682Return the vtable tag of the structure @var{handle}.
3683@end deffn
3684
3685
3686@node Arrays
3687@section Arrays
3688
3689@menu
b576faf1
MG
3690* Conventional Arrays:: Arrays with arbitrary data.
3691* Array Mapping:: Applying a procedure to the contents of an array.
3692* Uniform Arrays:: Arrays with data of a single type.
3693* Bit Vectors:: Vectors of bits.
38a93523
NJ
3694@end menu
3695
3696@node Conventional Arrays
3697@subsection Conventional Arrays
3698
3699@dfn{Conventional arrays} are a collection of cells organised into an
3700arbitrary number of dimensions. Each cell can hold any kind of Scheme
3701value and can be accessed in constant time by supplying an index for
3702each dimension. This contrasts with uniform arrays, which use memory
3703more efficiently but can hold data of only a single type, and lists
3704where inserting and deleting cells is more efficient, but more time
3705is usually required to access a particular cell.
3706
3707A conventional array is displayed as @code{#} followed by the @dfn{rank}
3708(number of dimensions) followed by the cells, organised into dimensions
3709using parentheses. The nesting depth of the parentheses is equal to
3710the rank.
3711
3712When an array is created, the number of dimensions and range of each
3713dimension must be specified, e.g., to create a 2x3 array with a
3714zero-based index:
3715
3716@example
3717(make-array 'ho 2 3) @result{}
3718#2((ho ho ho) (ho ho ho))
3719@end example
3720
3721The range of each dimension can also be given explicitly, e.g., another
3722way to create the same array:
3723
3724@example
3725(make-array 'ho '(0 1) '(0 2)) @result{}
3726#2((ho ho ho) (ho ho ho))
3727@end example
3728
3729A conventional array with one dimension based at zero is identical to
3730a vector:
3731
3732@example
3733(make-array 'ho 3) @result{}
3734#(ho ho ho)
3735@end example
3736
3737The following procedures can be used with conventional arrays (or vectors).
3738
38a93523 3739@deffn primitive array? v [prot]
ae9f3a15
MG
3740Return @code{#t} if the @var{obj} is an array, and @code{#f} if
3741not. The @var{prototype} argument is used with uniform arrays
3742and is described elsewhere.
38a93523
NJ
3743@end deffn
3744
3745@deffn procedure make-array initial-value bound1 bound2 @dots{}
3746Creates and returns an array that has as many dimensions as there are
3747@var{bound}s and fills it with @var{initial-value}.
3748@end deffn
3749
3750@c array-ref's type is `compiled-closure'. There's some weird stuff
3751@c going on in array.c, too. Let's call it a primitive. -twp
3752
38a93523
NJ
3753@deffn primitive uniform-vector-ref v args
3754@deffnx primitive array-ref v . args
ae9f3a15
MG
3755Return the element at the @code{(index1, index2)} element in
3756@var{array}.
38a93523
NJ
3757@end deffn
3758
38a93523 3759@deffn primitive array-in-bounds? v . args
ae9f3a15
MG
3760Return @code{#t} if its arguments would be acceptable to
3761@code{array-ref}.
38a93523
NJ
3762@end deffn
3763
38a93523
NJ
3764@deffn primitive array-set! v obj . args
3765@deffnx primitive uniform-array-set1! v obj args
3766Sets the element at the @code{(index1, index2)} element in @var{array} to
3767@var{new-value}. The value returned by array-set! is unspecified.
3768@end deffn
3769
38a93523
NJ
3770@deffn primitive make-shared-array oldra mapfunc . dims
3771@code{make-shared-array} can be used to create shared subarrays of other
3772arrays. The @var{mapper} is a function that translates coordinates in
3773the new array into coordinates in the old array. A @var{mapper} must be
3774linear, and its range must stay within the bounds of the old array, but
3775it can be otherwise arbitrary. A simple example:
ae9f3a15 3776@lisp
38a93523
NJ
3777(define fred (make-array #f 8 8))
3778(define freds-diagonal
3779 (make-shared-array fred (lambda (i) (list i i)) 8))
3780(array-set! freds-diagonal 'foo 3)
3781(array-ref fred 3 3) @result{} foo
3782(define freds-center
3783 (make-shared-array fred (lambda (i j) (list (+ 3 i) (+ 3 j))) 2 2))
3784(array-ref freds-center 0 0) @result{} foo
ae9f3a15 3785@end lisp
38a93523
NJ
3786@end deffn
3787
38a93523
NJ
3788@deffn primitive shared-array-increments ra
3789For each dimension, return the distance between elements in the root vector.
3790@end deffn
3791
38a93523
NJ
3792@deffn primitive shared-array-offset ra
3793Return the root vector index of the first element in the array.
3794@end deffn
3795
38a93523
NJ
3796@deffn primitive shared-array-root ra
3797Return the root vector of a shared array.
3798@end deffn
3799
38a93523 3800@deffn primitive transpose-array ra . args
ae9f3a15
MG
3801Return an array sharing contents with @var{array}, but with
3802dimensions arranged in a different order. There must be one
3803@var{dim} argument for each dimension of @var{array}.
3804@var{dim0}, @var{dim1}, @dots{} should be integers between 0
3805and the rank of the array to be returned. Each integer in that
3806range must appear at least once in the argument list.
3807The values of @var{dim0}, @var{dim1}, @dots{} correspond to
3808dimensions in the array to be returned, their positions in the
3809argument list to dimensions of @var{array}. Several @var{dim}s
3810may have the same value, in which case the returned array will
3811have smaller rank than @var{array}.
3812@lisp
38a93523
NJ
3813(transpose-array '#2((a b) (c d)) 1 0) @result{} #2((a c) (b d))
3814(transpose-array '#2((a b) (c d)) 0 0) @result{} #1(a d)
3815(transpose-array '#3(((a b c) (d e f)) ((1 2 3) (4 5 6))) 1 1 0) @result{}
3816 #2((a 4) (b 5) (c 6))
ae9f3a15 3817@end lisp
38a93523
NJ
3818@end deffn
3819
38a93523
NJ
3820@deffn primitive enclose-array ra . axes
3821@var{dim0}, @var{dim1} @dots{} should be nonnegative integers less than
3822the rank of @var{array}. @var{enclose-array} returns an array
3823resembling an array of shared arrays. The dimensions of each shared
3824array are the same as the @var{dim}th dimensions of the original array,
3825the dimensions of the outer array are the same as those of the original
3826array that did not match a @var{dim}.
3827
3828An enclosed array is not a general Scheme array. Its elements may not
3829be set using @code{array-set!}. Two references to the same element of
3830an enclosed array will be @code{equal?} but will not in general be
3831@code{eq?}. The value returned by @var{array-prototype} when given an
3832enclosed array is unspecified.
3833
3834examples:
ae9f3a15 3835@lisp
38a93523
NJ
3836(enclose-array '#3(((a b c) (d e f)) ((1 2 3) (4 5 6))) 1) @result{}
3837 #<enclosed-array (#1(a d) #1(b e) #1(c f)) (#1(1 4) #1(2 5) #1(3 6))>
3838
3839(enclose-array '#3(((a b c) (d e f)) ((1 2 3) (4 5 6))) 1 0) @result{}
3840 #<enclosed-array #2((a 1) (d 4)) #2((b 2) (e 5)) #2((c 3) (f 6))>
ae9f3a15 3841@end lisp
38a93523
NJ
3842@end deffn
3843
3844@deffn procedure array-shape array
3845Returns a list of inclusive bounds of integers.
3846@example
3847(array-shape (make-array 'foo '(-1 3) 5)) @result{} ((-1 3) (0 4))
3848@end example
3849@end deffn
3850
38a93523
NJ
3851@deffn primitive array-dimensions ra
3852@code{Array-dimensions} is similar to @code{array-shape} but replaces
3853elements with a @code{0} minimum with one greater than the maximum. So:
ae9f3a15 3854@lisp
38a93523 3855(array-dimensions (make-array 'foo '(-1 3) 5)) @result{} ((-1 3) 5)
ae9f3a15 3856@end lisp
38a93523
NJ
3857@end deffn
3858
38a93523 3859@deffn primitive array-rank ra
ae9f3a15
MG
3860Return the number of dimensions of @var{obj}. If @var{obj} is
3861not an array, @code{0} is returned.
38a93523
NJ
3862@end deffn
3863
38a93523 3864@deffn primitive array->list v
ae9f3a15
MG
3865Return a list consisting of all the elements, in order, of
3866@var{array}.
38a93523
NJ
3867@end deffn
3868
38a93523
NJ
3869@deffn primitive array-copy! src dst
3870@deffnx primitive array-copy-in-order! src dst
3871Copies every element from vector or array @var{source} to the
3872corresponding element of @var{destination}. @var{destination} must have
3873the same rank as @var{source}, and be at least as large in each
3874dimension. The order is unspecified.
3875@end deffn
3876
38a93523
NJ
3877@deffn primitive array-fill! ra fill
3878Stores @var{fill} in every element of @var{array}. The value returned
3879is unspecified.
3880@end deffn
3881
3882@c begin (texi-doc-string "guile" "array-equal?")
3883@deffn primitive array-equal? ra0 ra1
3884Returns @code{#t} iff all arguments are arrays with the same shape, the
3885same type, and have corresponding elements which are either
3886@code{equal?} or @code{array-equal?}. This function differs from
3887@code{equal?} in that a one dimensional shared array may be
3888@var{array-equal?} but not @var{equal?} to a vector or uniform vector.
3889@end deffn
3890
38a93523
NJ
3891@deffn primitive array-contents ra [strict]
3892@deffnx primitive array-contents array strict
3893If @var{array} may be @dfn{unrolled} into a one dimensional shared array
3894without changing their order (last subscript changing fastest), then
3895@code{array-contents} returns that shared array, otherwise it returns
3896@code{#f}. All arrays made by @var{make-array} and
3897@var{make-uniform-array} may be unrolled, some arrays made by
3898@var{make-shared-array} may not be.
3899
3900If the optional argument @var{strict} is provided, a shared array will
3901be returned only if its elements are stored internally contiguous in
3902memory.
3903@end deffn
3904
3905@node Array Mapping
3906@subsection Array Mapping
3907
38a93523
NJ
3908@deffn primitive array-map! ra0 proc . lra
3909@deffnx primitive array-map-in-order! ra0 proc . lra
3910@var{array1}, @dots{} must have the same number of dimensions as
3911@var{array0} and have a range for each index which includes the range
3912for the corresponding index in @var{array0}. @var{proc} is applied to
3913each tuple of elements of @var{array1} @dots{} and the result is stored
3914as the corresponding element in @var{array0}. The value returned is
3915unspecified. The order of application is unspecified.
3916@end deffn
3917
38a93523
NJ
3918@deffn primitive array-for-each proc ra0 . lra
3919@var{proc} is applied to each tuple of elements of @var{array0} @dots{}
3920in row-major order. The value returned is unspecified.
3921@end deffn
3922
38a93523
NJ
3923@deffn primitive array-index-map! ra proc
3924applies @var{proc} to the indices of each element of @var{array} in
3925turn, storing the result in the corresponding element. The value
3926returned and the order of application are unspecified.
3927
3928One can implement @var{array-indexes} as
ae9f3a15 3929@lisp
38a93523
NJ
3930(define (array-indexes array)
3931 (let ((ra (apply make-array #f (array-shape array))))
3932 (array-index-map! ra (lambda x x))
3933 ra))
ae9f3a15 3934@end lisp
38a93523 3935Another example:
ae9f3a15 3936@lisp
38a93523
NJ
3937(define (apl:index-generator n)
3938 (let ((v (make-uniform-vector n 1)))
3939 (array-index-map! v (lambda (i) i))
3940 v))
ae9f3a15 3941@end lisp
38a93523
NJ
3942@end deffn
3943
3944@node Uniform Arrays
3945@subsection Uniform Arrays
3946
3947@noindent
3948@dfn{Uniform arrays} have elements all of the
3949same type and occupy less storage than conventional
3950arrays. Uniform arrays with a single zero-based dimension
3951are also known as @dfn{uniform vectors}. The procedures in
3952this section can also be used on conventional arrays, vectors,
3953bit-vectors and strings.
3954
3955@noindent
3956When creating a uniform array, the type of data to be stored
3957is indicated with a @var{prototype} argument. The following table
3958lists the types available and example prototypes:
3959
3960@example
3961prototype type printing character
3962
3963#t boolean (bit-vector) b
3964#\a char (string) a
3965#\nul byte (integer) y
3966's short (integer) h
39671 unsigned long (integer) u
3968-1 signed long (integer) e
3969'l signed long long (integer) l
39701.0 float (single precision) s
39711/3 double (double precision float) i
39720+i complex (double precision) c
3973() conventional vector
3974@end example
3975
3976@noindent
3977Unshared uniform arrays of characters with a single zero-based dimension
3978are identical to strings:
3979
3980@example
3981(make-uniform-array #\a 3) @result{}
3982"aaa"
3983@end example
3984
3985@noindent
3986Unshared uniform arrays of booleans with a single zero-based dimension
3987are identical to @ref{Bit Vectors, bit-vectors}.
3988
3989@example
3990(make-uniform-array #t 3) @result{}
3991#*111
3992@end example
3993
3994@noindent
3995Other uniform vectors are written in a form similar to that of vectors,
3996except that a single character from the above table is put between
3997@code{#} and @code{(}. For example, a uniform vector of signed
3998long integers is displayed in the form @code{'#e(3 5 9)}.
3999
38a93523
NJ
4000@deffn primitive array? v [prot]
4001Returns @code{#t} if the @var{obj} is an array, and @code{#f} if not.
4002
4003The @var{prototype} argument is used with uniform arrays and is described
4004elsewhere.
4005@end deffn
4006
4007@deffn procedure make-uniform-array prototype bound1 bound2 @dots{}
4008Creates and returns a uniform array of type corresponding to
4009@var{prototype} that has as many dimensions as there are @var{bound}s
4010and fills it with @var{prototype}.
4011@end deffn
4012
38a93523 4013@deffn primitive array-prototype ra
ae9f3a15
MG
4014Return an object that would produce an array of the same type
4015as @var{array}, if used as the @var{prototype} for
38a93523
NJ
4016@code{make-uniform-array}.
4017@end deffn
4018
38a93523
NJ
4019@deffn primitive list->uniform-array ndim prot lst
4020@deffnx procedure list->uniform-vector prot lst
ae9f3a15
MG
4021Return a uniform array of the type indicated by prototype
4022@var{prot} with elements the same as those of @var{lst}.
4023Elements must be of the appropriate type, no coercions are
4024done.
38a93523
NJ
4025@end deffn
4026
4027@deffn primitive uniform-vector-fill! uve fill
4028Stores @var{fill} in every element of @var{uve}. The value returned is
4029unspecified.
4030@end deffn
4031
38a93523 4032@deffn primitive uniform-vector-length v
ae9f3a15 4033Return the number of elements in @var{uve}.
38a93523
NJ
4034@end deffn
4035
38a93523
NJ
4036@deffn primitive dimensions->uniform-array dims prot [fill]
4037@deffnx primitive make-uniform-vector length prototype [fill]
ae9f3a15
MG
4038Create and return a uniform array or vector of type
4039corresponding to @var{prototype} with dimensions @var{dims} or
4040length @var{length}. If @var{fill} is supplied, it's used to
4041fill the array, otherwise @var{prototype} is used.
38a93523
NJ
4042@end deffn
4043
4044@c Another compiled-closure. -twp
4045
38a93523
NJ
4046@deffn primitive uniform-array-read! ra [port_or_fd [start [end]]]
4047@deffnx primitive uniform-vector-read! uve [port-or-fdes] [start] [end]
4048Attempts to read all elements of @var{ura}, in lexicographic order, as
4049binary objects from @var{port-or-fdes}.
4050If an end of file is encountered during
4051uniform-array-read! the objects up to that point only are put into @var{ura}
4052(starting at the beginning) and the remainder of the array is
4053unchanged.
4054
4055The optional arguments @var{start} and @var{end} allow
4056a specified region of a vector (or linearized array) to be read,
4057leaving the remainder of the vector unchanged.
4058
4059@code{uniform-array-read!} returns the number of objects read.
4060@var{port-or-fdes} may be omitted, in which case it defaults to the value
4061returned by @code{(current-input-port)}.
4062@end deffn
4063
38a93523
NJ
4064@deffn primitive uniform-array-write v [port_or_fd [start [end]]]
4065@deffnx primitive uniform-vector-write uve [port-or-fdes] [start] [end]
4066Writes all elements of @var{ura} as binary objects to
4067@var{port-or-fdes}.
4068
4069The optional arguments @var{start}
4070and @var{end} allow
4071a specified region of a vector (or linearized array) to be written.
4072
4073The number of objects actually written is returned.
4074@var{port-or-fdes} may be
4075omitted, in which case it defaults to the value returned by
4076@code{(current-output-port)}.
4077@end deffn
4078
4079@node Bit Vectors
4080@subsection Bit Vectors
4081
4082@noindent
4083Bit vectors are a specific type of uniform array: an array of booleans
4084with a single zero-based index.
4085
4086@noindent
4087They are displayed as a sequence of @code{0}s and
4088@code{1}s prefixed by @code{#*}, e.g.,
4089
4090@example
4091(make-uniform-vector 8 #t #f) @result{}
4092#*00000000
4093
4094#b(#t #f #t) @result{}
4095#*101
4096@end example
4097
38a93523 4098@deffn primitive bit-count b bitvector
ae9f3a15 4099Return the number of occurrences of the boolean @var{b} in
38a93523
NJ
4100@var{bitvector}.
4101@end deffn
4102
38a93523 4103@deffn primitive bit-position item v k
ae9f3a15
MG
4104Return the minimum index of an occurrence of @var{bool} in
4105@var{bv} which is at least @var{k}. If no @var{bool} occurs
4106within the specified range @code{#f} is returned.
38a93523
NJ
4107@end deffn
4108
38a93523
NJ
4109@deffn primitive bit-invert! v
4110Modifies @var{bv} by replacing each element with its negation.
4111@end deffn
4112
38a93523
NJ
4113@deffn primitive bit-set*! v kv obj
4114If uve is a bit-vector @var{bv} and uve must be of the same
4115length. If @var{bool} is @code{#t}, uve is OR'ed into
4116@var{bv}; If @var{bool} is @code{#f}, the inversion of uve is
4117AND'ed into @var{bv}.
4118
4119If uve is a unsigned integer vector all the elements of uve
4120must be between 0 and the @code{length} of @var{bv}. The bits
4121of @var{bv} corresponding to the indexes in uve are set to
4122@var{bool}. The return value is unspecified.
4123@end deffn
4124
38a93523 4125@deffn primitive bit-count* v kv obj
ae9f3a15
MG
4126Return
4127@lisp
38a93523 4128(bit-count (bit-set*! (if bool bv (bit-invert! bv)) uve #t) #t).
ae9f3a15 4129@end lisp
38a93523
NJ
4130@var{bv} is not modified.
4131@end deffn
4132
4133
4134@node Association Lists and Hash Tables
4135@section Association Lists and Hash Tables
4136
4137This chapter discusses dictionary objects: data structures that are
4138useful for organizing and indexing large bodies of information.
4139
4140@menu
4141* Dictionary Types:: About dictionary types; what they're good for.
b576faf1
MG
4142* Association Lists::
4143* Hash Tables::
38a93523
NJ
4144@end menu
4145
4146@node Dictionary Types
4147@subsection Dictionary Types
4148
4149A @dfn{dictionary} object is a data structure used to index
4150information in a user-defined way. In standard Scheme, the main
4151aggregate data types are lists and vectors. Lists are not really
4152indexed at all, and vectors are indexed only by number
4153(e.g. @code{(vector-ref foo 5)}). Often you will find it useful
4154to index your data on some other type; for example, in a library
4155catalog you might want to look up a book by the name of its
4156author. Dictionaries are used to help you organize information in
4157such a way.
4158
4159An @dfn{association list} (or @dfn{alist} for short) is a list of
4160key-value pairs. Each pair represents a single quantity or
4161object; the @code{car} of the pair is a key which is used to
4162identify the object, and the @code{cdr} is the object's value.
4163
4164A @dfn{hash table} also permits you to index objects with
4165arbitrary keys, but in a way that makes looking up any one object
4166extremely fast. A well-designed hash system makes hash table
4167lookups almost as fast as conventional array or vector references.
4168
4169Alists are popular among Lisp programmers because they use only
4170the language's primitive operations (lists, @dfn{car}, @dfn{cdr}
4171and the equality primitives). No changes to the language core are
4172necessary. Therefore, with Scheme's built-in list manipulation
4173facilities, it is very convenient to handle data stored in an
4174association list. Also, alists are highly portable and can be
4175easily implemented on even the most minimal Lisp systems.
4176
4177However, alists are inefficient, especially for storing large
4178quantities of data. Because we want Guile to be useful for large
4179software systems as well as small ones, Guile provides a rich set
4180of tools for using either association lists or hash tables.
4181
4182@node Association Lists
4183@subsection Association Lists
4184@cindex Association List
4185@cindex Alist
4186@cindex Database
4187
4188An association list is a conventional data structure that is often used
4189to implement simple key-value databases. It consists of a list of
4190entries in which each entry is a pair. The @dfn{key} of each entry is
4191the @code{car} of the pair and the @dfn{value} of each entry is the
4192@code{cdr}.
4193
4194@example
4195ASSOCIATION LIST ::= '( (KEY1 . VALUE1)
4196 (KEY2 . VALUE2)
4197 (KEY3 . VALUE3)
4198 @dots{}
4199 )
4200@end example
4201
4202@noindent
4203Association lists are also known, for short, as @dfn{alists}.
4204
4205The structure of an association list is just one example of the infinite
4206number of possible structures that can be built using pairs and lists.
4207As such, the keys and values in an association list can be manipulated
4208using the general list structure procedures @code{cons}, @code{car},
4209@code{cdr}, @code{set-car!}, @code{set-cdr!} and so on. However,
4210because association lists are so useful, Guile also provides specific
4211procedures for manipulating them.
4212
4213@menu
b576faf1
MG
4214* Alist Key Equality::
4215* Adding or Setting Alist Entries::
4216* Retrieving Alist Entries::
4217* Removing Alist Entries::
4218* Sloppy Alist Functions::
4219* Alist Example::
38a93523
NJ
4220@end menu
4221
4222@node Alist Key Equality
4223@subsubsection Alist Key Equality
4224
4225All of Guile's dedicated association list procedures, apart from
4226@code{acons}, come in three flavours, depending on the level of equality
4227that is required to decide whether an existing key in the association
4228list is the same as the key that the procedure call uses to identify the
4229required entry.
4230
4231@itemize @bullet
4232@item
4233Procedures with @dfn{assq} in their name use @code{eq?} to determine key
4234equality.
4235
4236@item
4237Procedures with @dfn{assv} in their name use @code{eqv?} to determine
4238key equality.
4239
4240@item
4241Procedures with @dfn{assoc} in their name use @code{equal?} to
4242determine key equality.
4243@end itemize
4244
4245@code{acons} is an exception because it is used to build association
4246lists which do not require their entries' keys to be unique.
4247
4248@node Adding or Setting Alist Entries
4249@subsubsection Adding or Setting Alist Entries
38a93523
NJ
4250
4251@code{acons} adds a new entry to an association list and returns the
4252combined association list. The combined alist is formed by consing the
4253new entry onto the head of the alist specified in the @code{acons}
4254procedure call. So the specified alist is not modified, but its
4255contents become shared with the tail of the combined alist that
4256@code{acons} returns.
4257
4258In the most common usage of @code{acons}, a variable holding the
4259original association list is updated with the combined alist:
4260
4261@example
4262(set! address-list (acons name address address-list))
4263@end example
4264
4265In such cases, it doesn't matter that the old and new values of
4266@code{address-list} share some of their contents, since the old value is
4267usually no longer independently accessible.
4268
4269Note that @code{acons} adds the specified new entry regardless of
4270whether the alist may already contain entries with keys that are, in
4271some sense, the same as that of the new entry. Thus @code{acons} is
4272ideal for building alists where there is no concept of key uniqueness.
4273
4274@example
4275(set! task-list (acons 3 "pay gas bill" '()))
4276task-list
4277@result{}
4278((3 . "pay gas bill"))
4279
4280(set! task-list (acons 3 "tidy bedroom" task-list))
4281task-list
4282@result{}
4283((3 . "tidy bedroom") (3 . "pay gas bill"))
4284@end example
4285
4286@code{assq-set!}, @code{assv-set!} and @code{assoc-set!} are used to add
4287or replace an entry in an association list where there @emph{is} a
4288concept of key uniqueness. If the specified association list already
4289contains an entry whose key is the same as that specified in the
4290procedure call, the existing entry is replaced by the new one.
4291Otherwise, the new entry is consed onto the head of the old association
4292list to create the combined alist. In all cases, these procedures
4293return the combined alist.
4294
4295@code{assq-set!} and friends @emph{may} destructively modify the
4296structure of the old association list in such a way that an existing
4297variable is correctly updated without having to @code{set!} it to the
4298value returned:
4299
4300@example
4301address-list
4302@result{}
4303(("mary" . "34 Elm Road") ("james" . "16 Bow Street"))
4304
4305(assoc-set! address-list "james" "1a London Road")
4306@result{}
4307(("mary" . "34 Elm Road") ("james" . "1a London Road"))
4308
4309address-list
4310@result{}
4311(("mary" . "34 Elm Road") ("james" . "1a London Road"))
4312@end example
4313
4314Or they may not:
4315
4316@example
4317(assoc-set! address-list "bob" "11 Newington Avenue")
4318@result{}
4319(("bob" . "11 Newington Avenue") ("mary" . "34 Elm Road")
4320 ("james" . "1a London Road"))
4321
4322address-list
4323@result{}
4324(("mary" . "34 Elm Road") ("james" . "1a London Road"))
4325@end example
4326
4327The only safe way to update an association list variable when adding or
4328replacing an entry like this is to @code{set!} the variable to the
4329returned value:
4330
4331@example
4332(set! address-list
4333 (assoc-set! address-list "bob" "11 Newington Avenue"))
4334address-list
4335@result{}
4336(("bob" . "11 Newington Avenue") ("mary" . "34 Elm Road")
4337 ("james" . "1a London Road"))
4338@end example
4339
4340Because of this slight inconvenience, you may find it more convenient to
4341use hash tables to store dictionary data. If your application will not
4342be modifying the contents of an alist very often, this may not make much
4343difference to you.
4344
4345If you need to keep the old value of an association list in a form
4346independent from the list that results from modification by
4347@code{acons}, @code{assq-set!}, @code{assv-set!} or @code{assoc-set!},
4348use @code{list-copy} to copy the old association list before modifying
4349it.
4350
38a93523
NJ
4351@deffn primitive acons key value alist
4352Adds a new key-value pair to @var{alist}. A new pair is
4353created whose car is @var{key} and whose cdr is @var{value}, and the
4354pair is consed onto @var{alist}, and the new list is returned. This
4355function is @emph{not} destructive; @var{alist} is not modified.
4356@end deffn
4357
38a93523
NJ
4358@deffn primitive assq-set! alist key val
4359@deffnx primitive assv-set! alist key value
4360@deffnx primitive assoc-set! alist key value
4361Reassociate @var{key} in @var{alist} with @var{value}: find any existing
4362@var{alist} entry for @var{key} and associate it with the new
4363@var{value}. If @var{alist} does not contain an entry for @var{key},
4364add a new one. Return the (possibly new) alist.
4365
4366These functions do not attempt to verify the structure of @var{alist},
4367and so may cause unusual results if passed an object that is not an
4368association list.
4369@end deffn
4370
4371@node Retrieving Alist Entries
4372@subsubsection Retrieving Alist Entries
5c4b24e1
MG
4373@rnindex assq
4374@rnindex assv
4375@rnindex assoc
38a93523
NJ
4376
4377@code{assq}, @code{assv} and @code{assoc} take an alist and a key as
4378arguments and return the entry for that key if an entry exists, or
4379@code{#f} if there is no entry for that key. Note that, in the cases
4380where an entry exists, these procedures return the complete entry, that
4381is @code{(KEY . VALUE)}, not just the value.
4382
38a93523
NJ
4383@deffn primitive assq key alist
4384@deffnx primitive assv key alist
4385@deffnx primitive assoc key alist
4386Fetches the entry in @var{alist} that is associated with @var{key}. To
4387decide whether the argument @var{key} matches a particular entry in
4388@var{alist}, @code{assq} compares keys with @code{eq?}, @code{assv}
4389uses @code{eqv?} and @code{assoc} uses @code{equal?}. If @var{key}
4390cannot be found in @var{alist} (according to whichever equality
4391predicate is in use), then @code{#f} is returned. These functions
4392return the entire alist entry found (i.e. both the key and the value).
4393@end deffn
4394
4395@code{assq-ref}, @code{assv-ref} and @code{assoc-ref}, on the other
4396hand, take an alist and a key and return @emph{just the value} for that
4397key, if an entry exists. If there is no entry for the specified key,
4398these procedures return @code{#f}.
4399
4400This creates an ambiguity: if the return value is @code{#f}, it means
4401either that there is no entry with the specified key, or that there
4402@emph{is} an entry for the specified key, with value @code{#f}.
4403Consequently, @code{assq-ref} and friends should only be used where it
4404is known that an entry exists, or where the ambiguity doesn't matter
4405for some other reason.
4406
38a93523
NJ
4407@deffn primitive assq-ref alist key
4408@deffnx primitive assv-ref alist key
4409@deffnx primitive assoc-ref alist key
4410Like @code{assq}, @code{assv} and @code{assoc}, except that only the
4411value associated with @var{key} in @var{alist} is returned. These
4412functions are equivalent to
4413
4414@lisp
4415(let ((ent (@var{associator} @var{key} @var{alist})))
4416 (and ent (cdr ent)))
4417@end lisp
4418
4419where @var{associator} is one of @code{assq}, @code{assv} or @code{assoc}.
4420@end deffn
4421
4422@node Removing Alist Entries
4423@subsubsection Removing Alist Entries
38a93523
NJ
4424
4425To remove the element from an association list whose key matches a
4426specified key, use @code{assq-remove!}, @code{assv-remove!} or
4427@code{assoc-remove!} (depending, as usual, on the level of equality
4428required between the key that you specify and the keys in the
4429association list).
4430
4431As with @code{assq-set!} and friends, the specified alist may or may not
4432be modified destructively, and the only safe way to update a variable
4433containing the alist is to @code{set!} it to the value that
4434@code{assq-remove!} and friends return.
4435
4436@example
4437address-list
4438@result{}
4439(("bob" . "11 Newington Avenue") ("mary" . "34 Elm Road")
4440 ("james" . "1a London Road"))
4441
4442(set! address-list (assoc-remove! address-list "mary"))
4443address-list
4444@result{}
4445(("bob" . "11 Newington Avenue") ("james" . "1a London Road"))
4446@end example
4447
4448Note that, when @code{assq/v/oc-remove!} is used to modify an
4449association list that has been constructed only using the corresponding
4450@code{assq/v/oc-set!}, there can be at most one matching entry in the
4451alist, so the question of multiple entries being removed in one go does
4452not arise. If @code{assq/v/oc-remove!} is applied to an association
4453list that has been constructed using @code{acons}, or an
4454@code{assq/v/oc-set!} with a different level of equality, or any mixture
4455of these, it removes only the first matching entry from the alist, even
4456if the alist might contain further matching entries. For example:
4457
4458@example
4459(define address-list '())
4460(set! address-list (assq-set! address-list "mary" "11 Elm Street"))
4461(set! address-list (assq-set! address-list "mary" "57 Pine Drive"))
4462address-list
4463@result{}
4464(("mary" . "57 Pine Drive") ("mary" . "11 Elm Street"))
4465
4466(set! address-list (assoc-remove! address-list "mary"))
4467address-list
4468@result{}
4469(("mary" . "11 Elm Street"))
4470@end example
4471
4472In this example, the two instances of the string "mary" are not the same
4473when compared using @code{eq?}, so the two @code{assq-set!} calls add
4474two distinct entries to @code{address-list}. When compared using
4475@code{equal?}, both "mary"s in @code{address-list} are the same as the
4476"mary" in the @code{assoc-remove!} call, but @code{assoc-remove!} stops
4477after removing the first matching entry that it finds, and so one of the
4478"mary" entries is left in place.
4479
38a93523
NJ
4480@deffn primitive assq-remove! alist key
4481@deffnx primitive assv-remove! alist key
4482@deffnx primitive assoc-remove! alist key
4483Delete the first entry in @var{alist} associated with @var{key}, and return
4484the resulting alist.
4485@end deffn
4486
4487@node Sloppy Alist Functions
4488@subsubsection Sloppy Alist Functions
38a93523
NJ
4489
4490@code{sloppy-assq}, @code{sloppy-assv} and @code{sloppy-assoc} behave
4491like the corresponding non-@code{sloppy-} procedures, except that they
4492return @code{#f} when the specified association list is not well-formed,
4493where the non-@code{sloppy-} versions would signal an error.
4494
4495Specifically, there are two conditions for which the non-@code{sloppy-}
4496procedures signal an error, which the @code{sloppy-} procedures handle
4497instead by returning @code{#f}. Firstly, if the specified alist as a
4498whole is not a proper list:
4499
4500@example
4501(assoc "mary" '((1 . 2) ("key" . "door") . "open sesame"))
4502@result{}
4503ERROR: In procedure assoc in expression (assoc "mary" (quote #)):
4504ERROR: Wrong type argument in position 2 (expecting NULLP): "open sesame"
4505ABORT: (wrong-type-arg)
4506
4507(sloppy-assoc "mary" '((1 . 2) ("key" . "door") . "open sesame"))
4508@result{}
4509#f
4510@end example
4511
4512@noindent
4513Secondly, if one of the entries in the specified alist is not a pair:
4514
4515@example
4516(assoc 2 '((1 . 1) 2 (3 . 9)))
4517@result{}
4518ERROR: In procedure assoc in expression (assoc 2 (quote #)):
4519ERROR: Wrong type argument in position 2 (expecting CONSP): 2
4520ABORT: (wrong-type-arg)
4521
4522(sloppy-assoc 2 '((1 . 1) 2 (3 . 9)))
4523@result{}
4524#f
4525@end example
4526
4527Unless you are explicitly working with badly formed association lists,
4528it is much safer to use the non-@code{sloppy-} procedures, because they
4529help to highlight coding and data errors that the @code{sloppy-}
4530versions would silently cover up.
4531
38a93523
NJ
4532@deffn primitive sloppy-assq key alist
4533Behaves like @code{assq} but does not do any error checking.
4534Recommended only for use in Guile internals.
4535@end deffn
4536
38a93523
NJ
4537@deffn primitive sloppy-assv key alist
4538Behaves like @code{assv} but does not do any error checking.
4539Recommended only for use in Guile internals.
4540@end deffn
4541
38a93523
NJ
4542@deffn primitive sloppy-assoc key alist
4543Behaves like @code{assoc} but does not do any error checking.
4544Recommended only for use in Guile internals.
4545@end deffn
4546
4547@node Alist Example
4548@subsubsection Alist Example
4549
4550Here is a longer example of how alists may be used in practice.
4551
4552@lisp
4553(define capitals '(("New York" . "Albany")
4554 ("Oregon" . "Salem")
4555 ("Florida" . "Miami")))
4556
4557;; What's the capital of Oregon?
4558(assoc "Oregon" capitals) @result{} ("Oregon" . "Salem")
4559(assoc-ref capitals "Oregon") @result{} "Salem"
4560
4561;; We left out South Dakota.
4562(set! capitals
4563 (assoc-set! capitals "South Dakota" "Bismarck"))
4564capitals
4565@result{} (("South Dakota" . "Bismarck")
4566 ("New York" . "Albany")
4567 ("Oregon" . "Salem")
4568 ("Florida" . "Miami"))
4569
4570;; And we got Florida wrong.
4571(set! capitals
4572 (assoc-set! capitals "Florida" "Tallahassee"))
4573capitals
4574@result{} (("South Dakota" . "Bismarck")
4575 ("New York" . "Albany")
4576 ("Oregon" . "Salem")
4577 ("Florida" . "Tallahassee"))
4578
4579;; After Oregon secedes, we can remove it.
4580(set! capitals
4581 (assoc-remove! capitals "Oregon"))
4582capitals
4583@result{} (("South Dakota" . "Bismarck")
4584 ("New York" . "Albany")
4585 ("Florida" . "Tallahassee"))
4586@end lisp
4587
4588@node Hash Tables
4589@subsection Hash Tables
4590
4591Like the association list functions, the hash table functions come
4592in several varieties: @code{hashq}, @code{hashv}, and @code{hash}.
4593The @code{hashq} functions use @code{eq?} to determine whether two
4594keys match. The @code{hashv} functions use @code{eqv?}, and the
4595@code{hash} functions use @code{equal?}.
4596
4597In each of the functions that follow, the @var{table} argument
4598must be a vector. The @var{key} and @var{value} arguments may be
4599any Scheme object.
4600
ae9f3a15 4601@deffn primitive hashq-ref table key [dflt]
38a93523
NJ
4602Look up @var{key} in the hash table @var{table}, and return the
4603value (if any) associated with it. If @var{key} is not found,
780ee65e
NJ
4604return @var{default} (or @code{#f} if no @var{default} argument
4605is supplied). Uses @code{eq?} for equality testing.
38a93523
NJ
4606@end deffn
4607
ae9f3a15 4608@deffn primitive hashv-ref table key [dflt]
38a93523
NJ
4609Look up @var{key} in the hash table @var{table}, and return the
4610value (if any) associated with it. If @var{key} is not found,
780ee65e
NJ
4611return @var{default} (or @code{#f} if no @var{default} argument
4612is supplied). Uses @code{eqv?} for equality testing.
38a93523
NJ
4613@end deffn
4614
ae9f3a15 4615@deffn primitive hash-ref table key [dflt]
38a93523
NJ
4616Look up @var{key} in the hash table @var{table}, and return the
4617value (if any) associated with it. If @var{key} is not found,
780ee65e
NJ
4618return @var{default} (or @code{#f} if no @var{default} argument
4619is supplied). Uses @code{equal?} for equality testing.
38a93523
NJ
4620@end deffn
4621
ae9f3a15 4622@deffn primitive hashq-set! table key val
780ee65e
NJ
4623Find the entry in @var{table} associated with @var{key}, and
4624store @var{value} there. Uses @code{eq?} for equality testing.
38a93523
NJ
4625@end deffn
4626
ae9f3a15 4627@deffn primitive hashv-set! table key val
780ee65e
NJ
4628Find the entry in @var{table} associated with @var{key}, and
4629store @var{value} there. Uses @code{eqv?} for equality testing.
38a93523
NJ
4630@end deffn
4631
ae9f3a15 4632@deffn primitive hash-set! table key val
780ee65e
NJ
4633Find the entry in @var{table} associated with @var{key}, and
4634store @var{value} there. Uses @code{equal?} for equality
4635testing.
38a93523
NJ
4636@end deffn
4637
ae9f3a15 4638@deffn primitive hashq-remove! table key
780ee65e
NJ
4639Remove @var{key} (and any value associated with it) from
4640@var{table}. Uses @code{eq?} for equality tests.
38a93523
NJ
4641@end deffn
4642
ae9f3a15 4643@deffn primitive hashv-remove! table key
780ee65e
NJ
4644Remove @var{key} (and any value associated with it) from
4645@var{table}. Uses @code{eqv?} for equality tests.
38a93523
NJ
4646@end deffn
4647
ae9f3a15 4648@deffn primitive hash-remove! table key
780ee65e
NJ
4649Remove @var{key} (and any value associated with it) from
4650@var{table}. Uses @code{equal?} for equality tests.
38a93523
NJ
4651@end deffn
4652
4653The standard hash table functions may be too limited for some
4654applications. For example, you may want a hash table to store
4655strings in a case-insensitive manner, so that references to keys
4656named ``foobar'', ``FOOBAR'' and ``FooBaR'' will all yield the
4657same item. Guile provides you with @dfn{extended} hash tables
4658that permit you to specify a hash function and associator function
4659of your choosing. The functions described in the rest of this section
4660can be used to implement such custom hash table structures.
4661
4662If you are unfamiliar with the inner workings of hash tables, then
4663this facility will probably be a little too abstract for you to
4664use comfortably. If you are interested in learning more, see an
4665introductory textbook on data structures or algorithms for an
4666explanation of how hash tables are implemented.
4667
38a93523 4668@deffn primitive hashq key size
780ee65e
NJ
4669Determine a hash value for @var{key} that is suitable for
4670lookups in a hashtable of size @var{size}, where @code{eq?} is
4671used as the equality predicate. The function returns an
4672integer in the range 0 to @var{size} - 1. Note that
4673@code{hashq} may use internal addresses. Thus two calls to
4674hashq where the keys are @code{eq?} are not guaranteed to
4675deliver the same value if the key object gets garbage collected
4676in between. This can happen, for example with symbols:
4677@code{(hashq 'foo n) (gc) (hashq 'foo n)} may produce two
4678different values, since @code{foo} will be garbage collected.
38a93523
NJ
4679@end deffn
4680
38a93523 4681@deffn primitive hashv key size
780ee65e
NJ
4682Determine a hash value for @var{key} that is suitable for
4683lookups in a hashtable of size @var{size}, where @code{eqv?} is
4684used as the equality predicate. The function returns an
4685integer in the range 0 to @var{size} - 1. Note that
4686@code{(hashv key)} may use internal addresses. Thus two calls
4687to hashv where the keys are @code{eqv?} are not guaranteed to
4688deliver the same value if the key object gets garbage collected
4689in between. This can happen, for example with symbols:
4690@code{(hashv 'foo n) (gc) (hashv 'foo n)} may produce two
4691different values, since @code{foo} will be garbage collected.
38a93523
NJ
4692@end deffn
4693
38a93523 4694@deffn primitive hash key size
780ee65e
NJ
4695Determine a hash value for @var{key} that is suitable for
4696lookups in a hashtable of size @var{size}, where @code{equal?}
4697is used as the equality predicate. The function returns an
4698integer in the range 0 to @var{size} - 1.
38a93523
NJ
4699@end deffn
4700
ae9f3a15 4701@deffn primitive hashx-ref hash assoc table key [dflt]
38a93523 4702This behaves the same way as the corresponding @code{ref}
ae9f3a15
MG
4703function, but uses @var{hash} as a hash function and
4704@var{assoc} to compare keys. @code{hash} must be a function
4705that takes two arguments, a key to be hashed and a table size.
4706@code{assoc} must be an associator function, like @code{assoc},
4707@code{assq} or @code{assv}.
4708By way of illustration, @code{hashq-ref table key} is
4709equivalent to @code{hashx-ref hashq assq table key}.
38a93523
NJ
4710@end deffn
4711
ae9f3a15 4712@deffn primitive hashx-set! hash assoc table key val
38a93523 4713This behaves the same way as the corresponding @code{set!}
ae9f3a15
MG
4714function, but uses @var{hash} as a hash function and
4715@var{assoc} to compare keys. @code{hash} must be a function
4716that takes two arguments, a key to be hashed and a table size.
4717@code{assoc} must be an associator function, like @code{assoc},
4718@code{assq} or @code{assv}.
4719 By way of illustration, @code{hashq-set! table key} is
4720equivalent to @code{hashx-set! hashq assq table key}.
38a93523
NJ
4721@end deffn
4722
ae9f3a15
MG
4723@deffn primitive hashq-get-handle table key
4724This procedure returns the @code{(key . value)} pair from the
4725hash table @var{table}. If @var{table} does not hold an
4726associated value for @var{key}, @code{#f} is returned.
4727Uses @code{eq?} for equality testing.
38a93523
NJ
4728@end deffn
4729
ae9f3a15
MG
4730@deffn primitive hashv-get-handle table key
4731This procedure returns the @code{(key . value)} pair from the
4732hash table @var{table}. If @var{table} does not hold an
4733associated value for @var{key}, @code{#f} is returned.
4734Uses @code{eqv?} for equality testing.
38a93523
NJ
4735@end deffn
4736
ae9f3a15
MG
4737@deffn primitive hash-get-handle table key
4738This procedure returns the @code{(key . value)} pair from the
4739hash table @var{table}. If @var{table} does not hold an
4740associated value for @var{key}, @code{#f} is returned.
4741Uses @code{equal?} for equality testing.
38a93523
NJ
4742@end deffn
4743
ae9f3a15
MG
4744@deffn primitive hashx-get-handle hash assoc table key
4745This behaves the same way as the corresponding
4746@code{-get-handle} function, but uses @var{hash} as a hash
4747function and @var{assoc} to compare keys. @code{hash} must be
4748a function that takes two arguments, a key to be hashed and a
38a93523
NJ
4749table size. @code{assoc} must be an associator function, like
4750@code{assoc}, @code{assq} or @code{assv}.
4751@end deffn
4752
38a93523
NJ
4753@deffn primitive hashq-create-handle! table key init
4754This function looks up @var{key} in @var{table} and returns its handle.
4755If @var{key} is not already present, a new handle is created which
4756associates @var{key} with @var{init}.
4757@end deffn
4758
38a93523
NJ
4759@deffn primitive hashv-create-handle! table key init
4760This function looks up @var{key} in @var{table} and returns its handle.
4761If @var{key} is not already present, a new handle is created which
4762associates @var{key} with @var{init}.
4763@end deffn
4764
38a93523
NJ
4765@deffn primitive hash-create-handle! table key init
4766This function looks up @var{key} in @var{table} and returns its handle.
4767If @var{key} is not already present, a new handle is created which
4768associates @var{key} with @var{init}.
4769@end deffn
4770
ae9f3a15
MG
4771@deffn primitive hashx-create-handle! hash assoc table key init
4772This behaves the same way as the corresponding
4773@code{-create-handle} function, but uses @var{hash} as a hash
4774function and @var{assoc} to compare keys. @code{hash} must be
4775a function that takes two arguments, a key to be hashed and a
38a93523
NJ
4776table size. @code{assoc} must be an associator function, like
4777@code{assoc}, @code{assq} or @code{assv}.
4778@end deffn
4779
38a93523
NJ
4780@deffn primitive hash-fold proc init table
4781An iterator over hash-table elements.
4782Accumulates and returns a result by applying PROC successively.
4783The arguments to PROC are "(key value prior-result)" where key
4784and value are successive pairs from the hash table TABLE, and
4785prior-result is either INIT (for the first application of PROC)
4786or the return value of the previous application of PROC.
4787For example, @code{(hash-fold acons () tab)} will convert a hash
4788table into an a-list of key-value pairs.
4789@end deffn
4790
4791
4792@node Vectors
4793@section Vectors
4794
5c4b24e1
MG
4795@c FIXME::martin: Review me!
4796
2954ad93
MG
4797@c FIXME::martin: This node should come before the non-standard data types.
4798
5c4b24e1
MG
4799@c FIXME::martin: Should the subsections of this section be nodes
4800@c of their own, or are the resulting nodes too short, then?
4801
2954ad93
MG
4802Vectors are sequences of Scheme objects. Unlike lists, the length of a
4803vector, once the vector is created, cannot be changed. The advantage of
4804vectors over lists is that the time required to access one element of a
4805vector is constant, whereas lists have an access time linear to the
4806index of the accessed element in the list.
4807
4808Note that the vectors documented in this section can contain any kind of
4809Scheme object, it is even possible to have different types of objects in
4810the same vector.
4811
4812@subsection Vector Read Syntax
4813
4814Vectors can literally be entered in source code, just like strings,
4815characters or some of the other data types. The read syntax for vectors
4816is as follows: A sharp sign (@code{#}), followed by an opening
4817parentheses, all elements of the vector in their respective read syntax,
4818and finally a closing parentheses. The following are examples of the
4819read syntax for vectors; where the first vector only contains numbers
4820and the second three different object types: a string, a symbol and a
4821number in hexidecimal notation.
4822
4823@lisp
4824#(1 2 3)
4825#("Hello" foo #xdeadbeef)
4826@end lisp
4827
4828@subsection Vector Predicates
4829
5c4b24e1 4830@rnindex vector?
2954ad93
MG
4831@deffn primitive vector? obj
4832Return @code{#t} if @var{obj} is a vector, otherwise return
4833@code{#f}.
4834@end deffn
4835
4836@subsection Vector Constructors
4837
5c4b24e1 4838@rnindex make-vector
38a93523 4839@deffn primitive make-vector k [fill]
ae9f3a15
MG
4840Return a newly allocated vector of @var{k} elements. If a
4841second argument is given, then each element is initialized to
4842@var{fill}. Otherwise the initial contents of each element is
4843unspecified.
38a93523
NJ
4844@end deffn
4845
5c4b24e1
MG
4846@rnindex vector
4847@rnindex list->vector
38a93523
NJ
4848@deffn primitive vector . l
4849@deffnx primitive list->vector l
ae9f3a15
MG
4850Return a newly allocated vector whose elements contain the
4851given arguments. Analogous to @code{list}.
780ee65e 4852@lisp
ae9f3a15 4853(vector 'a 'b 'c) @result{} #(a b c)
780ee65e 4854@end lisp
38a93523
NJ
4855@end deffn
4856
5c4b24e1 4857@rnindex vector->list
38a93523 4858@deffn primitive vector->list v
ae9f3a15
MG
4859Return a newly allocated list of the objects contained in the
4860elements of @var{vector}.
780ee65e
NJ
4861@lisp
4862(vector->list '#(dah dah didah)) @result{} (dah dah didah)
4863(list->vector '(dididit dah)) @result{} #(dididit dah)
4864@end lisp
38a93523
NJ
4865@end deffn
4866
2954ad93
MG
4867@subsection Vector Modification
4868
4869A vector created by any of the vector constructor procedures (REFFIXME)
4870documented above can be modified using the following procedures.
4871
4872According to R5RS, using any of these procedures on literally entered
4873vectors is an error, because these vectors are considered to be
4874constant, although Guile currently does not detect this error.
4875
5c4b24e1 4876@rnindex vector-set!
2954ad93
MG
4877@deffn primitive vector-set! vector k obj
4878@var{k} must be a valid index of @var{vector}.
4879@code{Vector-set!} stores @var{obj} in element @var{k} of @var{vector}.
4880The value returned by @samp{vector-set!} is unspecified.
4881@lisp
4882(let ((vec (vector 0 '(2 2 2 2) "Anna")))
4883 (vector-set! vec 1 '("Sue" "Sue"))
4884 vec) @result{} #(0 ("Sue" "Sue") "Anna")
4885(vector-set! '#(0 1 2) 1 "doe") @result{} @emph{error} ; constant vector
4886@end lisp
4887@end deffn
4888
5c4b24e1 4889@rnindex vector-fill!
ae9f3a15
MG
4890@deffn primitive vector-fill! v fill
4891Store @var{fill} in every element of @var{vector}. The value
4892returned by @code{vector-fill!} is unspecified.
38a93523
NJ
4893@end deffn
4894
2954ad93
MG
4895@deffn primitive vector-move-left! vec1 start1 end1 vec2 start2
4896Vector version of @code{substring-move-left!}.
38a93523
NJ
4897@end deffn
4898
2954ad93
MG
4899@deffn primitive vector-move-right! vec1 start1 end1 vec2 start2
4900Vector version of @code{substring-move-right!}.
4901@end deffn
4902
4903@subsection Vector Selection
4904
4905These procedures return information about a given vector, such as the
4906size or what elements are contained in the vector.
4907
5c4b24e1 4908@rnindex vector-length
fcaedf99
MG
4909@deffn primitive vector-length vector
4910Returns the number of elements in @var{vector} as an exact integer.
4911@end deffn
4912
5c4b24e1 4913@rnindex vector-ref
fcaedf99
MG
4914@deffn primitive vector-ref vector k
4915@var{k} must be a valid index of @var{vector}.
4916@samp{Vector-ref} returns the contents of element @var{k} of
4917@var{vector}.
4918@lisp
4919(vector-ref '#(1 1 2 3 5 8 13 21) 5) @result{} 8
4920(vector-ref '#(1 1 2 3 5 8 13 21)
4921 (let ((i (round (* 2 (acos -1)))))
4922 (if (inexact? i)
4923 (inexact->exact i)
4924 i))) @result{} 13
4925@end lisp
4926@end deffn
4927
38a93523
NJ
4928@node Hooks
4929@section Hooks
4930
5c4b24e1
MG
4931@c FIXME::martin: Review me!
4932
4933A hook is basically a list of procedures to be called at well defined
4934points in time. Hooks are used internally for several debugging
4935facilities, but they can be used in user code, too.
4936
4937Hooks are created with @code{make-hook}, then procedures can be added to
4938a hook with @code{add-hook!} or removed with @code{remove-hook!} or
4939@code{reset-hook!}. The procedures stored in a hook can be invoked with
4940@code{run-hook}.
4941
4942@menu
4943* Hook Examples:: Hook usage by example.
4944* Hook Reference:: Reference of all hook procedures.
4945@end menu
4946
4947@node Hook Examples
4948@subsection Hook Examples
4949
4950Hook usage is shown by some examples in this section. First, we will
4951define a hook of arity 2---that is, the procedures stored in the hook
4952will have to accept two arguments.
4953
4954@lisp
4955(define hook (make-hook 2))
4956hook
4957@result{} #<hook 2 40286c90>
4958@end lisp
4959
4960Now we are ready to add some procedures to the newly created hook with
4961@code{add-hook!}. In the following example, two procedures are added,
4962which print different messages and do different things with their
4963arguments. When the procedures have been added, we can invoke them
4964using @code{run-hook}.
4965
4966@lisp
4967(add-hook! hook (lambda (x y)
4968 (display "Foo: ")
4969 (display (+ x y))
4970 (newline)))
4971(add-hook! hook (lambda (x y)
4972 (display "Bar: ")
4973 (display (* x y))
4974 (newline)))
4975(run-hook hook 3 4)
f4f2b29a
MG
4976@print{} Bar: 12
4977@print{} Foo: 7
5c4b24e1
MG
4978@end lisp
4979
4980Note that the procedures are called in reverse order than they were
4981added. This can be changed by providing the optional third argument
4982on the second call to @code{add-hook!}.
4983
4984@lisp
4985(add-hook! hook (lambda (x y)
4986 (display "Foo: ")
4987 (display (+ x y))
4988 (newline)))
4989(add-hook! hook (lambda (x y)
4990 (display "Bar: ")
4991 (display (* x y))
4992 (newline))
f4f2b29a 4993 #t) ; @r{<- Change here!}
5c4b24e1 4994(run-hook hook 3 4)
f4f2b29a
MG
4995@print{} Foo: 7
4996@print{} Bar: 12
5c4b24e1
MG
4997@end lisp
4998
4999@node Hook Reference
5000@subsection Hook Reference
5001
5002When a hook is created with @code{make-hook}, you can supply the arity
5003of the procedures which can be added to the hook. The arity defaults to
5004zero. All procedures of a hook must have the same arity, and when the
5005procedures are invoked using @code{run-hook}, the number of arguments
5006must match the arity of the procedures.
5007
5008The order in which procedures are added to a hook matters. If the third
5009parameter to @var{add-hook!} is omitted or is equal to @code{#f}, the
5010procedure is added in front of the procedures which might already be on
5011that hook, otherwise the procedure is added at the end. The procedures
5012are always called from first to last when they are invoked via
5013@code{run-hook}.
5014
5015When calling @code{hook->list}, the procedures in the resulting list are
5016in the same order as they would have been called by @code{run-hook}.
5017
38a93523
NJ
5018@deffn primitive make-hook-with-name name [n_args]
5019Create a named hook with the name @var{name} for storing
5c4b24e1
MG
5020procedures of arity @var{n_args}. @var{n_args} defaults to
5021zero.
38a93523
NJ
5022@end deffn
5023
38a93523 5024@deffn primitive make-hook [n_args]
5c4b24e1
MG
5025Create a hook for storing procedure of arity
5026@var{n_args}. @var{n_args} defaults to zero.
38a93523
NJ
5027@end deffn
5028
38a93523 5029@deffn primitive hook? x
5c4b24e1 5030Return @code{#t} if @var{x} is a hook, @code{#f} otherwise.
38a93523
NJ
5031@end deffn
5032
38a93523 5033@deffn primitive hook-empty? hook
5c4b24e1
MG
5034Return @code{#t} if @var{hook} is an empty hook, @code{#f}
5035otherwise.
38a93523
NJ
5036@end deffn
5037
38a93523
NJ
5038@deffn primitive add-hook! hook proc [append_p]
5039Add the procedure @var{proc} to the hook @var{hook}. The
5040procedure is added to the end if @var{append_p} is true,
5041otherwise it is added to the front.
5042@end deffn
5043
38a93523
NJ
5044@deffn primitive remove-hook! hook proc
5045Remove the procedure @var{proc} from the hook @var{hook}.
5046@end deffn
5047
38a93523
NJ
5048@deffn primitive reset-hook! hook
5049Remove all procedures from the hook @var{hook}.
5050@end deffn
5051
38a93523
NJ
5052@deffn primitive run-hook hook . args
5053Apply all procedures from the hook @var{hook} to the arguments
5c4b24e1
MG
5054@var{args}. The order of the procedure application is first to
5055last.
38a93523
NJ
5056@end deffn
5057
38a93523
NJ
5058@deffn primitive hook->list hook
5059Convert the procedure list of @var{hook} to a list.
5060@end deffn
5061
5062
5063@node Other Data Types
5064@section Other Core Guile Data Types
5065
5066
5067@c Local Variables:
5068@c TeX-master: "guile.texi"
5069@c End: