api-utility.texi 28 KB

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