* random.c, random.h (scm_c_default_rstate, scm_c_uniform32):
[bpt/guile.git] / NEWS
diff --git a/NEWS b/NEWS
index 72a56f5..6f23159 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,5 @@
 Guile NEWS --- history of user-visible changes.  -*- text -*-
-Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
 See the end for copying conditions.
 
 Please send Guile bug reports to bug-guile@gnu.org.
@@ -8,64 +8,39 @@ Changes since Guile 1.3:
 
 * Changes to the distribution
 
-** The configure script now accepts a --with-readline flag.
+** Readline support is no longer included with Guile by default.
 
-By default, Guile includes support for the readline line-editing
-library, if a sufficiently recent version of the library is installed
-on your system.
+Based on the different license terms of Guile and Readline, we
+concluded that Guile should not *by default* cause the linking of
+Readline into an application program.  Readline support is now offered
+as a separate module, which is linked into an application only when
+you explicitly specify it.
 
-If you do not want readline included in Guile, pass the following flag
-to the configure script:
+Although Guile is GNU software, its distribution terms add a special
+exception to the usual GNU General Public License (GPL).  Guile's
+license includes a clause that allows you to link Guile with non-free
+programs.  We add this exception so as not to put Guile at a
+disadvantage vis-a-vis other extensibility packages that support other
+languages.
 
-  --with-readline=no
+In contrast, the GNU Readline library is distributed under the GNU
+General Public License pure and simple.  This means that you may not
+link Readline, even dynamically, into an application unless it is
+distributed under a free software license that is compatible the GPL.
 
-You may not want to configure Guile to use readline if you are unable
-to release your program under the GNU General Public License; the
-readline library is released under the GPL, so anything linked with it
-must also be distributed under the GPL.
+Because of this difference in distribution terms, an application that
+can use Guile may not be able to use Readline.  Now users will be
+explicitly offered two independent decisions about the use of these
+two packages.
 
-Enabling readline support does not significantly increase the size of
-the Guile library.  Readline itself is a shared library on most
-systems, and the readline interface code in Guile is less than 3
-kilobytes long.
+You can activate the readline support by issuing
 
-In future releases of Guile, we hope to have the readline support
-linked into Guile dynamically, if and when you use it.  This would
-make this configuration option unnecessary; the same Guile library
-could be used both with and without the readline library.
+    (use-modules (readline-activator))
+    (activate-readline)
 
-* Changes to the stand-alone interpreter
-
-** Command-line editing is enhanced.
-
-If you have a sufficiently recent version of the GNU readline library
-installed on your system, Guile will use it to read expressions
-interactively.  
-
-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.
-
-  (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.
+from your ".guile" file, for example.
 
-    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.
+* Changes to the stand-alone interpreter
 
 ** All builtins now print as primitives.
 Previously builtin procedures not belonging to the fundamental subr
@@ -78,6 +53,689 @@ in backtraces.
 
 * Changes to Scheme functions and syntax
 
+** Hooks
+
+A hook contains a list of functions which should be called on
+particular occasions in an existing program.  Hooks are used for
+customization.
+
+A window manager might have a hook before-window-map-hook.  The window
+manager uses the function run-hooks to call all functions stored in
+before-window-map-hook each time a window is mapped.  The user can
+store functions in the hook using add-hook!.
+
+In Guile, hooks are first class objects.
+
+*** New function: make-hook [N_ARGS]
+
+Return a hook for hook functions which can take N_ARGS arguments.
+The default value for N_ARGS is 0.
+
+(See also scm_make_named_hook below.)
+
+*** New function: add-hook! HOOK PROC [APPEND_P]
+
+Put PROC at the beginning of the list of functions stored in HOOK.
+If APPEND_P is supplied, and non-false, put PROC at the end instead.
+
+PROC must be able to take the number of arguments specified when the
+hook was created.
+
+If PROC already exists in HOOK, then remove it first.
+
+*** New function: remove-hook! HOOK PROC
+
+Remove PROC from the list of functions in HOOK.
+
+*** New function: reset-hook! HOOK
+
+Clear the list of hook functions stored in HOOK.
+
+*** New function: run-hook HOOK ARG1 ...
+
+Run all hook functions stored in HOOK with arguments ARG1 ... .
+The number of arguments supplied must correspond to the number given
+when the hook was created.
+
+** The function `dynamic-link' now takes optional keyword arguments.
+   The only keyword argument that is currently defined is `:global
+   BOOL'.  With it, you can control whether the shared library will be
+   linked in global mode or not.  In global mode, the symbols from the
+   linked library can be used to resolve references from other
+   dynamically linked libraries.  In non-global mode, the linked
+   library is essentially invisible and can only be accessed via
+   `dynamic-func', etc.  The default is now to link in global mode.
+   Previously, the default has been non-global mode.
+
+   The `#:global' keyword is only effective on platforms that support
+   the dlopen family of functions.
+
+** New function `provided?'
+
+ - Function: provided? FEATURE
+     Return true iff FEATURE is supported by this installation of
+     Guile.  FEATURE must be a symbol naming a feature; the global
+     variable `*features*' is a list of available features.
+
+** Changes to the module (ice-9 expect):
+
+*** The expect-strings macro now matches `$' in a regular expression
+    only at a line-break or end-of-file by default.  Previously it would
+    match the end of the string accumulated so far. The old behaviour
+    can be obtained by setting the variable `expect-strings-exec-flags'
+    to 0.
+
+*** The expect-strings macro now uses a variable `expect-strings-exec-flags'
+    for the regexp-exec flags.  If `regexp/noteol' is included, then `$'
+    in a regular expression will still match before a line-break or
+    end-of-file.  The default is `regexp/noteol'.
+
+*** The expect-strings macro now uses a variable 
+    `expect-strings-compile-flags' for the flags to be supplied to
+    `make-regexp'.  The default is `regexp/newline', which was previously
+    hard-coded.
+
+*** The expect macro now supplies two arguments to a match procedure:
+    the current accumulated string and a flag to indicate whether
+    end-of-file has been reached.  Previously only the string was supplied.
+    If end-of-file is reached, the match procedure will be called an
+    additional time with the same accumulated string as the previous call
+    but with the flag set.
+
+** New module (ice-9 format), implementing the Common Lisp `format' function.
+
+This code, and the documentation for it that appears here, was
+borrowed from SLIB, with minor adaptations for Guile.
+
+ - Function: format DESTINATION FORMAT-STRING . ARGUMENTS
+     An almost complete implementation of Common LISP format description
+     according to the CL reference book `Common LISP' from Guy L.
+     Steele, Digital Press.  Backward compatible to most of the
+     available Scheme format implementations.
+
+     Returns `#t', `#f' or a string; has side effect of printing
+     according to FORMAT-STRING.  If DESTINATION is `#t', the output is
+     to the current output port and `#t' is returned.  If DESTINATION
+     is `#f', a formatted string is returned as the result of the call.
+     NEW: If DESTINATION is a string, DESTINATION is regarded as the
+     format string; FORMAT-STRING is then the first argument and the
+     output is returned as a string. If DESTINATION is a number, the
+     output is to the current error port if available by the
+     implementation. Otherwise DESTINATION must be an output port and
+     `#t' is returned.
+
+     FORMAT-STRING must be a string.  In case of a formatting error
+     format returns `#f' and prints a message on the current output or
+     error port.  Characters are output as if the string were output by
+     the `display' function with the exception of those prefixed by a
+     tilde (~).  For a detailed description of the FORMAT-STRING syntax
+     please consult a Common LISP format reference manual.  For a test
+     suite to verify this format implementation load `formatst.scm'.
+     Please send bug reports to `lutzeb@cs.tu-berlin.de'.
+
+     Note: `format' is not reentrant, i.e. only one `format'-call may
+     be executed at a time.
+
+
+*** Format Specification (Format version 3.0)
+
+   Please consult a Common LISP format reference manual for a detailed
+description of the format string syntax.  For a demonstration of the
+implemented directives see `formatst.scm'.
+
+   This implementation supports directive parameters and modifiers (`:'
+and `@' characters). Multiple parameters must be separated by a comma
+(`,').  Parameters can be numerical parameters (positive or negative),
+character parameters (prefixed by a quote character (`''), variable
+parameters (`v'), number of rest arguments parameter (`#'), empty and
+default parameters.  Directive characters are case independent. The
+general form of a directive is:
+
+DIRECTIVE ::= ~{DIRECTIVE-PARAMETER,}[:][@]DIRECTIVE-CHARACTER
+
+DIRECTIVE-PARAMETER ::= [ [-|+]{0-9}+ | 'CHARACTER | v | # ]
+
+*** Implemented CL Format Control Directives
+
+   Documentation syntax: Uppercase characters represent the
+corresponding control directive characters. Lowercase characters
+represent control directive parameter descriptions.
+
+`~A'
+     Any (print as `display' does).
+    `~@A'
+          left pad.
+
+    `~MINCOL,COLINC,MINPAD,PADCHARA'
+          full padding.
+
+`~S'
+     S-expression (print as `write' does).
+    `~@S'
+          left pad.
+
+    `~MINCOL,COLINC,MINPAD,PADCHARS'
+          full padding.
+
+`~D'
+     Decimal.
+    `~@D'
+          print number sign always.
+
+    `~:D'
+          print comma separated.
+
+    `~MINCOL,PADCHAR,COMMACHARD'
+          padding.
+
+`~X'
+     Hexadecimal.
+    `~@X'
+          print number sign always.
+
+    `~:X'
+          print comma separated.
+
+    `~MINCOL,PADCHAR,COMMACHARX'
+          padding.
+
+`~O'
+     Octal.
+    `~@O'
+          print number sign always.
+
+    `~:O'
+          print comma separated.
+
+    `~MINCOL,PADCHAR,COMMACHARO'
+          padding.
+
+`~B'
+     Binary.
+    `~@B'
+          print number sign always.
+
+    `~:B'
+          print comma separated.
+
+    `~MINCOL,PADCHAR,COMMACHARB'
+          padding.
+
+`~NR'
+     Radix N.
+    `~N,MINCOL,PADCHAR,COMMACHARR'
+          padding.
+
+`~@R'
+     print a number as a Roman numeral.
+
+`~:@R'
+     print a number as an "old fashioned" Roman numeral.
+
+`~:R'
+     print a number as an ordinal English number.
+
+`~:@R'
+     print a number as a cardinal English number.
+
+`~P'
+     Plural.
+    `~@P'
+          prints `y' and `ies'.
+
+    `~:P'
+          as `~P but jumps 1 argument backward.'
+
+    `~:@P'
+          as `~@P but jumps 1 argument backward.'
+
+`~C'
+     Character.
+    `~@C'
+          prints a character as the reader can understand it (i.e. `#\'
+          prefixing).
+
+    `~:C'
+          prints a character as emacs does (eg. `^C' for ASCII 03).
+
+`~F'
+     Fixed-format floating-point (prints a flonum like MMM.NNN).
+    `~WIDTH,DIGITS,SCALE,OVERFLOWCHAR,PADCHARF'
+    `~@F'
+          If the number is positive a plus sign is printed.
+
+`~E'
+     Exponential floating-point (prints a flonum like MMM.NNN`E'EE).
+    `~WIDTH,DIGITS,EXPONENTDIGITS,SCALE,OVERFLOWCHAR,PADCHAR,EXPONENTCHARE'
+    `~@E'
+          If the number is positive a plus sign is printed.
+
+`~G'
+     General floating-point (prints a flonum either fixed or
+     exponential).
+    `~WIDTH,DIGITS,EXPONENTDIGITS,SCALE,OVERFLOWCHAR,PADCHAR,EXPONENTCHARG'
+    `~@G'
+          If the number is positive a plus sign is printed.
+
+`~$'
+     Dollars floating-point (prints a flonum in fixed with signs
+     separated).
+    `~DIGITS,SCALE,WIDTH,PADCHAR$'
+    `~@$'
+          If the number is positive a plus sign is printed.
+
+    `~:@$'
+          A sign is always printed and appears before the padding.
+
+    `~:$'
+          The sign appears before the padding.
+
+`~%'
+     Newline.
+    `~N%'
+          print N newlines.
+
+`~&'
+     print newline if not at the beginning of the output line.
+    `~N&'
+          prints `~&' and then N-1 newlines.
+
+`~|'
+     Page Separator.
+    `~N|'
+          print N page separators.
+
+`~~'
+     Tilde.
+    `~N~'
+          print N tildes.
+
+`~'<newline>
+     Continuation Line.
+    `~:'<newline>
+          newline is ignored, white space left.
+
+    `~@'<newline>
+          newline is left, white space ignored.
+
+`~T'
+     Tabulation.
+    `~@T'
+          relative tabulation.
+
+    `~COLNUM,COLINCT'
+          full tabulation.
+
+`~?'
+     Indirection (expects indirect arguments as a list).
+    `~@?'
+          extracts indirect arguments from format arguments.
+
+`~(STR~)'
+     Case conversion (converts by `string-downcase').
+    `~:(STR~)'
+          converts by `string-capitalize'.
+
+    `~@(STR~)'
+          converts by `string-capitalize-first'.
+
+    `~:@(STR~)'
+          converts by `string-upcase'.
+
+`~*'
+     Argument Jumping (jumps 1 argument forward).
+    `~N*'
+          jumps N arguments forward.
+
+    `~:*'
+          jumps 1 argument backward.
+
+    `~N:*'
+          jumps N arguments backward.
+
+    `~@*'
+          jumps to the 0th argument.
+
+    `~N@*'
+          jumps to the Nth argument (beginning from 0)
+
+`~[STR0~;STR1~;...~;STRN~]'
+     Conditional Expression (numerical clause conditional).
+    `~N['
+          take argument from N.
+
+    `~@['
+          true test conditional.
+
+    `~:['
+          if-else-then conditional.
+
+    `~;'
+          clause separator.
+
+    `~:;'
+          default clause follows.
+
+`~{STR~}'
+     Iteration (args come from the next argument (a list)).
+    `~N{'
+          at most N iterations.
+
+    `~:{'
+          args from next arg (a list of lists).
+
+    `~@{'
+          args from the rest of arguments.
+
+    `~:@{'
+          args from the rest args (lists).
+
+`~^'
+     Up and out.
+    `~N^'
+          aborts if N = 0
+
+    `~N,M^'
+          aborts if N = M
+
+    `~N,M,K^'
+          aborts if N <= M <= K
+
+*** Not Implemented CL Format Control Directives
+
+`~:A'
+     print `#f' as an empty list (see below).
+
+`~:S'
+     print `#f' as an empty list (see below).
+
+`~<~>'
+     Justification.
+
+`~:^'
+     (sorry I don't understand its semantics completely)
+
+*** Extended, Replaced and Additional Control Directives
+
+`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHD'
+`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHX'
+`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHO'
+`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHB'
+`~N,MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHR'
+     COMMAWIDTH is the number of characters between two comma
+     characters.
+
+`~I'
+     print a R4RS complex number as `~F~@Fi' with passed parameters for
+     `~F'.
+
+`~Y'
+     Pretty print formatting of an argument for scheme code lists.
+
+`~K'
+     Same as `~?.'
+
+`~!'
+     Flushes the output if format DESTINATION is a port.
+
+`~_'
+     Print a `#\space' character
+    `~N_'
+          print N `#\space' characters.
+
+`~/'
+     Print a `#\tab' character
+    `~N/'
+          print N `#\tab' characters.
+
+`~NC'
+     Takes N as an integer representation for a character. No arguments
+     are consumed. N is converted to a character by `integer->char'.  N
+     must be a positive decimal number.
+
+`~:S'
+     Print out readproof.  Prints out internal objects represented as
+     `#<...>' as strings `"#<...>"' so that the format output can always
+     be processed by `read'.
+
+`~:A'
+     Print out readproof.  Prints out internal objects represented as
+     `#<...>' as strings `"#<...>"' so that the format output can always
+     be processed by `read'.
+
+`~Q'
+     Prints information and a copyright notice on the format
+     implementation.
+    `~:Q'
+          prints format version.
+
+`~F, ~E, ~G, ~$'
+     may also print number strings, i.e. passing a number as a string
+     and format it accordingly.
+
+*** Configuration Variables
+
+   The format module exports some configuration variables to suit the
+systems and users needs. There should be no modification necessary for
+the configuration that comes with Guile.  Format detects automatically
+if the running scheme system implements floating point numbers and
+complex numbers.
+
+format:symbol-case-conv
+     Symbols are converted by `symbol->string' so the case type of the
+     printed symbols is implementation dependent.
+     `format:symbol-case-conv' is a one arg closure which is either
+     `#f' (no conversion), `string-upcase', `string-downcase' or
+     `string-capitalize'. (default `#f')
+
+format:iobj-case-conv
+     As FORMAT:SYMBOL-CASE-CONV but applies for the representation of
+     implementation internal objects. (default `#f')
+
+format:expch
+     The character prefixing the exponent value in `~E' printing.
+     (default `#\E')
+
+*** Compatibility With Other Format Implementations
+
+SLIB format 2.x:
+     See `format.doc'.
+
+SLIB format 1.4:
+     Downward compatible except for padding support and `~A', `~S',
+     `~P', `~X' uppercase printing.  SLIB format 1.4 uses C-style
+     `printf' padding support which is completely replaced by the CL
+     `format' padding style.
+
+MIT C-Scheme 7.1:
+     Downward compatible except for `~', which is not documented
+     (ignores all characters inside the format string up to a newline
+     character).  (7.1 implements `~a', `~s', ~NEWLINE, `~~', `~%',
+     numerical and variable parameters and `:/@' modifiers in the CL
+     sense).
+
+Elk 1.5/2.0:
+     Downward compatible except for `~A' and `~S' which print in
+     uppercase.  (Elk implements `~a', `~s', `~~', and `~%' (no
+     directive parameters or modifiers)).
+
+Scheme->C 01nov91:
+     Downward compatible except for an optional destination parameter:
+     S2C accepts a format call without a destination which returns a
+     formatted string. This is equivalent to a #f destination in S2C.
+     (S2C implements `~a', `~s', `~c', `~%', and `~~' (no directive
+     parameters or modifiers)).
+
+
+** Changes to string-handling functions.
+
+These functions were added to support the (ice-9 format) module, above.
+
+*** New function: string-upcase STRING
+*** New function: string-downcase STRING
+
+These are non-destructive versions of the existing string-upcase! and
+string-downcase! functions.
+
+*** New function: string-capitalize! STRING
+*** New function: string-capitalize STRING
+
+These functions convert the first letter of each word in the string to
+upper case.  Thus:
+
+      (string-capitalize "howdy there")
+      => "Howdy There"
+
+As with the other functions, string-capitalize! modifies the string in
+place, while string-capitalize returns a modified copy of its argument.
+
+*** New function: string-ci->symbol STRING
+
+Return a symbol whose name is STRING, but having the same case as if
+the symbol had be read by `read'.
+
+Guile can be configured to be sensitive or insensitive to case
+differences in Scheme identifiers.  If Guile is case-insensitive, all
+symbols are converted to lower case on input.  The `string-ci->symbol'
+function returns a symbol whose name in STRING, transformed as Guile
+would if STRING were input.
+
+*** New function: substring-move! STRING1 START END STRING2 START
+
+Copy the substring of STRING1 from START (inclusive) to END
+(exclusive) to STRING2 at START.  STRING1 and STRING2 may be the same
+string, and the source and destination areas may overlap; in all
+cases, the function behaves as if all the characters were copied
+simultanously.
+
+*** Extended functions: substring-move-left! substring-move-right! 
+
+These functions now correctly copy arbitrarily overlapping substrings;
+they are both synonyms for substring-move!.
+
+
+** New module (ice-9 getopt-long), with the function `getopt-long'.
+
+getopt-long is a function for parsing command-line arguments in a
+manner consistent with other GNU programs.
+
+(getopt-long ARGS GRAMMAR)
+Parse the arguments ARGS according to the argument list grammar GRAMMAR.
+
+ARGS should be a list of strings.  Its first element should be the
+name of the program; subsequent elements should be the arguments
+that were passed to the program on the command line.  The
+`program-arguments' procedure returns a list of this form.
+
+GRAMMAR is a list of the form:
+((OPTION (PROPERTY VALUE) ...) ...)
+
+Each OPTION should be a symbol.  `getopt-long' will accept a
+command-line option named `--OPTION'.
+Each option can have the following (PROPERTY VALUE) pairs:
+
+  (single-char CHAR) --- Accept `-CHAR' as a single-character
+            equivalent to `--OPTION'.  This is how to specify traditional
+            Unix-style flags.
+  (required? BOOL) --- If BOOL is true, the option is required.
+            getopt-long will raise an error if it is not found in ARGS.
+  (value BOOL) --- If BOOL is #t, the option accepts a value; if
+            it is #f, it does not; and if it is the symbol
+            `optional', the option may appear in ARGS with or
+            without a value. 
+  (predicate FUNC) --- If the option accepts a value (i.e. you
+            specified `(value #t)' for this option), then getopt
+            will apply FUNC to the value, and throw an exception
+            if it returns #f.  FUNC should be a procedure which
+            accepts a string and returns a boolean value; you may
+            need to use quasiquotes to get it into GRAMMAR.
+
+The (PROPERTY VALUE) pairs may occur in any order, but each
+property may occur only once.  By default, options do not have
+single-character equivalents, are not required, and do not take
+values.
+
+In ARGS, single-character options may be combined, in the usual
+Unix fashion: ("-x" "-y") is equivalent to ("-xy").  If an option
+accepts values, then it must be the last option in the
+combination; the value is the next argument.  So, for example, using
+the following grammar:
+     ((apples    (single-char #\a))
+      (blimps    (single-char #\b) (value #t))
+      (catalexis (single-char #\c) (value #t)))
+the following argument lists would be acceptable:
+   ("-a" "-b" "bang" "-c" "couth")     ("bang" and "couth" are the values
+                                        for "blimps" and "catalexis")
+   ("-ab" "bang" "-c" "couth")         (same)
+   ("-ac" "couth" "-b" "bang")         (same)
+   ("-abc" "couth" "bang")             (an error, since `-b' is not the
+                                        last option in its combination)
+
+If an option's value is optional, then `getopt-long' decides
+whether it has a value by looking at what follows it in ARGS.  If
+the next element is a string, and it does not appear to be an
+option itself, then that string is the option's value.
+
+The value of a long option can appear as the next element in ARGS,
+or it can follow the option name, separated by an `=' character.
+Thus, using the same grammar as above, the following argument lists
+are equivalent:
+  ("--apples" "Braeburn" "--blimps" "Goodyear")
+  ("--apples=Braeburn" "--blimps" "Goodyear")
+  ("--blimps" "Goodyear" "--apples=Braeburn")
+
+If the option "--" appears in ARGS, argument parsing stops there;
+subsequent arguments are returned as ordinary arguments, even if
+they resemble options.  So, in the argument list:
+        ("--apples" "Granny Smith" "--" "--blimp" "Goodyear")
+`getopt-long' will recognize the `apples' option as having the
+value "Granny Smith", but it will not recognize the `blimp'
+option; it will return the strings "--blimp" and "Goodyear" as
+ordinary argument strings.
+
+The `getopt-long' function returns the parsed argument list as an
+assocation list, mapping option names --- the symbols from GRAMMAR
+--- onto their values, or #t if the option does not accept a value.
+Unused options do not appear in the alist.
+
+All arguments that are not the value of any option are returned
+as a list, associated with the empty list.
+
+`getopt-long' throws an exception if:
+- it finds an unrecognized option in ARGS
+- a required option is omitted
+- an option that requires an argument doesn't get one
+- an option that doesn't accept an argument does get one (this can
+  only happen using the long option `--opt=value' syntax)
+- an option predicate fails
+
+So, for example:
+
+(define grammar
+  `((lockfile-dir (required? #t)
+                  (value #t)
+                  (single-char #\k)
+                  (predicate ,file-is-directory?))
+    (verbose (required? #f)
+             (single-char #\v)
+             (value #f))
+    (x-includes (single-char #\x))
+    (rnet-server (single-char #\y) 
+                 (predicate ,string?))))
+
+(getopt-long '("my-prog" "-vk" "/tmp" "foo1" "--x-includes=/usr/include" 
+               "--rnet-server=lamprod" "--" "-fred" "foo2" "foo3")
+               grammar)
+=> ((() "foo1" "-fred" "foo2" "foo3")
+    (rnet-server . "lamprod")
+    (x-includes . "/usr/include")
+    (lockfile-dir . "/tmp")
+    (verbose . #t))
+
+** The (ice-9 getopt-gnu-style) module is obsolete; use (ice-9 getopt-long).
+
+It will be removed in a few releases.
+
 ** New syntax: lambda*
 ** New syntax: define*
 ** New syntax: define*-public   
@@ -182,7 +840,9 @@ shadow earlier bindings.
 
 Guile's and-let* macro was contributed by Michael Livshin.
 
-** New function: sorted? SEQUENCE LESS?
+** New sorting functions
+
+*** 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)').
@@ -191,7 +851,7 @@ 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?
+*** New function: merge LIST1 LIST2 LESS?
 LIST1 and LIST2 are sorted lists.
 Returns the sorted list of all elements in LIST1 and LIST2.
 
@@ -200,37 +860,39 @@ 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?
+*** 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?
+*** 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
+*** 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?
+*** 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?
+*** New function: stable-sort! SEQUENCE LESS?
 Similar to `sort!' but stable.
 Uses temporary storage when sorting vectors.
 
-** New functions: sort-list, sort-list!
+*** New functions: sort-list, sort-list!
 Added for compatibility with scsh.
 
-** New function: random N [STATE]
+** New built-in random number support
+
+*** 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.
@@ -241,7 +903,7 @@ 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*
+*** 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
@@ -249,23 +911,23 @@ 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]
+*** 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
+*** 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]
+*** 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]
+*** 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
@@ -273,24 +935,24 @@ 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]
+*** 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]
+*** 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]
+*** 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
+*** 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)).
 
@@ -322,6 +984,37 @@ next read operation will work on the pushed back characters.
 If unread-char is called multiple times, the unread characters will be
 read again in last-in first-out order.
 
+** the procedures uniform-array-read! and uniform-array-write! now
+work on any kind of port, not just ports which are open on a file.
+
+** now 'l' in a port mode requests line buffering.
+
+** The procedure truncate-file now works on string ports as well
+as file ports.  If the size argument is omitted, the current
+file position is used.
+
+** new procedure: lseek PORT/FDES OFFSET WHENCE
+The arguments are the same as for the old fseek procedure, but it
+works on string ports as well as random-access file ports.
+
+** the fseek procedure now works on string ports, since it has been
+redefined using lseek.
+
+** the setvbuf procedure now uses a default size if mode is _IOFBF and
+size is not supplied.
+
+** the newline procedure no longer flushes the port if it's not
+line-buffered: previously it did if it was the current output port.
+
+** open-pipe and close-pipe are no longer primitive procedures, but
+an emulation can be obtained using `(use-modules (ice-9 popen))'.
+
+** the freopen procedure has been removed.
+
+** new procedure: drain-input PORT
+Drains PORT's read buffers (including any pushed-back characters)
+and returns the contents as a single string.
+
 ** New function: map-in-order PROC LIST1 LIST2 ...
 Version of `map' which guarantees that the procedure is applied to the
 lists in serial order.
@@ -339,6 +1032,13 @@ forms instead of the result of the last body form.  In contrast to
 Read/write command line history from/to file.  Returns #t on success
 and #f if an error occured.
 
+** `ls' and `lls' in module (ice-9 ls) now handle no arguments.
+
+These procedures return a list of definitions available in the specified
+argument, a relative module reference.  In the case of no argument,
+`(current-module)' is now consulted for definitions to return, instead
+of simply returning #f, the former behavior.
+
 * Changes to the gh_ interface
 
 ** gh_scm2doubles
@@ -353,6 +1053,90 @@ New functions.
 
 * Changes to the scm_ interface
 
+** Function: scm_make_named_hook (char* name, int n_args)
+
+Creates a hook in the same way as make-hook above but also
+binds a variable named NAME to it.
+
+This is the typical way of creating a hook from C code.
+
+Currently, the variable is created in the root module.  This will
+change when we get the new module system.
+
+** The smob interface
+
+The interface for creating smobs has changed.  For documentation, see
+data-rep.info (made from guile-core/doc/data-rep.texi).
+
+*** Deprecated function: SCM scm_newsmob (scm_smobfuns *)
+
+>>> This function will be removed in 1.3.4. <<<
+
+It is replaced by:
+
+*** Function: SCM scm_make_smob_type (const char *name, scm_sizet size)
+This function adds a new smob type, named NAME, with instance size
+SIZE to the system.  The return value is a tag that is used in
+creating instances of the type.  If SIZE is 0, then no memory will
+be allocated when instances of the smob are created, and nothing
+will be freed by the default free function.
+    
+*** Function: void scm_set_smob_mark (long tc, SCM (*mark) (SCM))
+This function sets the smob marking procedure for the smob type
+specified by the tag TC. TC is the tag returned by
+`scm_make_smob_type'.
+
+*** Function: void scm_set_smob_free (long tc, SCM (*mark) (SCM))
+This function sets the smob freeing procedure for the smob type
+specified by the tag TC. TC is the tag returned by
+`scm_make_smob_type'.
+
+*** Function: void scm_set_smob_print (tc, print)
+
+ - Function: void scm_set_smob_print (long tc,
+                                     scm_sizet (*print) (SCM,
+                                                         SCM,
+                                                         scm_print_state *))
+
+This function sets the smob printing procedure for the smob type
+specified by the tag TC. TC is the tag returned by
+`scm_make_smob_type'.
+
+*** Function: void scm_set_smob_equalp (long tc, SCM (*equalp) (SCM, SCM))
+This function sets the smob equality-testing predicate for the
+smob type specified by the tag TC. TC is the tag returned by
+`scm_make_smob_type'.
+
+*** Macro: void SCM_NEWSMOB (SCM var, long tc, void *data)
+Make VALUE contain a smob instance of the type with type code TC and
+smob data DATA.  VALUE must be previously declared as C type `SCM'.
+
+*** Macro: fn_returns SCM_RETURN_NEWSMOB (long tc, void *data)
+This macro expands to a block of code that creates a smob instance
+of the type with type code TC and smob data DATA, and returns that
+`SCM' value.  It should be the last piece of code in a block.
+
+** The interfaces for using I/O ports and implementing port types
+(ptobs) have changed significantly.  The new interface is based on
+shared access to buffers and a new set of ptob procedures.
+
+*** scm_newptob has been removed
+
+It is replaced by:
+
+*** Function: SCM scm_make_port_type (type_name, fill_buffer, write_flush)
+
+- Function: SCM scm_make_port_type (char *type_name,
+                                    int (*fill_buffer) (SCM port),
+                                    void (*write_flush) (SCM port));
+
+Similarly to the new smob interface, there is a set of function
+setters by which the user can customize the behaviour of his port
+type.  See ports.h (scm_set_port_XXX).
+
+** scm_strport_to_string: New function: creates a new string from
+a string port's buffer.
+
 ** 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
@@ -432,6 +1216,7 @@ 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):