Fluidize *random-state*.
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Sat, 8 Feb 2014 20:02:42 +0000 (13:02 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Tue, 12 Aug 2014 00:30:29 +0000 (17:30 -0700)
doc/ref-manual/numbers.texi
src/runtime/random.scm

index 72b047c1ba39dc94d9ea0296645c14d0a534551b..711fca001e6a391b9e2d3b5d91cc60e72703130e 100644 (file)
@@ -1364,7 +1364,7 @@ either an exact integer or an inexact real; the current implementation
 has been tuned to make these two cases fast.
 
 If @var{state} is given and not @code{#f}, it must be a random-state
-object; otherwise, it defaults to the value of the variable
+object; otherwise, it defaults to the value of the fluid
 @code{*random-state*}.  This object is used to maintain the state of the
 pseudo-random-number generator and is altered as a side effect of the
 @code{random} procedure.
@@ -1399,20 +1399,20 @@ procedure.  This allows a particular random-state object to be saved in
 order to replay a particular pseudo-random sequence.
 
 @defvr variable *random-state*
-This variable holds a data structure, a random-state object, that
+The value of this fluid is a data structure, a random-state object, that
 encodes the internal state of the random-number generator that
 @code{random} uses by default.  A call to @code{random} will perform a
-side effect on this data structure.  This variable may be changed, using
-@code{set!} or @code{fluid-let}, to hold a new random-state object.
+side effect on this data structure.  The fluid may be changed, using
+@code{set-fluid!} or @code{let-fluid}, to hold a new random-state object.
 @end defvr
 
 @deffn procedure make-random-state [state]
 This procedure returns a new random-state object, suitable for use as
-the value of the variable @code{*random-state*}, or as the @var{state}
+the value of the fluid @code{*random-state*}, or as the @var{state}
 argument to @code{random}.  If @var{state} is not given or @code{#f},
 @code{make-random-state} returns a @emph{copy} of the current
-random-number state object (the value of the variable
-@code{*random-state*}).  If @var{state} is a random-state object, a copy
+random-number state object (the value of the @code{*random-state*}
+fluid object).  If @var{state} is a random-state object, a copy
 of that object is returned.  If @var{state} is @code{#t}, then a new
 random-state object is returned that has been ``randomly'' initialized
 by some means (such as by a time-of-day clock).
index cc4d4584c140b5ec593343fea73d606e56e4ca7b..6fbcc33f716598b4be8279eda80569ca680a3863 100644 (file)
@@ -373,14 +373,17 @@ USA.
        (if (not (random-state? state))
            (error:wrong-type-argument state "random state" procedure))
        state)
-      (let ((state *random-state*))
+      (let ((state (if *random-state*
+                      (fluid *random-state*)
+                      ;; For early in the cold-load...
+                      default-random-source)))
        (if (not (random-state? state))
            (error "Invalid *random-state*:" state))
        state)))
 \f
 ;;;; Initialization
 
-(define *random-state*)
+(define *random-state* #f)
 (define flimit.)
 (define flimit)
 (define default-random-source)
@@ -388,24 +391,25 @@ USA.
 (define random-real)
 
 (define (initialize-package!)
-  (set! *random-state* (simple-random-state))
   (set! flimit.
        (let loop ((x 1.))
          (if (flo:= (flo:+ x 1.) 1.)
              (flo:/ 1. x)
              (loop (flo:/ x 2.)))))
   (set! flimit (flo:truncate->exact flimit.))
-  (set! default-random-source *random-state*)
+  (set! default-random-source (simple-random-state))
   (set! random-integer (random-source-make-integers default-random-source))
   (set! random-real (random-source-make-reals default-random-source))
   unspecific)
 
 (define (finalize-random-state-type!)
+  (set! *random-state* (make-fluid default-random-source))
   (add-event-receiver! event:after-restart
     (lambda ()
-      (random-source-randomize! *random-state*)
-      (if (not (eq? default-random-source *random-state*))
-         (random-source-randomize! default-random-source))))
+      (let ((state (fluid *random-state*)))
+       (random-source-randomize! state)
+       (if (not (eq? default-random-source state))
+           (random-source-randomize! default-random-source)))))
   (named-structure/set-tag-description! random-state-tag
     (make-define-structure-type 'VECTOR
                                'RANDOM-STATE