home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / wabbit / README < prev    next >
Text File  |  1994-03-28  |  21KB  |  548 lines

  1. @c -*- TeXInfo -*-
  2.  
  3. This is file: /scheme/documentation/README.wabbit
  4.  
  5. @node Top
  6.  
  7. What's up, Doc?
  8. ---------------
  9.  
  10.  The MIT C-Scheme garbage collector has been extended w/ an alternative gc-loop
  11. which supports ``wabbit hunting'' and ``headhunting'' garbage collection.
  12.  
  13.  
  14. To enable wabbit hunting, evaluate: (load-option 'wabbit)  [@xref{Wabbit Hunt}]
  15.  
  16. ``Wabbit hunting'' is when you have a reference to an object and you want to
  17. collect all other references to that same object. For instance, several data
  18. structures may share (alias) the same sub-datum. Wabbit hunting allows you to
  19. collect all such sharers, presumably to update them all in an interesting way
  20. or just to collect sharing statitistics or a sharing histogram.
  21.  
  22.  
  23. To enable headhunting, evaluate: (load-option 'headhunt)  [@xref{Headhunt}]
  24.  
  25. ``Headhunting'' is when you wish to reify all ``headed'' objects in storage
  26. (heap *and* constant space) into one moby vector. Note that base objects such
  27. qas fixnums, Booleans, and characters, etc are not ``headed'': they are not
  28. referenced by an object pointer. Presumably, it is interesting to go
  29. headhunting to gather usage statistics and histograms and to do delicate memory
  30. surgery. For this reason, great care must be taken in groveling over a
  31. ``headhunt collection'' (the result of a headhunting GC).
  32.  
  33.  
  34.  
  35. @menu
  36.  
  37. * Wabbit Descwiptor::          Data abstraction: descriptor of target wabbits
  38.  
  39. * Wabbit Buffer::        The buffer for recording wabbit sightings
  40.  
  41. * Wabbit Hole::            The format of wabbit sighting records
  42.  
  43. * Fudd Thunk::                A thunk to invoke after targets are gathered
  44.  
  45. * Headhunt Collection::        The format of headhunt results
  46.  
  47. * Swabbing Wabbit Descwiptors::    Automagic swabbing upon return from the hunt
  48.  
  49. * Procedures Summary::        Utilities for wabbit hunting and headhunting
  50.  
  51. * Examples::            A few sample wabbit hunts and headhunts.
  52.  
  53. @end menu
  54.  
  55.  
  56. @node Wabbit Descwiptor
  57.  
  58. A ``Wabbit Descwiptor'' is a 4-element vector:
  59.  
  60.     ------------------------------------------------------------------------
  61.     0. Boolean hunt disable flag -- (a.k.a. ``duck season'' flag)
  62.                                     avoid wabbit hunting and/or headhunting
  63.                                     upon the next GC flip.
  64.                                     (@pxref{Wabbit Season and Duck Season,
  65.                                             Duck Season})
  66.  
  67.     1. Wabbit vector -- vector of object references to target objects
  68.                         (a.k.a. ``wabbits'')
  69.  
  70.     2. Wabbit buffer -- vector into which wabbit sightings are recorded.
  71.                         This must be of length (2 + twice wabbit vect len).
  72.                         (For details of wabbit sightings, @pxref{Wabbit Holes})
  73.  
  74.     3. Boolean headhunt enable flag -- if FALSE, no headhunt is performed.
  75.                                        else this slot will be replaced by a
  76.                                          headhunt collection upon completion
  77.                                          of the headhunting wabbit hunt.
  78.                                        (@xref{Headhunt Collection})
  79.     ------------------------------------------------------------------------
  80.  
  81.  ****
  82.   NB  a) Both the WABBIT-VECTOR and the WABBIT-BUFFER must reside in the heap
  83.  ****      i.e., they may *not* reside in constant space or on the stack.
  84.  
  85.       b) Both the wabbit buffer and the headhunt collection slots are zeroed
  86.           upon return, since they may contain unsafe pointers. Moreover, it
  87.           is unsafe for the FUDD-THUNK (@ref{Fudd Thunk}) return them or
  88.           otherwise close over them. Consider them only to be very fluid
  89.           parameter sources for the FUDD-THUNK.
  90.  
  91.  
  92. @node Fudd Thunk
  93.  
  94. What's a Fudd Thunk?
  95. --------------------
  96.  
  97.    After the hunt has concluded, all the target wabbits (if any) will reside in
  98. the wabbit buffer of the wabbit descwiptor and all heads collected (if any)
  99. will reside in the headhunt-collection slot of the wabbit descwiptor. It is at
  100. this point that the FUDD-THUNK is invoked.
  101.  
  102.    A ``FUDD-THUNK'' is a procedure of no arguments. Whatever result it returns
  103. is the result of the call to WABBIT-HUNT or HEADHUNT, whichever was called. It
  104. is therefore imperative that the FUDD-THUNK not return unsafe values (wabbit
  105. holes that might reference the stack).
  106.  
  107.  Normally, you will write Fudd thunks which use (GET-WABBIT-DESCWIPTOR) and the
  108. wabbit buffer and headhunt collection accessors on wabbit descwiptors. See the
  109. example section below for a few samples of how the Fudd thunks are used. Most
  110. important, note the upon exit from a call to WABBIT-HUNT or HEADHUNT, the
  111. wabbit buffer and headhunt collection in the wabbit descwiptor are ``swabbed''
  112. soas to release wascally wabit holes and the moby headhunt collection. See the
  113. ``swabbing'' section below.
  114.  
  115.  
  116. Default Fudd Thunks
  117. -------------------
  118.  
  119.   The default Fudd-thunk for wabbit hunting is fluid-bound to the global
  120. variable *DEFAULT-FUDD-THUNK*.  The default Fudd thunk merely returns the
  121. wabbit buffer, which will have been swabbed in the return process. That is, its
  122. wabbit holes will have been nullified.
  123.  
  124.   The default Fudd-thunk for headhunting is fluid-bound to the global variable
  125. *DEFAULT-HEADHUNT-FUDD-THUNK* The default headhunt Fudd thunk returns the
  126. headhunt collection. This will *not* have been swabbed out (but the headhunt
  127. collection slot in the wabbit descwiptor will have been swabbed), so you must
  128. be careful what you do with the result of HEADHUNT called with the default
  129. headhunt Fudd thunk. It is best to simply drop it, being careful not to let the
  130. printer hash it as the result of an interactive REPL call.
  131.  
  132.  @xref{Default Fudd Thunks} for more details.
  133.  
  134.  
  135. @node Wabbit Buffer
  136.  
  137.  The ``Wabbit Buffer'' should be a vector of FALSEs before the wabbit hunting
  138. is initiated. At the end of the wabbit hunt, the wabbit buffer contents will
  139. be laid out as follows:
  140.  
  141.   --------------------------------------------------------------------------
  142.   slot 0 = Boolean flag: TRUE  if all wabbit sightings were recorded in the
  143.                                   wabbit buffer
  144.                          FALSE if the wabbit buffer was too small to accomo-
  145.                                   date a record for each wabbit sighting.
  146.                                   (In this case, the FUDD-THUNK should do a
  147.                                      bit of cleanup work so the same wabbit
  148.                                      hunt can be re-initiated later.)
  149.  
  150.   slot 1 = Fixnum: number of wabbit sightings recorded in the wabbit buffer
  151.  
  152.   slot 2 = Object reference: cite of first wabbit sighting (``wabbit hole'')
  153.  
  154.   slot 3 = Number: offset into first sighting object where wabbit is hiding
  155.   --------------------------------------------------------------------------
  156.  
  157. ...and so on, with even-index slots containing wabbit holes and odd-index
  158. slots, indices. Note that slot 1 should hold the index of the first even
  159. slot that holds FALSE and all slots thereafter should likewise hold FALSE.
  160.  
  161. It is not really essential that the wabbit buffer be cleared before a hunt
  162. since the slot 1 indicates the index of the first garbage slot. Nonetheless, it
  163. is poor form to supply a populated vector.
  164.  
  165. Note also that the wabbit buffer will be ``swabbed'' upon return from the hunt.
  166. (@xref{Swabbing Wabbit Descwiptors}).
  167.  
  168.  
  169. @node Wabbit Hole
  170.  
  171.  A ``Wabbit Hole'' is normally a headed object reference (a pointer) but it
  172. may in very rare circumstances be a ``wascally wabbit hole''. There are only
  173. three kinds of wascally wabbit holes:
  174.  
  175.  ---------------------------------------------------------------------------
  176.  1. Characters: these indicate references to wabbit holes in constant space.
  177.                 To reify the character into a cell whose contents holds the
  178.                 wabbit, apply CELLIFY (@ref{Cellify}) to the slot ref that
  179.                 holds the char.
  180.  
  181.                 (NB: the char as printed holds only part of the addr; you
  182.                      must vector-ref into the wabbit buffer to get all the
  183.                      addr bits. This is incredible magic.)
  184.  
  185.  2. Null  Refs: these indicate headless objects. They should never appear.
  186.  
  187.  3. Stack Refs: these indicate objects on the control stack. Since we reify
  188.                 the stack into the heap as part of the call to WABBIT-HUNT and
  189.                 HEADHUNT, these too should never appear unless you are doing
  190.                 something painfully obscure (and dangerous!).
  191.  ---------------------------------------------------------------------------
  192.  
  193. If you ever encounter Null or Stack wabbit holes, you may want to send a
  194. friendly bug report (?) to bug-cscheme@zurich.ai.mit.edu with a reproducable
  195. test script. (If we cannot reproduce it, we cannot fix it.)
  196.  
  197.  
  198. @node Headhunt Collection
  199.  
  200. The ``Headhunt Collection'' is a vector of arbitrary (fixnum) length. It is
  201. intended to contain a pointer to the head of every object in the heap which has
  202. an object header (spec., numbers, Booleans, etc not included). If all headed
  203. heap objects fit in the space available after the GC flip, then slot 0 of this
  204. headhunt collection is TRUE. If not, slot 0 is FALSE and the vector contains as
  205. many object head references as actually did fit.
  206.  
  207.  
  208. ************ Be verwy verwy careful when headhunting... if you are not careful
  209. ** CAVEAT ** to release the headhunt collection (e.g., don't let it escape) or
  210. ************ if you gobble up too much intermediate state in traversing it, you
  211.              will exhaust the available heap space and go down in flames. This
  212.              is a very fragile system memory feature intended for only the
  213.              most ginger-fingered discriminating systems wizards. For instance
  214.              it may someday lead to a post-GC garbage scavenger. Nonetheless,
  215.              it readily lends itself to self abuse if not treated reverently.
  216.  
  217.  
  218. @node Swabbing Wabbit Descwiptors
  219.  
  220. Swabbing Wabbit Descwiptors
  221. ---------------------------
  222.  
  223.   Upon exit from WABBIT-HUNT or HEADHUNT, the wabbit descwiptor with repsect to
  224. which the hunt was performed will be ``swabbed'' so as to release the wabbit
  225. holes and the headhunt collection. Specifically, the first two slots of the
  226. WABBIT-BUFFER (indicating all-found? and index-of-first-null) are left
  227. unmolested. The remainder of the WABBIT-BUFFER is cleared back to all be #F.
  228. This way no dangerous wabbit holes (e.g., stack refs) will be left dangling in
  229. the wabbit descwiptor after the hunt. In addition, the HEADHUNT-COLLECTION slot
  230. of the wabbit descwiptor is set to the number of heads collected, which is then
  231. negated if not all heads were accomodated by the heap. That is, if say
  232. 314159264 were found but more heads existed but could not fit in the
  233. headhhunt-collection, then the headhunt-collection slot of the wabbit
  234. descwiptor will be set to -314159264.
  235.  
  236.   Note that the HEADHUNT-COLLECTION vector itself is not cleared: this could
  237. waste a lot of time and would not really free up significant space since the
  238. vector would still exist in the heap. It is therefore important that you not
  239. carelessly return the HEADHUNT-COLLECTION from the thunk since this could allow
  240. its subsequent capture, from instance by the hashing printer in the interactive
  241. REPL. Moreover, this HEADHUNT-COLLECTION may contain entries that were moved
  242. into the heap from the stack by the nature of the WABBIT-HUNT/HEADHUNT calls
  243. (they do a call-with-current-continuation to reify the control stack onto the
  244. heap). Thus, the HEADHUNT-COLLECTION may contain dangerous pointers after the
  245. return from the hunt call. You can crash your Scheme in a very nasty way if you
  246. do not take heed of this danger.
  247.  
  248. [Implementors' note: this swabbing is accomplished via an unwind protect which
  249.                      calls gc-wabbit::%swab-wad upon exit from the hunt.]
  250.  
  251.  
  252. @node Procedures Summary
  253.  
  254. @menu
  255.  
  256. * Wabbit Hunt::
  257. * Wabbit Season and Duck Season::
  258. * Wabbit Descwiptors::
  259. * Default Fudd Thunks::
  260. * Cellify::
  261. * Headhunt::
  262.  
  263. @end menu
  264.  
  265.  
  266. @node Wabbit Hunt
  267.  
  268. (WABBIT-HUNT WABBIT-DESCWIPTOR #!optional FUDD-THUNK)
  269.  
  270.    Open wabbit season on wabbits matching WABBIT-DESCWIPTOR (@ref{Wabbit
  271.    Descwiptor}) and go wabbit hunting. Once all the wabbits have been wounded
  272.    up, invoke FUDD-THUNK (@ref{Fudd Thunk}), weturning the wesult of FUDD-THUNK
  273.    as the wesult of the wabbit hunt. 
  274.    
  275.    The optional FUDD-THUNK pawameter defaults to the value of the fluid
  276.    vawiable: *DEFAULT-FUDD-THUNK* (@ref{Default Fudd Thunks}), which defaults
  277.    to just weturning the wabbit buffer (which will have been swabbed upon
  278.    return!).
  279.  
  280.  
  281. @node Wabbit Season and Duck Season
  282.  
  283. (WABBIT-SEASON! WABBIT-DESCWIPTOR)
  284.  
  285.    Declare open season on wabbits matching our target descwiptor.
  286.    Returns the old wabbit descwiptor (possibly FALSE).
  287.  
  288. (DUCK-SEASON!)
  289.  
  290.    Disable wabbit hunting... returns descwiptor from latest wabbit hunt.
  291.  
  292. ****
  293.  NB  WABBIT/DUCK-SEASON! both mutate the system wabbit descwiptor accessed via
  294. ****                     calls to (GET-WABBIT-DESCWIPTOR).
  295.  
  296.  
  297. (WABBIT-SEASON?)
  298. (  DUCK-SEASON?)
  299.  
  300.   It is wabbit season if the value returned by (GET-WABBIT-DESCWIPTOR) is a
  301. valid wabbit descwiptor with the hunt-disable flag disabled (i.e., hunt is
  302. enabled). Otherwise, it is duck season.
  303.  
  304.  
  305. @node Wabbit Descwiptors 
  306.  
  307. (GET-WABBIT-DESCWIPTOR)
  308.  
  309.   Returns the current wabbit descwiptor as installed by WABBIT/DUCK-SEASON!
  310. (which are implicitly called from WABBIt-HUNT and HEADHUNT). This may *not*
  311. always be a valid instance of a WABBIT-DESCWIPTOR so it is best to check the
  312. result using (WABBIT-DESCWIPTOR object).
  313.  
  314.  
  315. (WABBIT-DESCWIPTOR? object)
  316.  
  317.   Returns TRUE if OBJECT is a 4-element vector; FALSE otherwise. That is, the
  318. WABBIT-DESCWIPTOR is a transparent type (non-opaque).
  319.  
  320.  
  321. The painfully obvious creator, selectors and mutators are as follows:
  322.  
  323. (MAKE-WABBIT-DESCWIPTOR hunt-disable-flag 
  324.                         wabbit-vector
  325.                         wabbit-buffer
  326.                         headhunt-enable-flag)
  327.  
  328.  
  329.     (WABBIT-DESCWIPTOR/HUNT-DISABLE-FLAG     wabbit-descwiptor)
  330.     (WABBIT-DESCWIPTOR/WABBIT-VECTOR         wabbit-descwiptor)
  331.     (WABBIT-DESCWIPTOR/WABBIT-BUFFER         wabbit-descwiptor)
  332.     (WABBIT-DESCWIPTOR/HEADHUNT-ENABLE-FLAG  wabbit-descwiptor)
  333.  
  334. (SET-WABBIT-DESCWIPTOR/HUNT-DISABLE-FLAG!    wabbit-descwiptor new-value)
  335. (SET-WABBIT-DESCWIPTOR/WABBIT-VECTOR!        wabbit-descwiptor new-value)
  336. (SET-WABBIT-DESCWIPTOR/WABBIT-BUFFER!        wabbit-descwiptor new-value)
  337. (SET-WABBIT-DESCWIPTOR/HEADHUNT-ENABLE-FLAG! wabbit-descwiptor new-value)
  338.  
  339.  
  340. In addition, the following aliases were thought to be handy:
  341.  
  342.      WABBIT-DESCWIPTOR/HEADHUNT-COLLECTION  =
  343.      WABBIT-DESCWIPTOR/HEADHUNT-ENABLE-FLAG
  344.  
  345.  SET-WABBIT-DESCWIPTOR/HEADHUNT-COLLECTION! =
  346.  SET-WABBIT-DESCWIPTOR/HEADHUNT-ENABLE-FLAG!
  347.  
  348.  
  349. @xref{Wabbit Descwiptor} for details of the components' types and formats.
  350.  
  351.  
  352. @node Default Fudd Thunks
  353.  
  354. The default Fudd thunks (@ref{Fudd Thunk}) for the various hunts are as follows:
  355.  
  356. Wabbit Hunting
  357. --------------
  358.  
  359. *DEFAULT-FUDD-THUNK*
  360.  
  361. Global fluid variable bound to a procedure of no arguments that is called upon
  362. collection of all the wabbit holes into the wabbit buffer (and heads into the
  363. HEADHUNT-COLLECTION if headhunting is enabled)
  364.  
  365.  
  366.  
  367. Headhunting
  368. -----------
  369.  
  370. *DEFAULT-HEADHUNT-FUDD-THUNK*
  371.  
  372. Global fluid variable bound to a procedure of no arguments that is called upon
  373. collection of all heads during HEADHUNTing (and upon collection of all wabbit
  374. holes into the wabbit buffer if the wabbit vector is non-empty).
  375.  
  376.  
  377. *DEFAULT-HEADHUNT-WABBIT-DESCWIPTOR*
  378.  
  379. The default wabbit descwiptor used by calls to HEADHUNT. It contains a null
  380. wabbit-vector and a wabbit buffer of only two slots (for the flag and index).
  381. This is a global variable that can be fluid bound to any valid wabbit
  382. descwiptor instance.
  383.  
  384.  
  385. @node Cellify
  386.  
  387. (CELLIFY CONSTANTSPACE-WABBIT-HOLE) ;; c-space wabbit holes print as characters
  388.  
  389.   This is a *very* precarious hack. It returns a cell whose contents point to
  390. the wabbit hole in constant space (@xref{Wabbit Hole}). This cell should not be
  391. permitted to escape from the Fudd thunk where (presumably) it was created, else
  392. a spurious pointer into constant space would result and who knows how it might
  393. piss off the garbage collector. Specifically, don't go pretty-printing these
  394. cells 'cause the printer hashes output so the display hashtable will capture
  395. the cell.
  396.  
  397.   In general, you should go have a nice calm discussion with a system wizard
  398. before frobbing with CELLIFY. It can save you a *lot* of trouble, believe me.
  399.  
  400.  
  401. @node Headhunt
  402.  
  403. (HEADHUNT #!optional HEADHUNT-FUDD-THUNK HEADHUNT-WABBIT-DESCWIPTOR)
  404.  
  405. The HEADHUNT-WABBIT-DESCWIPTOR is installed, which declares open season on no
  406. wabbits but does call for headhunting to commence. Afterward, the
  407. HEADHUNT-FUDD-THUNK is invoked (on no arguments) and its result it the result
  408. of the call to HEADHUNT.
  409.  
  410. The optional HEADHUNT-FUDD-THUNK parameter default to the value of
  411. *DEFAULT-HEADHUNT-FUDD-THUNK* (@ref{Default Fudd Thunks}. Similarly for
  412. HEADHUNT-WABBIT-DESCWIPTOR.
  413.  
  414. As with WABBIT-HUNTing Fudd thunks, the HEADHUNT-FUDD-THUNK is free to access
  415. the wabbit descwiptors wabbit-buffer and headhunt-collection slots, but should
  416. be careful in doing so. Letting dangerous bits escape can be treacherous.
  417.  
  418. Also, as with WABBIT-HUNTing, the wabbit descwiptor is swabbed (@ref{Swabbing
  419. Wabbit Descwiptors}) upon completion of the hunt. (In fact, this is just an
  420. alternative caller interface to the WABBIT-HUNT procedure for those more
  421. interested in headhunting than in wabbit hunting. To each his own.)
  422.  
  423.  
  424.  
  425. @node Examples
  426.  
  427. ;;;
  428. ;;; Sample usage (and mis-usage)
  429. ;;;
  430.  
  431. @menu
  432.  
  433. * Wreckless::      Wabbit Hunt -  mis-use / abuse
  434. * Non-Wreckless::  Wabbit Hunt - good use
  435. * Dangerous::      Wabbit Hunt - poor use
  436. * Semi-Wreckless::    Headhunt - fair use
  437.  
  438. @end menu
  439.  
  440.  
  441. @node Wreckless
  442.  
  443. #| Sample wreckless wabbit hunt... (does not swab the wabbit buffer)
  444.   --------------------------------
  445. (define foobarbaz (cons 'a 'b))
  446.  
  447. (begin
  448.   (wabbit-season!
  449.    (make-wabbit-descwiptor false           ; hunt     disable flag disabled
  450.                (vector foobarbaz)  ; wabbit vector
  451.                (make-vector 10 #f) ; wabbit buffer
  452.                false           ; headhunt enable flag disabled
  453.                ))
  454.   'be-careful!)
  455.  
  456. (gc-flip)
  457.  
  458. (define done (duck-season!))
  459.  
  460. (pp done)  ; lookin' for trouble
  461.  
  462. ;returns: #(#t #((a . b)) #(#t 4 (foobarbaz a . b) 1 () () () () () ()) ())
  463. |#
  464.  
  465.  
  466. @node Non-Wreckless
  467.  
  468. #| Sample non-wreckless wabbit hunt... (safe wabbit hole count)
  469.   ------------------------------------
  470. (wabbit-hunt
  471.  (make-wabbit-descwiptor false             ; hunt    disable flag disabled
  472.              (vector foobarbaz)  ; wabbit vector
  473.              (make-vector 10 #f) ; wabbit buffer
  474.              false             ; headhunt enable flag disabled
  475.              ))
  476.  
  477. ; evaluated repeatedly... (stable wabbit hole count... holes swabbed upon exit)
  478. ;
  479. ;Value 31: #(#t 6 () () () () () () () ())  ; - 6 = wabbit hole count + 2
  480. ;Value 32: #(#t 6 () () () () () () () ())
  481. ;Value 33: #(#t 6 () () () () () () () ())
  482. |#
  483.  
  484.  
  485. @node Dangerous
  486.  
  487. #| Sample dangerous wabbit hunt... (fudd thunk exposes the wabbit holes...hash)
  488.   -----------------------------
  489. (wabbit-hunt
  490.  (make-wabbit-descwiptor false             ; hunt    disable flag disabled
  491.              (vector foobarbaz)  ; wabbit vector
  492.              (make-vector 10 #f) ; wabbit buffer
  493.              false             ; headhunt enable flag disabled
  494.              )
  495.  (named-lambda (exposing-fudd-thunk)
  496.    (let* ((wabbuf (wabbit-descwiptor/wabbit-buffer (get-wabbit-descwiptor)))
  497.       (got-em-all?       (vector-ref wabbuf 0))
  498.       (last-hole-index (vector-ref wabbuf 1)))
  499.      (display "\n; #(")
  500.      (do ((index 2 (1+ index)))
  501.      ((>= index last-hole-index)
  502.       (if got-em-all?
  503.           (display ")\n; Th-th-th-that's all folks!")
  504.           (display ")\n; And many more.... maybe?!?"))
  505.       (newline))
  506.        (write (vector-ref wabbuf index)) ; DANGER! WRITE hashes output.
  507.        (write-char #\Space)))))
  508.  
  509. ; evaluated repeatedly... (stable display)
  510.  
  511. ; #((foobarbaz a . b) 1 #((a . b)) 1 )
  512. ; Th-th-th-that's all folks!
  513. ;No value
  514.  
  515. ; #((foobarbaz a . b) 1 #((a . b)) 1 )
  516. ; Th-th-th-that's all folks!
  517. ;No value
  518.  
  519. ; #((foobarbaz a . b) 1 #((a . b)) 1 )
  520. ; Th-th-th-that's all folks!
  521. ;No value
  522.  
  523. ; #((foobarbaz a . b) 1 #((a . b)) 1 )
  524. ; Th-th-th-that's all folks!
  525. ;No value
  526. |#
  527.  
  528.  
  529. @node Semi-Wreckless
  530.  
  531. #| Sample semi-wreckless headhunt... (default headhunt-fudd-thunk exposes coll)
  532.   -------------------------------
  533.  
  534. (begin (headhunt)
  535.        (wabbit-descwiptor/headhunt-enable-flag (get-wabbit-descwiptor)))
  536.  
  537. ; evaluated repeatedly... (stable head count... if negative, partial count)
  538. ;
  539. ;Value: 23648
  540. ;Value: 23648
  541. ;Value: 23648
  542. |#
  543.  
  544.  
  545. @c Local Variables:
  546. @c compile-command: "simple-make-info /scheme/documentation/README.wabbit wabbit"
  547. @c End:
  548.