web.texi defun -> deffn
[bpt/guile.git] / doc / ref / api-utility.texi
CommitLineData
07d83abe
MV
1@c -*-texinfo-*-
2@c This is part of the GNU Guile Reference Manual.
3@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004
4@c Free Software Foundation, Inc.
5@c See the file guile.texi for copying conditions.
6
07d83abe
MV
7@node Utility Functions
8@section General Utility Functions
9
10@c FIXME::martin: Review me!
11
12This chapter contains information about procedures which are not cleanly
13tied to a specific data type. Because of their wide range of
14applications, they are collected in a @dfn{utility} chapter.
15
16@menu
17* Equality:: When are two values `the same'?
18* Object Properties:: A modern interface to object properties.
19* Sorting:: Sort utility procedures.
20* Copying:: Copying deep structures.
21* General Conversion:: Converting objects to strings.
22* Hooks:: User-customizable event lists.
23@end menu
24
25
26@node Equality
27@subsection Equality
07d83abe
MV
28@cindex sameness
29@cindex equality
30
0b8b0a3f
KR
31There are three kinds of core equality predicates in Scheme, described
32below. The same kinds of comparisons arise in other functions, like
33@code{memq} and friends (@pxref{List Searching}).
34
35For all three tests, objects of different types are never equal. So
36for instance a list and a vector are not @code{equal?}, even if their
37contents are the same. Exact and inexact numbers are considered
38different types too, and are hence not equal even if their values are
39the same.
40
41@code{eq?} tests just for the same object (essentially a pointer
42comparison). This is fast, and can be used when searching for a
43particular object, or when working with symbols or keywords (which are
44always unique objects).
45
46@code{eqv?} extends @code{eq?} to look at the value of numbers and
47characters. It can for instance be used somewhat like @code{=}
48(@pxref{Comparison}) but without an error if one operand isn't a
49number.
50
51@code{equal?} goes further, it looks (recursively) into the contents
52of lists, vectors, etc. This is good for instance on lists that have
53been read or calculated in various places and are the same, just not
54made up of the same pairs. Such lists look the same (when printed),
55and @code{equal?} will consider them the same.
56
57@sp 1
07d83abe
MV
58@deffn {Scheme Procedure} eq? x y
59@deffnx {C Function} scm_eq_p (x, y)
0b8b0a3f
KR
60@rnindex eq?
61Return @code{#t} if @var{x} and @var{y} are the same object, except
62for numbers and characters. For example,
63
64@example
65(define x (vector 1 2 3))
66(define y (vector 1 2 3))
67
68(eq? x x) @result{} #t
69(eq? x y) @result{} #f
70@end example
71
72Numbers and characters are not equal to any other object, but the
73problem is they're not necessarily @code{eq?} to themselves either.
74This is even so when the number comes directly from a variable,
75
76@example
77(let ((n (+ 2 3)))
78 (eq? n n)) @result{} *unspecified*
79@end example
80
81Generally @code{eqv?} below should be used when comparing numbers or
82characters. @code{=} (@pxref{Comparison}) or @code{char=?}
83(@pxref{Characters}) can be used too.
84
85It's worth noting that end-of-list @code{()}, @code{#t}, @code{#f}, a
86symbol of a given name, and a keyword of a given name, are unique
87objects. There's just one of each, so for instance no matter how
88@code{()} arises in a program, it's the same object and can be
89compared with @code{eq?},
90
91@example
92(define x (cdr '(123)))
93(define y (cdr '(456)))
94(eq? x y) @result{} #t
95
96(define x (string->symbol "foo"))
97(eq? x 'foo) @result{} #t
98@end example
07d83abe
MV
99@end deffn
100
101@deftypefn {C Function} int scm_is_eq (SCM x, SCM y)
102Return @code{1} when @var{x} and @var{y} are equal in the sense of
0b8b0a3f
KR
103@code{eq?}, otherwise return @code{0}.
104
105@findex ==
106The @code{==} operator should not be used on @code{SCM} values, an
107@code{SCM} is a C type which cannot necessarily be compared using
108@code{==} (@pxref{The SCM Type}).
07d83abe
MV
109@end deftypefn
110
0b8b0a3f 111@sp 1
07d83abe
MV
112@deffn {Scheme Procedure} eqv? x y
113@deffnx {C Function} scm_eqv_p (x, y)
0b8b0a3f
KR
114@rnindex eqv?
115Return @code{#t} if @var{x} and @var{y} are the same object, or for
116characters and numbers the same value.
117
118On objects except characters and numbers, @code{eqv?} is the same as
119@code{eq?} above, it's true if @var{x} and @var{y} are the same
120object.
121
122If @var{x} and @var{y} are numbers or characters, @code{eqv?} compares
123their type and value. An exact number is not @code{eqv?} to an
124inexact number (even if their value is the same).
125
126@example
127(eqv? 3 (+ 1 2)) @result{} #t
128(eqv? 1 1.0) @result{} #f
129@end example
07d83abe
MV
130@end deffn
131
0b8b0a3f 132@sp 1
07d83abe
MV
133@deffn {Scheme Procedure} equal? x y
134@deffnx {C Function} scm_equal_p (x, y)
0b8b0a3f
KR
135@rnindex equal?
136Return @code{#t} if @var{x} and @var{y} are the same type, and their
137contents or value are equal.
138
42be21d8 139For a pair, string, vector, array or structure, @code{equal?} compares the
72b3aa56 140contents, and does so using the same @code{equal?} recursively,
0b8b0a3f
KR
141so a deep structure can be traversed.
142
143@example
144(equal? (list 1 2 3) (list 1 2 3)) @result{} #t
145(equal? (list 1 2 3) (vector 1 2 3)) @result{} #f
146@end example
147
148For other objects, @code{equal?} compares as per @code{eqv?} above,
149which means characters and numbers are compared by type and value (and
150like @code{eqv?}, exact and inexact numbers are not @code{equal?},
151even if their value is the same).
152
153@example
154(equal? 3 (+ 1 2)) @result{} #t
155(equal? 1 1.0) @result{} #f
156@end example
157
158Hash tables are currently only compared as per @code{eq?}, so two
159different tables are not @code{equal?}, even if their contents are the
160same.
161
162@code{equal?} does not support circular data structures, it may go
163into an infinite loop if asked to compare two circular lists or
164similar.
165
166New application-defined object types (@pxref{Defining New Types
167(Smobs)}) have an @code{equalp} handler which is called by
168@code{equal?}. This lets an application traverse the contents or
169control what is considered @code{equal?} for two objects of such a
170type. If there's no such handler, the default is to just compare as
171per @code{eq?}.
07d83abe
MV
172@end deffn
173
174
175@node Object Properties
176@subsection Object Properties
177
178It's often useful to associate a piece of additional information with a
179Scheme object even though that object does not have a dedicated slot
180available in which the additional information could be stored. Object
181properties allow you to do just that.
182
07d83abe
MV
183Guile's representation of an object property is a procedure-with-setter
184(@pxref{Procedures with Setters}) that can be used with the generalized
185form of @code{set!} (REFFIXME) to set and retrieve that property for any
186Scheme object. So, setting a property looks like this:
187
188@lisp
189(set! (my-property obj1) value-for-obj1)
190(set! (my-property obj2) value-for-obj2)
191@end lisp
192
193@noindent
194And retrieving values of the same property looks like this:
195
196@lisp
197(my-property obj1)
198@result{}
199value-for-obj1
200
201(my-property obj2)
202@result{}
203value-for-obj2
204@end lisp
205
206To create an object property in the first place, use the
207@code{make-object-property} procedure:
208
209@lisp
210(define my-property (make-object-property))
211@end lisp
212
213@deffn {Scheme Procedure} make-object-property
214Create and return an object property. An object property is a
215procedure-with-setter that can be called in two ways. @code{(set!
216(@var{property} @var{obj}) @var{val})} sets @var{obj}'s @var{property}
217to @var{val}. @code{(@var{property} @var{obj})} returns the current
218setting of @var{obj}'s @var{property}.
219@end deffn
220
221A single object property created by @code{make-object-property} can
222associate distinct property values with all Scheme values that are
223distinguishable by @code{eq?} (including, for example, integers).
224
225Internally, object properties are implemented using a weak key hash
226table. This means that, as long as a Scheme value with property values
227is protected from garbage collection, its property values are also
228protected. When the Scheme value is collected, its entry in the
229property table is removed and so the (ex-) property values are no longer
230protected by the table.
231
232@menu
233* Property Primitives:: Low level property implementation.
234* Old-fashioned Properties:: An older approach to properties.
235@end menu
236
237
238@node Property Primitives
239@subsubsection Low Level Property Implementation.
240
241@deffn {Scheme Procedure} primitive-make-property not-found-proc
242@deffnx {C Function} scm_primitive_make_property (not_found_proc)
243Create a @dfn{property token} that can be used with
244@code{primitive-property-ref} and @code{primitive-property-set!}.
245See @code{primitive-property-ref} for the significance of
246@var{not-found-proc}.
247@end deffn
248
249@deffn {Scheme Procedure} primitive-property-ref prop obj
250@deffnx {C Function} scm_primitive_property_ref (prop, obj)
251Return the property @var{prop} of @var{obj}.
252
253When no value has yet been associated with @var{prop} and @var{obj},
254the @var{not-found-proc} from @var{prop} is used. A call
255@code{(@var{not-found-proc} @var{prop} @var{obj})} is made and the
256result set as the property value. If @var{not-found-proc} is
257@code{#f} then @code{#f} is the property value.
258@end deffn
259
260@deffn {Scheme Procedure} primitive-property-set! prop obj val
261@deffnx {C Function} scm_primitive_property_set_x (prop, obj, val)
262Set the property @var{prop} of @var{obj} to @var{val}.
263@end deffn
264
265@deffn {Scheme Procedure} primitive-property-del! prop obj
266@deffnx {C Function} scm_primitive_property_del_x (prop, obj)
267Remove any value associated with @var{prop} and @var{obj}.
268@end deffn
269
270
271@node Old-fashioned Properties
272@subsubsection An Older Approach to Properties
273
274Traditionally, Lisp systems provide a different object property
275interface to that provided by @code{make-object-property}, in which the
276object property that is being set or retrieved is indicated by a symbol.
277
278Guile includes this older kind of interface as well, but it may well be
279removed in a future release, as it is less powerful than
280@code{make-object-property} and so increases the size of the Guile
281library for no benefit. (And it is trivial to write a compatibility
282layer in Scheme.)
283
284@deffn {Scheme Procedure} object-properties obj
285@deffnx {C Function} scm_object_properties (obj)
286Return @var{obj}'s property list.
287@end deffn
288
289@deffn {Scheme Procedure} set-object-properties! obj alist
290@deffnx {C Function} scm_set_object_properties_x (obj, alist)
291Set @var{obj}'s property list to @var{alist}.
292@end deffn
293
294@deffn {Scheme Procedure} object-property obj key
295@deffnx {C Function} scm_object_property (obj, key)
296Return the property of @var{obj} with name @var{key}.
297@end deffn
298
299@deffn {Scheme Procedure} set-object-property! obj key value
300@deffnx {C Function} scm_set_object_property_x (obj, key, value)
301In @var{obj}'s property list, set the property named @var{key}
302to @var{value}.
303@end deffn
304
305
306@node Sorting
307@subsection Sorting
308
309@c FIXME::martin: Review me!
310
311@cindex sorting
312@cindex sorting lists
313@cindex sorting vectors
314
315Sorting is very important in computer programs. Therefore, Guile comes
316with several sorting procedures built-in. As always, procedures with
317names ending in @code{!} are side-effecting, that means that they may
318modify their parameters in order to produce their results.
319
320The first group of procedures can be used to merge two lists (which must
321be already sorted on their own) and produce sorted lists containing
322all elements of the input lists.
323
324@deffn {Scheme Procedure} merge alist blist less
325@deffnx {C Function} scm_merge (alist, blist, less)
326Merge two already sorted lists into one.
327Given two lists @var{alist} and @var{blist}, such that
328@code{(sorted? alist less?)} and @code{(sorted? blist less?)},
329return a new list in which the elements of @var{alist} and
330@var{blist} have been stably interleaved so that
331@code{(sorted? (merge alist blist less?) less?)}.
332Note: this does _not_ accept vectors.
333@end deffn
334
335@deffn {Scheme Procedure} merge! alist blist less
336@deffnx {C Function} scm_merge_x (alist, blist, less)
337Takes two lists @var{alist} and @var{blist} such that
338@code{(sorted? alist less?)} and @code{(sorted? blist less?)} and
339returns a new list in which the elements of @var{alist} and
340@var{blist} have been stably interleaved so that
341 @code{(sorted? (merge alist blist less?) less?)}.
342This is the destructive variant of @code{merge}
343Note: this does _not_ accept vectors.
344@end deffn
345
346The following procedures can operate on sequences which are either
347vectors or list. According to the given arguments, they return sorted
348vectors or lists, respectively. The first of the following procedures
349determines whether a sequence is already sorted, the other sort a given
350sequence. The variants with names starting with @code{stable-} are
351special in that they maintain a special property of the input sequences:
352If two or more elements are the same according to the comparison
353predicate, they are left in the same order as they appeared in the
354input.
355
356@deffn {Scheme Procedure} sorted? items less
357@deffnx {C Function} scm_sorted_p (items, less)
358Return @code{#t} iff @var{items} is a list or a vector such that
359for all 1 <= i <= m, the predicate @var{less} returns true when
360applied to all elements i - 1 and i
361@end deffn
362
363@deffn {Scheme Procedure} sort items less
364@deffnx {C Function} scm_sort (items, less)
365Sort the sequence @var{items}, which may be a list or a
366vector. @var{less} is used for comparing the sequence
367elements. This is not a stable sort.
368@end deffn
369
370@deffn {Scheme Procedure} sort! items less
371@deffnx {C Function} scm_sort_x (items, less)
372Sort the sequence @var{items}, which may be a list or a
373vector. @var{less} is used for comparing the sequence
374elements. The sorting is destructive, that means that the
375input sequence is modified to produce the sorted result.
376This is not a stable sort.
377@end deffn
378
379@deffn {Scheme Procedure} stable-sort items less
380@deffnx {C Function} scm_stable_sort (items, less)
381Sort the sequence @var{items}, which may be a list or a
382vector. @var{less} is used for comparing the sequence elements.
383This is a stable sort.
384@end deffn
385
386@deffn {Scheme Procedure} stable-sort! items less
387@deffnx {C Function} scm_stable_sort_x (items, less)
388Sort the sequence @var{items}, which may be a list or a
389vector. @var{less} is used for comparing the sequence elements.
390The sorting is destructive, that means that the input sequence
391is modified to produce the sorted result.
392This is a stable sort.
393@end deffn
394
395The procedures in the last group only accept lists or vectors as input,
396as their names indicate.
397
398@deffn {Scheme Procedure} sort-list items less
399@deffnx {C Function} scm_sort_list (items, less)
400Sort the list @var{items}, using @var{less} for comparing the
401list elements. This is a stable sort.
402@end deffn
403
404@deffn {Scheme Procedure} sort-list! items less
405@deffnx {C Function} scm_sort_list_x (items, less)
406Sort the list @var{items}, using @var{less} for comparing the
407list elements. The sorting is destructive, that means that the
408input list is modified to produce the sorted result.
409This is a stable sort.
410@end deffn
411
412@deffn {Scheme Procedure} restricted-vector-sort! vec less startpos endpos
413@deffnx {C Function} scm_restricted_vector_sort_x (vec, less, startpos, endpos)
414Sort the vector @var{vec}, using @var{less} for comparing
3dd6e0cf
MV
415the vector elements. @var{startpos} (inclusively) and
416@var{endpos} (exclusively) delimit
07d83abe
MV
417the range of the vector which gets sorted. The return value
418is not specified.
419@end deffn
420
421
422@node Copying
423@subsection Copying Deep Structures
424
425@c FIXME::martin: Review me!
426
427The procedures for copying lists (@pxref{Lists}) only produce a flat
428copy of the input list, and currently Guile does not even contain
429procedures for copying vectors. @code{copy-tree} can be used for these
430application, as it does not only copy the spine of a list, but also
431copies any pairs in the cars of the input lists.
432
433@deffn {Scheme Procedure} copy-tree obj
434@deffnx {C Function} scm_copy_tree (obj)
435Recursively copy the data tree that is bound to @var{obj}, and return a
cdf1ad3b 436the new data structure. @code{copy-tree} recurses down the
07d83abe
MV
437contents of both pairs and vectors (since both cons cells and vector
438cells may point to arbitrary objects), and stops recursing when it hits
439any other object.
440@end deffn
441
442
443@node General Conversion
444@subsection General String Conversion
445
446@c FIXME::martin: Review me!
447
448When debugging Scheme programs, but also for providing a human-friendly
449interface, a procedure for converting any Scheme object into string
450format is very useful. Conversion from/to strings can of course be done
451with specialized procedures when the data type of the object to convert
452is known, but with this procedure, it is often more comfortable.
453
454@code{object->string} converts an object by using a print procedure for
455writing to a string port, and then returning the resulting string.
456Converting an object back from the string is only possible if the object
457type has a read syntax and the read syntax is preserved by the printing
458procedure.
459
460@deffn {Scheme Procedure} object->string obj [printer]
461@deffnx {C Function} scm_object_to_string (obj, printer)
462Return a Scheme string obtained by printing @var{obj}.
463Printing function can be specified by the optional second
464argument @var{printer} (default: @code{write}).
465@end deffn
466
467
468@node Hooks
469@subsection Hooks
470@tpindex Hooks
471
472A hook is a list of procedures to be called at well defined points in
473time. Typically, an application provides a hook @var{h} and promises
474its users that it will call all of the procedures in @var{h} at a
475defined point in the application's processing. By adding its own
476procedure to @var{h}, an application user can tap into or even influence
477the progress of the application.
478
479Guile itself provides several such hooks for debugging and customization
480purposes: these are listed in a subsection below.
481
482When an application first creates a hook, it needs to know how many
483arguments will be passed to the hook's procedures when the hook is run.
484The chosen number of arguments (which may be none) is declared when the
485hook is created, and all the procedures that are added to that hook must
486be capable of accepting that number of arguments.
487
488A hook is created using @code{make-hook}. A procedure can be added to
489or removed from a hook using @code{add-hook!} or @code{remove-hook!},
490and all of a hook's procedures can be removed together using
491@code{reset-hook!}. When an application wants to run a hook, it does so
492using @code{run-hook}.
493
494@menu
495* Hook Example:: Hook usage by example.
496* Hook Reference:: Reference of all hook procedures.
497* C Hooks:: Hooks for use from C code.
498* GC Hooks:: Garbage collection hooks.
499* REPL Hooks:: Hooks into the Guile REPL.
500@end menu
501
502
503@node Hook Example
504@subsubsection Hook Usage by Example
505
506Hook usage is shown by some examples in this section. First, we will
507define a hook of arity 2 --- that is, the procedures stored in the hook
508will have to accept two arguments.
509
510@lisp
511(define hook (make-hook 2))
512hook
513@result{} #<hook 2 40286c90>
514@end lisp
515
516Now we are ready to add some procedures to the newly created hook with
517@code{add-hook!}. In the following example, two procedures are added,
518which print different messages and do different things with their
519arguments.
520
521@lisp
522(add-hook! hook (lambda (x y)
523 (display "Foo: ")
524 (display (+ x y))
525 (newline)))
526(add-hook! hook (lambda (x y)
527 (display "Bar: ")
528 (display (* x y))
529 (newline)))
530@end lisp
531
532Once the procedures have been added, we can invoke the hook using
533@code{run-hook}.
534
535@lisp
536(run-hook hook 3 4)
537@print{} Bar: 12
538@print{} Foo: 7
539@end lisp
540
541Note that the procedures are called in the reverse of the order with
542which they were added. This is because the default behaviour of
543@code{add-hook!} is to add its procedure to the @emph{front} of the
544hook's procedure list. You can force @code{add-hook!} to add its
545procedure to the @emph{end} of the list instead by providing a third
546@code{#t} argument on the second call to @code{add-hook!}.
547
548@lisp
549(add-hook! hook (lambda (x y)
550 (display "Foo: ")
551 (display (+ x y))
552 (newline)))
553(add-hook! hook (lambda (x y)
554 (display "Bar: ")
555 (display (* x y))
556 (newline))
557 #t) ; @r{<- Change here!}
558
559(run-hook hook 3 4)
560@print{} Foo: 7
561@print{} Bar: 12
562@end lisp
563
564
565@node Hook Reference
566@subsubsection Hook Reference
567
568When you create a hook with @code{make-hook}, you must specify the arity
569of the procedures which can be added to the hook. If the arity is not
570given explicitly as an argument to @code{make-hook}, it defaults to
571zero. All procedures of a given hook must have the same arity, and when
572the procedures are invoked using @code{run-hook}, the number of
573arguments passed must match the arity specified at hook creation time.
574
575The order in which procedures are added to a hook matters. If the third
576parameter to @code{add-hook!} is omitted or is equal to @code{#f}, the
577procedure is added in front of the procedures which might already be on
578that hook, otherwise the procedure is added at the end. The procedures
579are always called from the front to the end of the list when they are
580invoked via @code{run-hook}.
581
582The ordering of the list of procedures returned by @code{hook->list}
583matches the order in which those procedures would be called if the hook
584was run using @code{run-hook}.
585
586Note that the C functions in the following entries are for handling
587@dfn{Scheme-level} hooks in C. There are also @dfn{C-level} hooks which
588have their own interface (@pxref{C Hooks}).
589
590@deffn {Scheme Procedure} make-hook [n_args]
591@deffnx {C Function} scm_make_hook (n_args)
592Create a hook for storing procedure of arity @var{n_args}.
593@var{n_args} defaults to zero. The returned value is a hook
594object to be used with the other hook procedures.
595@end deffn
596
597@deffn {Scheme Procedure} hook? x
598@deffnx {C Function} scm_hook_p (x)
599Return @code{#t} if @var{x} is a hook, @code{#f} otherwise.
600@end deffn
601
602@deffn {Scheme Procedure} hook-empty? hook
603@deffnx {C Function} scm_hook_empty_p (hook)
604Return @code{#t} if @var{hook} is an empty hook, @code{#f}
605otherwise.
606@end deffn
607
608@deffn {Scheme Procedure} add-hook! hook proc [append_p]
609@deffnx {C Function} scm_add_hook_x (hook, proc, append_p)
610Add the procedure @var{proc} to the hook @var{hook}. The
611procedure is added to the end if @var{append_p} is true,
612otherwise it is added to the front. The return value of this
613procedure is not specified.
614@end deffn
615
616@deffn {Scheme Procedure} remove-hook! hook proc
617@deffnx {C Function} scm_remove_hook_x (hook, proc)
618Remove the procedure @var{proc} from the hook @var{hook}. The
619return value of this procedure is not specified.
620@end deffn
621
622@deffn {Scheme Procedure} reset-hook! hook
623@deffnx {C Function} scm_reset_hook_x (hook)
624Remove all procedures from the hook @var{hook}. The return
625value of this procedure is not specified.
626@end deffn
627
628@deffn {Scheme Procedure} hook->list hook
629@deffnx {C Function} scm_hook_to_list (hook)
630Convert the procedure list of @var{hook} to a list.
631@end deffn
632
633@deffn {Scheme Procedure} run-hook hook . args
634@deffnx {C Function} scm_run_hook (hook, args)
635Apply all procedures from the hook @var{hook} to the arguments
636@var{args}. The order of the procedure application is first to
637last. The return value of this procedure is not specified.
638@end deffn
639
640If, in C code, you are certain that you have a hook object and well
641formed argument list for that hook, you can also use
642@code{scm_c_run_hook}, which is identical to @code{scm_run_hook} but
643does no type checking.
644
645@deftypefn {C Function} void scm_c_run_hook (SCM hook, SCM args)
646The same as @code{scm_run_hook} but without any type checking to confirm
647that @var{hook} is actually a hook object and that @var{args} is a
648well-formed list matching the arity of the hook.
649@end deftypefn
650
651For C code, @code{SCM_HOOKP} is a faster alternative to
652@code{scm_hook_p}:
653
654@deftypefn {C Macro} int SCM_HOOKP (x)
655Return 1 if @var{x} is a Scheme-level hook, 0 otherwise.
656@end deftypefn
657
658
659@subsubsection Handling Scheme-level hooks from C code
660
661Here is an example of how to handle Scheme-level hooks from C code using
662the above functions.
663
664@example
665if (scm_is_true (scm_hook_p (obj)))
666 /* handle Scheme-level hook using C functions */
667 scm_reset_hook_x (obj);
668else
669 /* do something else (obj is not a hook) */
670@end example
671
672
673@node C Hooks
674@subsubsection Hooks For C Code.
675
676The hooks already described are intended to be populated by Scheme-level
677procedures. In addition to this, the Guile library provides an
678independent set of interfaces for the creation and manipulation of hooks
679that are designed to be populated by functions implemented in C.
680
681The original motivation here was to provide a kind of hook that could
682safely be invoked at various points during garbage collection.
683Scheme-level hooks are unsuitable for this purpose as running them could
684itself require memory allocation, which would then invoke garbage
685collection recursively @dots{} However, it is also the case that these
686hooks are easier to work with than the Scheme-level ones if you only
687want to register C functions with them. So if that is mainly what your
688code needs to do, you may prefer to use this interface.
689
690To create a C hook, you should allocate storage for a structure of type
691@code{scm_t_c_hook} and then initialize it using @code{scm_c_hook_init}.
692
693@deftp {C Type} scm_t_c_hook
694Data type for a C hook. The internals of this type should be treated as
695opaque.
696@end deftp
697
698@deftp {C Enum} scm_t_c_hook_type
699Enumeration of possible hook types, which are:
700
701@table @code
702@item SCM_C_HOOK_NORMAL
703@vindex SCM_C_HOOK_NORMAL
704Type of hook for which all the registered functions will always be called.
705@item SCM_C_HOOK_OR
706@vindex SCM_C_HOOK_OR
707Type of hook for which the sequence of registered functions will be
708called only until one of them returns C true (a non-NULL pointer).
709@item SCM_C_HOOK_AND
710@vindex SCM_C_HOOK_AND
711Type of hook for which the sequence of registered functions will be
712called only until one of them returns C false (a NULL pointer).
713@end table
714@end deftp
715
716@deftypefn {C Function} void scm_c_hook_init (scm_t_c_hook *hook, void *hook_data, scm_t_c_hook_type type)
717Initialize the C hook at memory pointed to by @var{hook}. @var{type}
718should be one of the values of the @code{scm_t_c_hook_type} enumeration,
719and controls how the hook functions will be called. @var{hook_data} is
720a closure parameter that will be passed to all registered hook functions
721when they are called.
722@end deftypefn
723
724To add or remove a C function from a C hook, use @code{scm_c_hook_add}
725or @code{scm_c_hook_remove}. A hook function must expect three
726@code{void *} parameters which are, respectively:
727
728@table @var
729@item hook_data
730The hook closure data that was specified at the time the hook was
731initialized by @code{scm_c_hook_init}.
732
733@item func_data
734The function closure data that was specified at the time that that
735function was registered with the hook by @code{scm_c_hook_add}.
736
737@item data
738The call closure data specified by the @code{scm_c_hook_run} call that
739runs the hook.
740@end table
741
742@deftp {C Type} scm_t_c_hook_function
743Function type for a C hook function: takes three @code{void *}
744parameters and returns a @code{void *} result.
745@end deftp
746
747@deftypefn {C Function} void scm_c_hook_add (scm_t_c_hook *hook, scm_t_c_hook_function func, void *func_data, int appendp)
748Add function @var{func}, with function closure data @var{func_data}, to
749the C hook @var{hook}. The new function is appended to the hook's list
750of functions if @var{appendp} is non-zero, otherwise prepended.
751@end deftypefn
752
753@deftypefn {C Function} void scm_c_hook_remove (scm_t_c_hook *hook, scm_t_c_hook_function func, void *func_data)
754Remove function @var{func}, with function closure data @var{func_data},
755from the C hook @var{hook}. @code{scm_c_hook_remove} checks both
756@var{func} and @var{func_data} so as to allow for the same @var{func}
757being registered multiple times with different closure data.
758@end deftypefn
759
760Finally, to invoke a C hook, call the @code{scm_c_hook_run} function
761specifying the hook and the call closure data for this run:
762
763@deftypefn {C Function} {void *} scm_c_hook_run (scm_t_c_hook *hook, void *data)
764Run the C hook @var{hook} will call closure data @var{data}. Subject to
765the variations for hook types @code{SCM_C_HOOK_OR} and
766@code{SCM_C_HOOK_AND}, @code{scm_c_hook_run} calls @var{hook}'s
767registered functions in turn, passing them the hook's closure data, each
768function's closure data, and the call closure data.
769
770@code{scm_c_hook_run}'s return value is the return value of the last
771function to be called.
772@end deftypefn
773
774
775@node GC Hooks
776@subsubsection Hooks for Garbage Collection
777
778Whenever Guile performs a garbage collection, it calls the following
779hooks in the order shown.
780
781@defvr {C Hook} scm_before_gc_c_hook
782C hook called at the very start of a garbage collection, after setting
783@code{scm_gc_running_p} to 1, but before entering the GC critical
784section.
785
786If garbage collection is blocked because @code{scm_block_gc} is
787non-zero, GC exits early soon after calling this hook, and no further
788hooks will be called.
789@end defvr
790
791@defvr {C Hook} scm_before_mark_c_hook
792C hook called before beginning the mark phase of garbage collection,
793after the GC thread has entered a critical section.
794@end defvr
795
796@defvr {C Hook} scm_before_sweep_c_hook
797C hook called before beginning the sweep phase of garbage collection.
798This is the same as at the end of the mark phase, since nothing else
799happens between marking and sweeping.
800@end defvr
801
802@defvr {C Hook} scm_after_sweep_c_hook
803C hook called after the end of the sweep phase of garbage collection,
804but while the GC thread is still inside its critical section.
805@end defvr
806
807@defvr {C Hook} scm_after_gc_c_hook
808C hook called at the very end of a garbage collection, after the GC
809thread has left its critical section.
810@end defvr
811
812@defvr {Scheme Hook} after-gc-hook
813@vindex scm_after_gc_hook
814Scheme hook with arity 0. This hook is run asynchronously
815(@pxref{Asyncs}) soon after the GC has completed and any other events
816that were deferred during garbage collection have been processed. (Also
817accessible from C with the name @code{scm_after_gc_hook}.)
818@end defvr
819
820All the C hooks listed here have type @code{SCM_C_HOOK_NORMAL}, are
72b3aa56 821initialized with hook closure data NULL, are invoked by
07d83abe
MV
822@code{scm_c_hook_run} with call closure data NULL.
823
824@cindex guardians, testing for GC'd objects
825The Scheme hook @code{after-gc-hook} is particularly useful in
826conjunction with guardians (@pxref{Guardians}). Typically, if you are
827using a guardian, you want to call the guardian after garbage collection
828to see if any of the objects added to the guardian have been collected.
829By adding a thunk that performs this call to @code{after-gc-hook}, you
830can ensure that your guardian is tested after every garbage collection
831cycle.
832
833
834@node REPL Hooks
835@subsubsection Hooks into the Guile REPL
836
837
838@c Local Variables:
839@c TeX-master: "guile.texi"
840@c End: