*** empty log message ***
[bpt/guile.git] / NEWS
diff --git a/NEWS b/NEWS
index c866ffb..50485e0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,21 +8,36 @@ Changes since Guile 1.3:
 
 * Changes to the stand-alone interpreter
 
-** New options interface: readline-options,
-readline-enable, readline-disable, readline-set!
+** Command-line editing is enhanced.
 
-** Command line history is now restored from and saved to file
+If you have a sufficiently recent version of the GNU readline library
+installed on your system, Guile will use it to read expressions
+interactively.  
 
-If readline is used and the readline option `history-file' is enabled,
-the command line history is read from file when the interpreter is
-entered, and written to file on exit.  The filename used can be
-specified with the environment variable GUILE_HISTORY.  Default file
-name is "$HOME/.guile_history".  Nothing special happens if errors
-occur during read or write.
+You can now use the readline-options interface to control readline's
+behavior.  You can now control the readline library's behavior by
+changing the options listed below.
 
-** Command line history length can now be customized.
-Command line history length is now controlled by the readline option
-`history-length'.  Default is 200 lines.
+  (readline-enable 'history-file)
+    Tell readline to record your commands in a file when you exit
+    Guile, and restore them when you restart Guile.  By default, Guile
+    saves commands to `$HOME/.guile_history', but if the
+    `GUILE_HISTORY' environment variable is set, Guile will use its
+    value as the name of the history file.
+
+    If Guile is unable to save or restore lines from the history file,
+    the operation is simply not performed; the user is not notified.
+
+  (readline-disable 'history-file)
+    Tell Guile not to save or restore command history.
+
+  (readline-set! history-length N)
+    Tell Guile to save at most N lines of command history.
+
+  (readline-set! bounce-parens N)
+    Tell Guile to indicate the matching opening parenthesis when you
+    type a closing parenthesis, by resting the cursor on it for N
+    milliseconds.  If N is zero, do not highlight opening parethesis.
 
 ** All builtins now print as primitives.
 Previously builtin procedures not belonging to the fundamental subr
@@ -35,27 +50,145 @@ in backtraces.
 
 * Changes to Scheme functions and syntax
 
-** New module: (ice-9 setf)
-Implements generalized references a la Common LISP.
-
-*** New syntax: setf! PLACE VALUE
-Puts VALUE in location specified by PLACE.  setf! is more general than
-set! in the sense that PLACE can be a form (GETTER EXP1 EXP2 ...).  The
-setf! expression will be transformed into (SETTER EXP1 EXP2 ... VALUE)
-where SETTER is a procedure or macro which has previously been
-associated with GETTER.
-
-Example:
-
- (setf! (car x) 4) <=> (set-car! x 4)
-
-*** New syntax: setter GETTER
-The name of the SETTER of GETTER.  The way to associate a SETTER with
-a GETTER is: (setf! (setter GETTER) SETTER)
-
-Example:
-
-  (setf! (setter car) set-car!)
+** New syntax: and-let*
+Guile now supports the `and-let*' form, described in the draft SRFI-2.
+
+Syntax: (land* (<clause> ...) <body> ...)
+Each <clause> should have one of the following forms:
+  (<variable> <expression>)
+  (<expression>)
+  <bound-variable>
+Each <variable> or <bound-variable> should be an identifier.  Each
+<expression> should be a valid expression.  The <body> should be a
+possibly empty sequence of expressions, like the <body> of a
+lambda form.
+
+Semantics: A LAND* expression is evaluated by evaluating the
+<expression> or <bound-variable> of each of the <clause>s from
+left to right.  The value of the first <expression> or
+<bound-variable> that evaluates to a false value is returned; the
+remaining <expression>s and <bound-variable>s are not evaluated.
+The <body> forms are evaluated iff all the <expression>s and
+<bound-variable>s evaluate to true values.
+
+The <expression>s and the <body> are evaluated in an environment
+binding each <variable> of the preceding (<variable> <expression>)
+clauses to the value of the <expression>.  Later bindings
+shadow earlier bindings.
+
+Guile's and-let* macro was contributed by Michael Livshin.
+
+** New function: sorted? SEQUENCE LESS?
+Returns `#t' when the sequence argument is in non-decreasing order
+according to LESS? (that is, there is no adjacent pair `... x y
+...' for which `(less? y x)').
+
+Returns `#f' when the sequence contains at least one out-of-order
+pair.  It is an error if the sequence is neither a list nor a
+vector.
+
+** New function: merge LIST1 LIST2 LESS?
+LIST1 and LIST2 are sorted lists.
+Returns the sorted list of all elements in LIST1 and LIST2.
+
+Assume that the elements a and b1 in LIST1 and b2 in LIST2 are "equal"
+in the sense that (LESS? x y) --> #f for x, y in {a, b1, b2},
+and that a < b1 in LIST1.  Then a < b1 < b2 in the result.
+(Here "<" should read "comes before".)
+
+** New procedure: merge! LIST1 LIST2 LESS?
+Merges two lists, re-using the pairs of LIST1 and LIST2 to build
+the result.  If the code is compiled, and LESS? constructs no new
+pairs, no pairs at all will be allocated.  The first pair of the
+result will be either the first pair of LIST1 or the first pair of
+LIST2.
+
+** New function: sort SEQUENCE LESS?
+Accepts either a list or a vector, and returns a new sequence
+which is sorted.  The new sequence is the same type as the input.
+Always `(sorted? (sort sequence less?) less?)'.  The original
+sequence is not altered in any way.  The new sequence shares its
+elements with the old one; no elements are copied.
+
+** New procedure: sort! SEQUENCE LESS
+Returns its sorted result in the original boxes.  No new storage is
+allocated at all.  Proper usage: (set! slist (sort! slist <))
+
+** New function: stable-sort SEQUENCE LESS?
+Similar to `sort' but stable.  That is, if "equal" elements are
+ordered a < b in the original sequence, they will have the same order
+in the result.
+
+** New function: stable-sort! SEQUENCE LESS?
+Similar to `sort!' but stable.
+Uses temporary storage when sorting vectors.
+
+** New functions: sort-list, sort-list!
+Added for compatibility with scsh.
+
+** New function: random N [STATE]
+Accepts a positive integer or real N and returns a number of the
+same type between zero (inclusive) and N (exclusive).  The values
+returned have a uniform distribution.
+
+The optional argument STATE must be of the type produced by
+`copy-random-state' or `seed->random-state'.  It defaults to the value
+of the variable `*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 `random' operation.
+
+** New variable: *random-state*
+Holds a data structure that encodes the internal state of the
+random-number generator that `random' uses by default.  The nature
+of this data structure is implementation-dependent.  It may be
+printed out and successfully read back in, but may or may not
+function correctly as a random-number state object in another
+implementation.
+
+** New function: copy-random-state [STATE]
+Returns a new object of type suitable for use as the value of the
+variable `*random-state*' and as a second argument to `random'.
+If argument STATE is given, a copy of it is returned.  Otherwise a
+copy of `*random-state*' is returned.
+
+** New function: seed->random-state SEED
+Returns a new object of type suitable for use as the value of the
+variable `*random-state*' and as a second argument to `random'.
+SEED is a string or a number.  A new state is generated and
+initialized using SEED.
+
+** New function: random:uniform [STATE]
+Returns an uniformly distributed inexact real random number in the
+range between 0 and 1.
+
+** New procedure: random:solid-sphere! VECT [STATE]
+Fills VECT with inexact real random numbers the sum of whose
+squares is less than 1.0.  Thinking of VECT as coordinates in
+space of dimension N = `(vector-length VECT)', the coordinates are
+uniformly distributed within the unit N-shere.  The sum of the
+squares of the numbers is returned.  VECT can be either a vector
+or a uniform vector of doubles.
+
+** New procedure: random:hollow-sphere! VECT [STATE]
+Fills VECT with inexact real random numbers the sum of whose squares
+is equal to 1.0.  Thinking of VECT as coordinates in space of
+dimension n = `(vector-length VECT)', the coordinates are uniformly
+distributed over the surface of the unit n-shere.  VECT can be either
+a vector or a uniform vector of doubles.
+
+** New function: random:normal [STATE]
+Returns an inexact real in a normal distribution with mean 0 and
+standard deviation 1.  For a normal distribution with mean M and
+standard deviation D use `(+ M (* D (random:normal)))'.
+
+** New procedure: random:normal-vector! VECT [STATE]
+Fills VECT with inexact real random numbers which are independent and
+standard normally distributed (i.e., with mean 0 and variance 1).
+VECT can be either a vector or a uniform vector of doubles.
+
+** New function: random:exp STATE
+Returns an inexact real in an exponential distribution with mean 1.
+For an exponential distribution with mean U use (* U (random:exp)).
 
 ** The range of logand, logior, logxor, logtest, and logbit? have changed.
 
@@ -66,6 +199,13 @@ These functions used to operate on numbers in the range of a C signed
 long; however, this seems inappropriate, because Guile integers don't
 overflow.
 
+** New function: make-guardian
+This is an implementation of guardians as described in
+R. Kent Dybvig, Carl Bruggeman, and David Eby (1993) "Guardians in a
+Generation-Based Garbage Collector" ACM SIGPLAN Conference on
+Programming Language Design and Implementation, June 1993
+ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/pubs/guardians.ps.gz
+
 ** New functions: delq1!, delv1!, delete1!
 These procedures behave similar to delq! and friends but delete only
 one object if at all.
@@ -107,6 +247,87 @@ pointer is NULL, a new array is malloced (the old behaviour).
 
 New functions.
 
+* Changes to the scm_ interface
+
+** Plug in interface for random number generators
+The variable `scm_the_rng' in random.c contains a value and three
+function pointers which together define the current random number
+generator being used by the Scheme level interface and the random
+number library functions.
+
+The user is free to replace the default generator with the generator
+of his own choice.
+
+*** Variable: size_t scm_the_rng.rstate_size
+The size of the random state type used by the current RNG
+measured in chars.
+
+*** Function: unsigned long scm_the_rng.random_bits (scm_rstate *STATE)
+Given the random STATE, return 32 random bits.
+
+*** Function: void scm_the_rng.init_rstate (scm_rstate *STATE, chars *S, int N)
+Seed random state STATE using string S of length N.
+
+*** Function: scm_rstate *scm_the_rng.copy_rstate (scm_rstate *STATE)
+Given random state STATE, return a malloced copy.
+
+** Default RNG
+The default RNG is the MWC (Multiply With Carry) random number
+generator described by George Marsaglia at the Department of
+Statistics and Supercomputer Computations Research Institute, The
+Florida State University (http://stat.fsu.edu/~geo).
+
+It uses 64 bits, has a period of 4578426017172946943 (4.6e18), and
+passes all tests in the DIEHARD test suite
+(http://stat.fsu.edu/~geo/diehard.html).  The generation of 32 bits
+costs one multiply and one add on platforms which either supports long
+longs (gcc does this on most systems) or have 64 bit longs.  The cost
+is four multiply on other systems but this can be optimized by writing
+scm_i_uniform32 in assembler.
+
+These functions are provided through the scm_the_rng interface for use
+by libguile and the application.
+
+*** Function: unsigned long scm_i_uniform32 (scm_i_rstate *STATE)
+Given the random STATE, return 32 random bits.
+Don't use this function directly.  Instead go through the plugin
+interface (see "Plug in interface" above).
+
+*** Function: void scm_i_init_rstate (scm_i_rstate *STATE, char *SEED, int N)
+Initialize STATE using SEED of length N.
+
+*** Function: scm_i_rstate *scm_i_copy_rstate (scm_i_rstate *STATE)
+Return a malloc:ed copy of STATE.  This function can easily be re-used
+in the interfaces to other RNGs.
+
+** Random number library functions
+These functions use the current RNG through the scm_the_rng interface.
+It might be a good idea to use these functions from your C code so
+that only one random generator is used by all code in your program.
+
+You can get the default random state using:
+
+*** Variable: SCM scm_var_random_state
+Contains the vcell of the Scheme variable "*random-state*" which is
+used as default state by all random number functions in the Scheme
+level interface.
+
+Example:
+
+  double x = scm_i_uniform01 (SCM_RSTATE (SCM_CDR (scm_var_random_state)));
+
+*** Function: double scm_i_uniform01 (scm_rstate *STATE)
+Return a sample from the uniform(0,1) distribution.
+
+*** Function: double scm_i_normal01 (scm_rstate *STATE)
+Return a sample from the normal(0,1) distribution.
+
+*** Function: double scm_i_exp1 (scm_rstate *STATE)
+Return a sample from the exp(1) distribution.
+
+*** Function: unsigned long scm_i_random (unsigned long M, scm_rstate *STATE)
+Return a sample from the discrete uniform(0,M) distribution.
+
 \f
 Changes in Guile 1.3 (released Monday, October 19, 1998):