Merge remote-tracking branch 'origin/stable-2.0'
[bpt/guile.git] / NEWS
diff --git a/NEWS b/NEWS
index 7912259..c1589a1 100644 (file)
--- a/NEWS
+++ b/NEWS
 Guile NEWS --- history of user-visible changes.
-Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (C) 1996-2012 Free Software Foundation, Inc.
 See the end for copying conditions.
 
 Please send Guile bug reports to bug-guile@gnu.org.
 
 
-Note: During the 1.9 series, we will keep an incremental NEWS for the
-latest prerelease, and a full NEWS corresponding to 1.8 -> 2.0.
+Changes in 2.0.5 (since 2.0.4):
 
-Changes since the 1.9.15 prerelease:
+This release fixes the binary interface information (SONAME) of
+libguile, which was incorrect in 2.0.4.  It does not contain other
+changes.
 
-** New syntax: define-once
+\f
+Changes in 2.0.4 (since 2.0.3):
 
-`define-once' is like Lisp's `defvar': it creates a toplevel binding,
-but only if one does not exist already.
+* Notable changes
 
-** Improved exactness handling for complex number parsing
+** Better debuggability for interpreted procedures.
+    
+Guile 2.0 came with a great debugging experience for compiled
+procedures, but the story for interpreted procedures was terrible.  Now,
+at least, interpreted procedures have names, and the `arity' procedure
+property is always correct (or, as correct as it can be, in the presence
+of `case-lambda').
 
-When parsing non-real complex numbers, exactness specifiers are now
-applied to each component, as is done in PLT Scheme.  For complex
-numbers written in rectangular form, exactness specifiers are applied
-to the real and imaginary parts before calling scm_make_rectangular.
-For complex numbers written in polar form, exactness specifiers are
-applied to the magnitude and angle before calling scm_make_polar.
+** Support for cross-compilation.
+    
+One can now use a native Guile to cross-compile `.go' files for a
+different architecture.  See the documentation for `--target' in the
+"Compilation" section of the manual, for information on how to use the
+cross-compiler.  See the "Cross building Guile" section of the README,
+for more on how to cross-compile Guile itself.
 
-Previously, exactness specifiers were applied to the number as a whole
-_after_ calling scm_make_rectangular or scm_make_polar.
+** The return of `local-eval'.
 
-For example, (string->number "#i5.0+0i") now does the equivalent of:
+Back by popular demand, `the-environment' and `local-eval' allow the
+user to capture a lexical environment, and then evaluate arbitrary
+expressions in that context.  There is also a new `local-compile'
+command.  See "Local Evaluation" in the manual, for more.  Special
+thanks to Mark Weaver for an initial implementation of this feature.
 
-  (make-rectangular (exact->inexact 5.0) (exact->inexact 0))
+** Fluids can now have default values.
 
-which yields 5.0+0.0i.  Previously it did the equivalent of:
+Fluids are used for dynamic and thread-local binding.  They have always
+inherited their values from the context or thread that created them.
+However, there was a case in which a new thread would enter Guile, and
+the default values of all the fluids would be `#f' for that thread.
 
-  (exact->inexact (make-rectangular 5.0 0))
+This has now been fixed so that `make-fluid' has an optional default
+value for fluids in unrelated dynamic roots, which defaults to `#f'.
 
-which yielded 5.0.
+** Garbage collector tuning.
 
-\f
-Changes in 1.9.15 (since the 1.9.14 prerelease):
+The garbage collector has now been tuned to run more often under some
+circumstances.
+
+*** Unmanaged allocation
 
-** Formally deprecate omission of port to `format'
+The new `scm_gc_register_allocation' function will notify the collector
+of unmanaged allocation.  This will cause the collector to run sooner.
+Guile's `scm_malloc', `scm_calloc', and `scm_realloc' unmanaged
+allocators eventually call this function.  This leads to better
+performance under steady-state unmanaged allocation.
+
+*** Transient allocation
+    
+When the collector runs, it will try to record the total memory
+footprint of a process, if the platform supports this information.  If
+the memory footprint is growing, the collector will run more frequently.
+This reduces the increase of the resident size of a process in response
+to a transient increase in allocation.
+
+*** Management of threads, bignums
+
+Creating a thread will allocate a fair amount of memory.  Guile now does
+some GC work (using `GC_collect_a_little') when allocating a thread.
+This leads to a better memory footprint when creating many short-lived
+threads.
+    
+Similarly, bignums can occupy a lot of memory.  Guile now offers hooks
+to enable custom GMP allocators that end up calling
+`scm_gc_register_allocation'.  These allocators are enabled by default
+when running Guile from the command-line.  To enable them in libraries,
+set the `scm_install_gmp_memory_functions' variable to a nonzero value
+before loading Guile.
+
+** SRFI-39 parameters are available by default.
     
-It used to be that you could omit passing a port to `format', in some
-cases.  This still works, but has been formally deprecated.
+Guile now includes support for parameters, as defined by SRFI-39, in the
+default environment.  See "Parameters" in the manual, for more
+information.  `current-input-port', `current-output-port', and
+`current-error-port' are now parameters.
     
-** ECMAScript fixes
+** Add `current-warning-port'.
+    
+Guile now outputs warnings on a separate port, `current-warning-port',
+initialized to the value that `current-error-port' has on startup.
 
-Noah Lavine and Kan-Ru Chen noticed and fixed a number of embarrassing
-bugs in object creation, unicode literals in strings, empty function
-bodies, non-breaking whitespace, and numeric literals.
+** Syntax parameters.
 
-** `(web ...)' changes
+Following Racket's lead, Guile now supports syntax parameters.  See
+"Syntax parameters" in the manual, for more.
 
-*** `parse-uri', `unparse-uri' now called `string->uri', `uri->string'
+Also see Barzilay, Culpepper, and Flatt's 2011 SFP workshop paper,
+"Keeping it Clean with syntax-parameterize".
+    
+** Parse command-line arguments from the locale encoding.
     
-*** `uri-decode' takes `#:encoding' keyword argument, not `#:charset'
+Guile now attempts to parse command-line arguments using the user's
+locale.  However for backwards compatibility with other 2.0.x releases,
+it does so without actually calling `setlocale'.  Please report any bugs
+in this facility to bug-guile@gnu.org.
+
+** One-armed conditionals: `when' and `unless'
+
+Guile finally has `when' and `unless' in the default environment.  Use
+them whenever you would use an `if' with only one branch.  See
+"Conditionals" in the manual, for more.
+
+** `current-filename', `add-to-load-path'
+
+There is a new form, `(current-filename)', which expands out to the
+source file in which it occurs.  Combined with the new
+`add-to-load-path', this allows simple scripts to easily add nearby
+directories to the load path.  See "Load Paths" in the manual, for more.
+
+** `random-state-from-platform'
+
+This procedure initializes a random seed using good random sources
+available on your platform, such as /dev/urandom.  See "Random Number
+Generation" in the manual, for more.
+
+** Warn about unsupported `simple-format' options.
+
+The `-Wformat' compilation option now reports unsupported format options
+passed to `simple-format'.
+
+** Manual updates
+
+Besides the sections already mentioned, the following manual sections
+are new in this release: "Modules and the File System", "Module System
+Reflection", "Syntax Transformer Helpers", and "Local Inclusion".
+
+* New interfaces
+
+** (ice-9 session): `apropos-hook'
+** New print option: `escape-newlines', defaults to #t.
+** (ice-9 ftw): `file-system-fold', `file-system-tree', `scandir'
+** `scm_c_value_ref': access to multiple returned values from C
+** scm_call (a varargs version), scm_call_7, scm_call_8, scm_call_9
+** Some new syntax helpers in (system syntax)
+
+Search the manual for these identifiers and modules, for more.
+
+* Build fixes
+
+** FreeBSD build fixes.
+** OpenBSD compilation fixes.
+** Solaris 2.10 test suite fixes.
+** IA64 compilation fix.
+** MinGW build fixes.
+** Work around instruction reordering on SPARC and HPPA in the VM.
+** Gnulib updates: added `dirfd', `setenv' modules.
+
+* Bug fixes
+
+** Add a deprecated alias for $expt.
+** Add an exception printer for `getaddrinfo-error'.
+** Add deprecated shim for `scm_display_error' with stack as first argument.
+** Add warnings for unsupported `simple-format' options.
+** Allow overlapping regions to be passed to `bytevector-copy!'.
+** Better function prologue disassembly
+** Compiler: fix miscompilation of (values foo ...) in some contexts.
+** Compiler: fix serialization of #nil-terminated lists.
+** Compiler: allow values bound in non-tail let expressions to be collected.
+** Deprecate SCM_ASRTGO.
+** Document invalidity of (begin) as expression; add back-compat shim.
+** Don't leak file descriptors when mmaping objcode.
+** Empty substrings no longer reference the original stringbuf.
+** FFI: Fix `set-pointer-finalizer!' to leave the type cell unchanged.
+** FFI: Hold a weak reference to the CIF made by `procedure->pointer'.
+** FFI: Hold a weak reference to the procedure passed to `procedure->pointer'.
+** FFI: Properly unpack small integer return values in closure call.
+** Fix R6RS `fold-left' so the accumulator is the first argument.
+** Fix bit-set*! bug from 2005.
+** Fix bug in `make-repl' when `lang' is actually a <language>.
+** Fix bugs related to mutation, the null string, and shared substrings.
+** Fix <dynwind> serialization.
+** Fix erroneous check in `set-procedure-properties!'.
+** Fix generalized-vector-{ref,set!} for slices.
+** Fix error messages involving definition forms.
+** Fix primitive-eval to return #<unspecified> for definitions.
+** HTTP: Extend handling of "Cache-Control" header.
+** HTTP: Fix qstring writing of cache-extension values
+** HTTP: Fix validators for various list-style headers.
+** HTTP: Permit non-date values for Expires header.
+** HTTP: `write-request-line' writes absolute paths, not absolute URIs.
+** Hack the port-column of current-output-port after printing a prompt.
+** Make sure `regexp-quote' tests use Unicode-capable string ports.
+** Peval: Fix bugs in the new optimizer.
+** Statistically unique marks and labels, for robust hygiene across sessions.
+** Web: Allow URIs with empty authorities, like "file:///etc/hosts".
+** `,language' at REPL sets the current-language fluid.
+** `primitive-load' returns the value(s) of the last expression.
+** `scm_from_stringn' always returns unique strings.
+** `scm_i_substring_copy' tries to narrow the substring.
+** i18n: Fix gc_malloc/free mismatch on non-GNU systems.
 
-*** HTTP header representation change
+\f
+Changes in 2.0.3 (since 2.0.2):
 
-Guile properly garbage-collects symbols, so there's no need to read some
-headers as symbols and some as strings: all header names are symbols
-now.  The same goes for many key-value constructs in headers.  Guile
-parses the challenge/authentication headers now, as well.  Header decl
-objects are no longer exposed to the user.
+* Speed improvements
 
-*** Request and response bodies are always bytevectors
+** Guile has a new optimizer, `peval'.
 
-Reading bodies as latin-1 strings was a cute hack, but not general, so
-Guile's only official fetch-me-the-body procedures return bytevectors
-now.
+`Peval' is a partial evaluator that performs constant folding, dead code
+elimination, copy propagation, and inlining.  By default it runs on
+every piece of code that Guile compiles, to fold computations that can
+happen at compile-time, so they don't have to happen at runtime.
 
-** New procedures: scm_{to,from}_{utf8,latin1}_symbol{n,}
-** New procedures: scm_{to,from}_{utf8,utf32,latin1}_symbol{n,}
+If we did our job right, the only impact you would see would be your
+programs getting faster.  But if you notice slowdowns or bloated code,
+please send a mail to bug-guile@gnu.org with details.
+
+Thanks to William R. Cook, Oscar Waddell, and Kent Dybvig for inspiring
+peval and its implementation.
+
+You can see what peval does on a given piece of code by running the new
+`,optimize' REPL meta-command, and comparing it to the output of
+`,expand'.  See "Compile Commands" in the manual, for more.
+
+** Fewer calls to `stat'.
+
+Guile now stats only the .go file and the .scm file when loading a fresh
+compiled file.
+
+* Notable changes
+
+** New module: `(web client)', a simple synchronous web client.
+
+See "Web Client" in the manual, for more.
+
+** Users can now install compiled `.go' files.
+
+See "Installing Site Packages" in the manual.
+
+** Remove Front-Cover and Back-Cover text from the manual.
     
-These new procedures convert to and from string representations in
-particular encodings.
+The manual is still under the GNU Free Documentation License, but no
+longer has any invariant sections.
 
-Basically, continue to use locale encoding for user input, user output,
-or interacting with the C library.  Use latin1 for ASCII, and for
-literals in source code.  Use utf8 for interaction with modern libraries
-which deal in UTF-8.  Use utf32 for interaction with utf32-using
-libraries.  Otherwise use scm_to_stringn or scm_from_stringn with a
-specific encoding.
+** More helpful `guild help'.
+    
+`guild' is Guile's multi-tool, for use in shell scripting.  Now it has a
+nicer interface for querying the set of existing commands, and getting
+help on those commands.  Try it out and see!
 
-Also, scm_from_latin1_symbol is quite a bit faster now.
+** New macro: `define-syntax-rule'
 
-** Documentation updates
+`define-syntax-rule' is a shorthand to make a `syntax-rules' macro with
+one clause.  See "Syntax Rules" in the manual, for more.
 
-The GOOPS manual saw a lot of work, as well as documentation for the
-`(web ...)' modules.
+** The `,time' REPL meta-command now has more precision.
 
-** Guile uses iconv directly for reading from and writing to ports.
+The output of this command now has microsecond precision, instead of
+10-millisecond precision.
 
-In addition to providing faster Unicode I/O (e.g., `display',
-`read-char'), this change improves error reporting.
+** `(ice-9 match)' can now match records.
+    
+See "Pattern Matching" in the manual, for more on matching records.
 
-For instance, the `encoding-error' exception conveys information about
-the port and character that could not be encoded.  Likewise, the new
-`decoding-error' exception conveys information about the port from which
-data failed to be decoded, and leaves the port in a known position.
+** New module: `(language tree-il debug)'.
 
-** Source files default to UTF-8.
+This module provides a tree-il verifier.  This is useful for people that
+generate tree-il, usually as part of a language compiler.
 
-If source files do not specify their encoding via a `coding:' block,
-the default encoding is UTF-8, instead of being taken from the current
-locale.
+** New functions: `scm_is_exact', `scm_is_inexact'.
+    
+These provide a nice C interface for Scheme's `exact?' and `inexact?',
+respectively.
 
-** Man page updates
+* Bugs fixed
 
-Thanks to Mark Harig for many suggestions regarding the manual page,
-which is getting better.
+See the git log (or the ChangeLog) for more details on these bugs.
+
+** Fix order of importing modules and resolving duplicates handlers.
+** Fix a number of bugs involving extended (merged) generics.
+** Fix invocation of merge-generics duplicate handler.
+** Fix write beyond array end in arrays.c.
+** Fix read beyond end of hashtable size array in hashtab.c.
+** (web http): Locale-independent parsing and serialization of dates.
+** Ensure presence of Host header in HTTP/1.1 requests.
+** Fix take-right and drop-right for improper lists.
+** Fix leak in get_current_locale().
+** Fix recursive define-inlinable expansions.
+** Check that srfi-1 procedure arguments are procedures.
+** Fix r6rs `map' for multiple returns.
+** Fix scm_tmpfile leak on POSIX platforms.
+** Fix a couple of leaks (objcode->bytecode, make-boot-program).
+** Fix guile-lib back-compatibility for module-stexi-documentation.
+** Fix --listen option to allow other ports.
+** Fix scm_to_latin1_stringn for substrings.
+** Fix compilation of untyped arrays of rank not 1.
+** Fix unparse-tree-il of <dynset>.
+** Fix reading of #||||#.
+** Fix segfault in GOOPS when class fields are redefined.
+** Prefer poll(2) over select(2) to allow file descriptors above FD_SETSIZE.
 
-** Interactive Guile installs the current locale.
+\f
+Changes in 2.0.2 (since 2.0.1):
+
+* Notable changes
+
+** `guile-tools' renamed to `guild'
     
-Instead of leaving the user in the "C" locale, running the Guile REPL
-installs the current locale.  [FIXME xref?]
+The new name is shorter.  Its intended future use is for a CPAN-like
+system for Guile wizards and journeyfolk to band together to share code;
+hence the name.  `guile-tools' is provided as a backward-compatible
+symbolic link.  See "Using Guile Tools" in the manual, for more.
 
-** `recv!', `recvfrom!', `send', `sendto' now deal in bytevectors
+** New control operators: `shift' and `reset'
+    
+See "Shift and Reset" in the manual, for more information.
 
-These socket procedures now take bytevectors as arguments, instead of
-strings.  There is some deprecated string support, however.
+** `while' as an expression
+    
+Previously the return value of `while' was unspecified.  Now its
+values are specified both in the case of normal termination, and via
+termination by invoking `break', possibly with arguments.  See "while
+do" in the manual for more.
 
-** New foreign API: `define-wrapped-pointer-type', `pointer?'
+** Disallow access to handles of weak hash tables
     
-See "Foreign Types", for more.
+`hash-get-handle' and `hash-create-handle!' are no longer permitted to
+be called on weak hash tables, because the fields in a weak handle could
+be nulled out by the garbage collector at any time, but yet they are
+otherwise indistinguishable from pairs.  Use `hash-ref' and `hash-set!'
+instead.
 
-** Changes and bugfixes in numerics code
+** More precision for `get-internal-run-time', `get-internal-real-time'
+    
+On 64-bit systems which support POSIX clocks, Guile's internal timing
+procedures offer nanosecond resolution instead of the 10-millisecond
+resolution previously available.  32-bit systems now use 1-millisecond
+timers.
 
-*** Added two new sets of fast quotient and remainder operators
+** Guile now measures time spent in GC
+    
+`gc-stats' now returns a meaningful value for `gc-time-taken'.
 
-Added two new sets of fast quotient and remainder operator pairs with
-different semantics than the R5RS operators.  They support not only
-integers, but all reals, including exact rationals and inexact
-floating point numbers.
+** Add `gcprof'
+    
+The statprof profiler now exports a `gcprof' procedure, driven by the
+`after-gc-hook', to see which parts of your program are causing GC.  Let
+us know if you find it useful.
 
-These procedures accept two real numbers N and D, where the divisor D
-must be non-zero.  `euclidean-quotient' returns the integer Q and
-`euclidean-remainder' returns the real R such that N = Q*D + R and
-0 <= R < |D|.  `euclidean/' returns both Q and R, and is more
-efficient than computing each separately.  Note that when D > 0,
-`euclidean-quotient' returns floor(N/D), and when D < 0 it returns
-ceiling(N/D).
+** `map', `for-each' and some others now implemented in Scheme
 
-`centered-quotient', `centered-remainder', and `centered/' are similar
-except that the range of remainders is -abs(D/2) <= R < abs(D/2), and
-`centered-quotient' rounds N/D to the nearest integer.
+We would not mention this in NEWS, as it is not a user-visible change,
+if it were not for one thing: `map' and `for-each' are no longer
+primitive generics.  Instead they are normal bindings, which can be
+wrapped by normal generics.  This fixes some modularity issues between
+core `map', SRFI-1 `map', and GOOPS.
 
-Note that these operators are equivalent to the R6RS integer division
-operators `div', `mod', `div-and-mod', `div0', `mod0', and
-`div0-and-mod0'.
+Also it's pretty cool that we can do this without a performance impact.
 
-*** Complex number changes
+** Add `scm_peek_byte_or_eof'.
+    
+This helper is like `scm_peek_char_or_eof', but for bytes instead of
+full characters.
 
-Guile is now able to represent non-real complex numbers whose
-imaginary part is an _inexact_ zero (0.0 or -0.0), per R6RS.
-Previously, such numbers were immediately changed into inexact reals.
+** Implement #:stop-at-first-non-option option for getopt-long
+    
+See "getopt-long Reference" in the manual, for more information.
 
-(real? 0.0+0.0i) now returns #f, per R6RS, although (zero? 0.0+0.0i)
-still returns #t, per R6RS.  (= 0 0.0+0.0i) and (= 0.0 0.0+0.0i) are
-#t, but the same comparisons using `eqv?' or `equal?' are #f.
+** Improve R6RS conformance for conditions in the I/O libraries
+    
+The `(rnrs io simple)' module now raises the correct R6RS conditions in
+error cases.  `(rnrs io ports)' is also more correct now, though it is
+still a work in progress.
 
-Like other non-real numbers, these complex numbers with inexact zero
-imaginary part will raise exceptions is passed to procedures requiring
-reals, such as `<', `>', `<=', `>=', `min', `max', `positive?',
-`negative?', `inf?', `nan?', `finite?', etc.
+** All deprecated routines emit warnings
+    
+A few deprecated routines were lacking deprecation warnings.  This has
+been fixed now.
 
-**** `make-rectangular' changes
+* Speed improvements
 
-scm_make_rectangular `make-rectangular' now returns a real number only
-if the imaginary part is an _exact_ 0.  Previously, it would return a
-real number if the imaginary part was an inexact zero.
+** Constants in compiled code now share state better
 
-scm_c_make_rectangular now always returns a non-real complex number,
-even if the imaginary part is zero.  Previously, it would return a
-real number if the imaginary part was zero.
+Constants with shared state, like `("foo")' and `"foo"', now share state
+as much as possible, in the entire compilation unit.  This cuts compiled
+`.go' file sizes in half, generally, and speeds startup.
 
-**** `make-polar' changes
+** VLists: optimize `vlist-fold-right', and add `vhash-fold-right'
 
-scm_make_polar `make-polar' now returns a real number only if the
-angle or magnitude is an _exact_ 0.  If the magnitude is an exact 0,
-it now returns an exact 0.  Previously, it would return a real
-number if the imaginary part was an inexact zero.
+These procedures are now twice as fast as they were.
 
-scm_c_make_polar now always returns a non-real complex number, even if
-the imaginary part is 0.0.  Previously, it would return a real number
-if the imaginary part was 0.0.
+** UTF-8 ports to bypass `iconv' entirely
+    
+This reduces memory usage in a very common case.
 
-**** `imag-part' changes
+** Compiler speedups
 
-scm_imag_part `imag-part' now returns an exact 0 if applied to an
-inexact real number.  Previously it returned an inexact zero in this
-case.
+The compiler is now about 40% faster.  (Note that this is only the case
+once the compiler is itself compiled, so the build still takes as long
+as it did before.)
 
-*** `eqv?' and `equal?' now compare numbers equivalently
+** VM speed tuning
+    
+Some assertions that were mostly useful for sanity-checks on the
+bytecode compiler are now off for both "regular" and "debug" engines.
+This together with a fix to cache a TLS access and some other tweaks
+improve the VM's performance by about 20%.
 
-scm_equal_p `equal?' now behaves equivalently to scm_eqv_p `eqv?' for
-numeric values, per R5RS.  Previously, equal? worked differently,
-e.g. `(equal? 0.0 -0.0)' returned #t but `(eqv? 0.0 -0.0)' returned #f,
-and `(equal? +nan.0 +nan.0)' returned #f but `(eqv? +nan.0 +nan.0)'
-returned #t.
+** SRFI-1 list-set optimizations
 
-*** `(equal? +nan.0 +nan.0)' now returns #t
+lset-adjoin and lset-union now have fast paths for eq? sets.
 
-Previously, `(equal? +nan.0 +nan.0)' returned #f, although
-`(let ((x +nan.0)) (equal? x x))' and `(eqv? +nan.0 +nan.0)'
-both returned #t.  R5RS requires that `equal?' behave like
-`eqv?' when comparing numbers.
+** `memq', `memv' optimizations
 
-*** Change in handling products `*' involving exact 0
+These procedures are now at least twice as fast than in 2.0.1.
 
-scm_product `*' now handles exact 0 differently.  A product containing
-an exact 0 now returns an exact 0 if and only if the other arguments
-are all exact.  An inexact zero is returned if and only if the other
-arguments are all finite but not all exact.  If an infinite or NaN
-value is present, a NaN value is returned.  Previously, any product
-containing an exact 0 yielded an exact 0, regardless of the other
-arguments.
+* Deprecations
 
-*** `expt' and `integer-expt' changes when the base is 0
+** Deprecate scm_whash API
+    
+`scm_whash_get_handle', `SCM_WHASHFOUNDP', `SCM_WHASHREF',
+`SCM_WHASHSET', `scm_whash_create_handle', `scm_whash_lookup', and
+`scm_whash_insert' are now deprecated.  Use the normal hash table API
+instead.
 
-While `(expt 0 0)' is still 1, and `(expt 0 N)' for N > 0 is still
-zero, `(expt 0 N)' for N < 0 is now a NaN value, and likewise for
-integer-expt.  This is more correct, and conforming to R6RS, but seems
-to be incompatible with R5RS, which would return 0 for all non-zero
-values of N.
+** Deprecate scm_struct_table
+    
+`SCM_STRUCT_TABLE_NAME', `SCM_SET_STRUCT_TABLE_NAME',
+`SCM_STRUCT_TABLE_CLASS', `SCM_SET_STRUCT_TABLE_CLASS',
+`scm_struct_table', and `scm_struct_create_handle' are now deprecated.
+These routines formed part of the internals of the map between structs
+and classes.
 
-*** `expt' and `integer-expt' are more generic, less strict
+** Deprecate scm_internal_dynamic_wind
+    
+The `scm_t_inner' type and `scm_internal_dynamic_wind' are deprecated,
+as the `scm_dynwind' API is better, and this API encourages users to
+stuff SCM values into pointers.
 
-When raising to an exact non-negative integer exponent, `expt' and
-`integer-expt' are now able to exponentiate any object that can be
-multiplied using `*'.  They can also raise an object to an exact
-negative integer power if its reciprocal can be taken using `/'.
-In order to allow this, the type of the first argument is no longer
-checked when raising to an exact integer power.  If the exponent is 0
-or 1, the first parameter is not manipulated at all, and need not
-even support multiplication.
+** Deprecate scm_immutable_cell, scm_immutable_double_cell
+    
+These routines are deprecated, as the GC_STUBBORN API doesn't do
+anything any more.
 
-*** Infinities are no longer integers, nor rationals
+* Manual updates
 
-scm_integer_p `integer?' and scm_rational_p `rational?' now return #f
-for infinities, per R6RS.  Previously they returned #t for real
-infinities.  The real infinities and NaNs are still considered real by
-scm_real `real?' however, per R6RS.
+Andreas Rottman kindly transcribed the missing parts of the `(rnrs io
+ports)' documentation from the R6RS documentation.  Thanks Andreas!
 
-*** NaNs are no longer rationals
+* Bugs fixed
 
-scm_rational_p `rational?' now returns #f for NaN values, per R6RS.
-Previously it returned #t for real NaN values.  They are still
-considered real by scm_real `real?' however, per R6RS.
+** Fix double-loading of script in -ds case
+** -x error message fix
+** iconveh-related cross-compilation fixes
+** Fix small integer return value packing on big endian machines.
+** Fix hash-set! in weak-value table from non-immediate to immediate
+** Fix call-with-input-file & relatives for multiple values
+** Fix `hash' for inf and nan
+** Fix libguile internal type errors caught by typing-strictness==2
+** Fix compile error in MinGW fstat socket detection
+** Fix generation of auto-compiled file names on MinGW
+** Fix multithreaded access to internal hash tables
+** Emit a 1-based line number in error messages
+** Fix define-module ordering
+** Fix several POSIX functions to use the locale encoding
+** Add type and range checks to the complex generalized vector accessors
+** Fix unaligned accesses for bytevectors of complex numbers
+** Fix '(a #{.} b)
+** Fix erroneous VM stack overflow for canceled threads
+    
+\f
+Changes in 2.0.1 (since 2.0.0):
 
-*** `inf?' and `nan?' now throw exceptions for non-reals
+* Notable changes
 
-The domain of `inf?' and `nan?' is the real numbers.  Guile now signals
-an error when a non-real number or non-number is passed to these
-procedures.  (Note that NaNs _are_ considered numbers by scheme, despite
-their name).
+** guile.m4 supports linking with rpath
+    
+The GUILE_FLAGS macro now sets GUILE_LIBS and GUILE_LTLIBS, which
+include appropriate directives to the linker to include libguile-2.0.so
+in the runtime library lookup path.
 
-*** `rationalize' bugfixes and changes
+** `begin' expands macros in its body before other expressions
 
-Fixed bugs in scm_rationalize `rationalize'.  Previously, it returned
-exact integers unmodified, although that was incorrect if the epsilon
-was at least 1 or inexact, e.g. (rationalize 4 1) should return 3 per
-R5RS and R6RS, but previously it returned 4.  It also now handles
-cases involving infinities and NaNs properly, per R6RS.
+This enables support for programs like the following:
 
-*** Trigonometric functions now return exact numbers in some cases
+    (begin
+      (define even?
+        (lambda (x)
+          (or (= x 0) (odd? (- x 1)))))
+      (define-syntax odd?
+        (syntax-rules ()
+          ((odd? x) (not (even? x)))))
+      (even? 10))
 
-scm_sin `sin', scm_cos `cos', scm_tan `tan', scm_asin `asin', scm_acos
-`acos', scm_atan `atan', scm_sinh `sinh', scm_cosh `cosh', scm_tanh
-`tanh', scm_sys_asinh `asinh', scm_sys_acosh `acosh', and
-scm_sys_atanh `atanh' now return exact results in some cases.
+** REPL reader usability enhancements
 
-*** New procedure: `finite?'
+The REPL now flushes input after a read error, which should prevent one
+error from causing other errors.  The REPL also now interprets comments
+as whitespace.
 
-Add scm_finite_p `finite?' from R6RS to guile core, which returns #t
-if and only if its argument is neither infinite nor a NaN.  Note that
-this is not the same as (not (inf? x)) or (not (infinite? x)), since
-NaNs are neither finite nor infinite.
+** REPL output has configurable width
 
-*** R6RS base library changes
+The REPL now defaults to output with the current terminal's width, in
+columns.  See "Debug Commands" in the manual for more information on
+the ,width command.
 
-**** `div', `mod', `div-and-mod', `div0', `mod0', `div0-and-mod0'
+** Better C access to the module system
 
-Efficient versions of these R6RS division operators are now supported.
-See the NEWS entry entitled `Added two new sets of fast quotient and
-remainder operators' for more information.
+Guile now has convenient C accessors to look up variables or values in
+modules and their public interfaces.  See `scm_c_public_ref' and friends
+in "Accessing Modules from C" in the manual.
 
-**** `infinite?' changes
+** Added `scm_call_5', `scm_call_6'
+    
+See "Fly Evaluation" in the manual.
 
-`infinite?' and `finite?' now throw exceptions for non-numbers.  (Note
-that NaNs _are_ considered numbers by scheme, despite their name).
+** Added `scm_from_latin1_keyword', `scm_from_utf8_keyword'
+    
+See "Keyword Procedures" in the manual, for more.  Note that
+`scm_from_locale_keyword' should not be used when the name is a C string
+constant.
 
-**** `real-valued?', `rational-valued?' and `integer-valued?' changes
+** R6RS unicode and string I/O work
 
-These predicates are now implemented in accordance with R6RS.
+Added efficient implementations of `get-string-n' and `get-string-n!'
+for binary ports.  Exported `current-input-port', `current-output-port'
+and `current-error-port' from `(rnrs io ports)', and enhanced support
+for transcoders.
 
-** R6RS textual I/O procedures raise R6RS error conditions
+** Added `pointer->scm', `scm->pointer' to `(system foreign)'
+    
+These procedure are useful if one needs to pass and receive SCM values
+to and from foreign functions.  See "Foreign Variables" in the manual,
+for more.
+    
+** Added `heap-allocated-since-gc' to `(gc-stats)'
 
-R6RS procedures `get-char', `put-string', etc. now raise the correct
-R6RS error coding, i.e., `&i/o-decoding-error' or `&i/o-encoding-error'.
+Also fixed the long-standing bug in the REPL `,stat' command.
+    
+** Add `on-error' REPL option
+    
+This option controls what happens when an error occurs at the REPL, and
+defaults to `debug', indicating that Guile should enter the debugger.
+Other values include `report', which will simply print a backtrace
+without entering the debugger.  See "System Commands" in the manual.
 
-** New reader option: `hungry-eol-escapes'
+** Enforce immutability of string literals
 
-Guile's string syntax is more compatible with R6RS when the
-`hungry-eol-escapes' option is enabled.  See "String Syntax" in the
-manual, for more information.
+Attempting to mutate a string literal now causes a runtime error.
+    
+** Fix pthread redirection
+
+Guile 2.0.0 shipped with headers that, if configured with pthread
+support, would re-define `pthread_create', `pthread_join', and other API
+to redirect to the BDW-GC wrappers, `GC_pthread_create', etc.  This was
+unintended, and not necessary: because threads must enter Guile with
+`scm_with_guile', Guile can handle thread registration itself, without
+needing to make the GC aware of all threads.  This oversight has been
+fixed.
+
+** `with-continuation-barrier' now unwinds on `quit'
+
+A throw to `quit' in a continuation barrier will cause Guile to exit.
+Before, it would do so before unwinding to the barrier, which would
+prevent cleanup handlers from running.  This has been fixed so that it
+exits only after unwinding.
+    
+** `string->pointer' and `pointer->string' have optional encoding arg
+    
+This allows users of the FFI to more easily deal in strings with
+particular (non-locale) encodings, like "utf-8".  See "Void Pointers and
+Byte Access" in the manual, for more.
 
-** And of course, the usual collection of bugfixes
-Interested users should see the ChangeLog for more information.
+** R6RS fixnum arithmetic optimizations
+    
+R6RS fixnum operations are are still slower than generic arithmetic,
+however.
+
+** New procedure: `define-inlinable'
+    
+See "Inlinable Procedures" in the manual, for more.
+
+** New procedure: `exact-integer-sqrt'
+
+See "Integer Operations" in the manual, for more.
+    
+** "Extended read syntax" for symbols parses better
+
+In #{foo}# symbols, backslashes are now treated as escapes, as the
+symbol-printing code intended.  Additionally, "\x" within #{foo}# is now
+interpreted as starting an R6RS hex escape.  This is backward compatible
+because the symbol printer would never produce a "\x" before.  The
+printer also works better too.
+
+** Added `--fresh-auto-compile' option
+
+This allows a user to invalidate the auto-compilation cache.  It's
+usually not needed.  See "Compilation" in the manual, for a discussion.
+
+* Manual updates
+
+** GOOPS documentation updates
+
+** New man page
+
+Thanks to Mark Harig for improvements to guile.1.
+
+** SRFI-23 documented
+
+The humble `error' SRFI now has an entry in the manual.
+
+* New modules
+
+** `(ice-9 binary-ports)': "R6RS I/O Ports", in the manual
+** `(ice-9 eval-string)': "Fly Evaluation", in the manual
+** `(ice-9 command-line)', not documented yet
+    
+* Bugs fixed
+
+** Fixed `iconv_t' memory leak on close-port
+** Fixed some leaks with weak hash tables
+** Export `vhash-delq' and `vhash-delv' from `(ice-9 vlist)'
+** `after-gc-hook' works again
+** `define-record-type' now allowed in nested contexts
+** `exact-integer-sqrt' now handles large integers correctly
+** Fixed C extension examples in manual
+** `vhash-delete' honors HASH argument
+** Make `locale-digit-grouping' more robust
+** Default exception printer robustness fixes
+** Fix presence of non-I CPPFLAGS in `guile-2.0.pc'
+** `read' updates line/column numbers when reading SCSH block comments
+** Fix imports of multiple custom interfaces of same module
+** Fix encoding scanning for non-seekable ports
+** Fix `setter' when called with a non-setter generic
+** Fix f32 and f64 bytevectors to not accept rationals
+** Fix description of the R6RS `finite?' in manual
+** Quotient, remainder and modulo accept inexact integers again
+** Fix `continue' within `while' to take zero arguments
+** Fix alignment for structures in FFI
+** Fix port-filename of stdin, stdout, stderr to match the docs
+** Fix weak hash table-related bug in `define-wrapped-pointer-type'
+** Fix partial continuation application with pending procedure calls
+** scm_{to,from}_locale_string use current locale, not current ports
+** Fix thread cleanup, by using a pthread_key destructor
+** Fix `quit' at the REPL
+** Fix a failure to sync regs in vm bytevector ops
+** Fix (texinfo reflection) to handle nested structures like syntax patterns
+** Fix stexi->html double translation
+** Fix tree-il->scheme fix for <prompt>
+** Fix compilation of <prompt> in <fix> in single-value context
+** Fix race condition in ensure-writable-dir
+** Fix error message on ,disassemble "non-procedure"
+** Fix prompt and abort with the boot evaluator
+** Fix `procedure->pointer' for functions returning `void'
+** Fix error reporting in dynamic-pointer
+** Fix problems detecting coding: in block comments
+** Fix duplicate load-path and load-compiled-path in compilation environment
+** Add fallback read(2) suppport for .go files if mmap(2) unavailable
+** Fix c32vector-set!, c64vector-set!
+** Fix mistakenly deprecated read syntax for uniform complex vectors
+** Fix parsing of exact numbers with negative exponents
+** Ignore SIGPIPE in (system repl server)
+** Fix optional second arg to R6RS log function
+** Fix R6RS `assert' to return true value.
+** Fix fencepost error when seeking in bytevector input ports
+** Gracefully handle `setlocale' errors when starting the REPL
+** Improve support of the `--disable-posix' configure option
+** Make sure R6RS binary ports pass `binary-port?' regardless of the locale
+** Gracefully handle unterminated UTF-8 sequences instead of hitting an `assert'
 
 
 \f
-Changes in 1.9.x (since the 1.8.x series):
+Changes in 2.0.0 (changes since the 1.8.x series):
 
 * New modules (see the manual for details)
 
@@ -411,7 +776,8 @@ The guile binary now supports a new switch "-x", which can be used to
 extend the list of filename extensions tried when loading files
 (%load-extensions).
 
-** New reader options: `square-brackets' and `r6rs-hex-escapes'
+** New reader options: `square-brackets', `r6rs-hex-escapes',
+   `hungry-eol-escapes'
 
 The reader supports a new option (changeable via `read-options'),
 `square-brackets', which instructs it to interpret square brackets as
@@ -422,6 +788,11 @@ will recognize string escape sequences as defined in R6RS.  R6RS string
 escape sequences are incompatible with Guile's existing escapes, though,
 so this option is off by default.
 
+Additionally, Guile follows the R6RS newline escaping rules when the
+`hungry-eol-escapes' option is enabled.
+
+See "String Syntax" in the manual, for more information.
+
 ** Function profiling and tracing at the REPL
     
 The `,profile FORM' REPL meta-command can now be used to statistically
@@ -573,12 +944,12 @@ newer than that of the .scm file; if the .scm or .go files are moved
 after installation, care should be taken to preserve their original
 timestamps.
 
-Autocompiled files will be stored in the $XDG_CACHE_HOME/guile/ccache
+Auto-compiled files will be stored in the $XDG_CACHE_HOME/guile/ccache
 directory, where $XDG_CACHE_HOME defaults to ~/.cache. This directory
 will be created if needed.
 
-To inhibit autocompilation, set the GUILE_AUTO_COMPILE environment
-variable to 0, or pass --no-autocompile on the Guile command line.
+To inhibit automatic compilation, set the GUILE_AUTO_COMPILE environment
+variable to 0, or pass --no-auto-compile on the Guile command line.
 
 ** New POSIX procedures: `getrlimit' and `setrlimit'
 
@@ -599,6 +970,11 @@ Support was added for the IP_MULTICAST_TTL and IP_MULTICAST_IF socket
 options.  See "Network Sockets and Communication" in the manual, for
 more information.
 
+** `recv!', `recvfrom!', `send', `sendto' now deal in bytevectors
+
+These socket procedures now take bytevectors as arguments, instead of
+strings.  There is some deprecated string support, however.
+
 ** New GNU procedures: `setaffinity' and `getaffinity'.
     
 See "Processes" in the manual, for more information.
@@ -747,11 +1123,9 @@ In this specific case, it would be better to do:
 
   (define foo (if test 'bar 'baz))
 
-It is certainly possible to circumvent this resriction with e.g.
-`(module-define! (current-module) 'foo 'baz)'. We would appreciate
-feedback about this change (a consequence of using psyntax as the
-default expander), and may choose to revisit this situation before 2.0
-in response to user feedback.
+It is possible to circumvent this restriction with e.g.
+`(module-define! (current-module) 'foo 'baz)'.  Contact the list if you
+have any questions.
 
 ** Support for `letrec*'
 
@@ -898,6 +1272,11 @@ subsequent datum: #'foo => foo. In the unlikely event that anyone
 actually used this, this behavior may be reinstated via the
 `read-hash-extend' mechanism.
 
+** `unquote' and `unquote-splicing' accept multiple expressions
+    
+As per the R6RS, these syntax operators can now accept any number of
+expressions to unquote.
+
 ** Scheme expresssions may be commented out with #;
 
 #; comments out an entire expression.  See SRFI-62 or the R6RS for more
@@ -933,6 +1312,13 @@ different from backtraces in interpreted code. There are no semantic
 differences, however. Please mail bug-guile@gnu.org if you see any
 deficiencies with Guile's backtraces.
 
+** `positions' reader option enabled by default
+    
+This change allows primitive-load without --auto-compile to also
+propagate source information through the expander, for better errors and
+to let macros know their source locations.  The compiler was already
+turning it on anyway.
+
 ** New macro: `current-source-location'
 
 The macro returns the current source location (to be documented).
@@ -1027,6 +1413,16 @@ calls need to be in scope. Now we ensure that the current module when
 loading a module is one that has the needed bindings, instead of relying
 on chance.
 
+** `load' is a macro (!) that resolves paths relative to source file dir
+    
+The familiar Schem `load' procedure is now a macro that captures the
+name of the source file being expanded, and dispatches to the new
+`load-in-vicinity'.  Referencing `load' by bare name returns a closure
+that embeds the current source file name.
+
+This fix allows `load' of relative paths to be resolved with respect to
+the location of the file that calls `load'.
+
 ** Many syntax errors have different texts now
 
 Syntax errors still throw to the `syntax-error' key, but the arguments
@@ -1193,7 +1589,7 @@ Arguments", and "Case-lambda" in the manual.
 
 Instead of accessing a procedure's arity as a property, use the new
 `procedure-minimum-arity' function, which gives the most permissive
-arity that the the function has, in the same format as the old arity
+arity that the function has, in the same format as the old arity
 accessor.
 
 ** `lambda*' and `define*' are now available in the default environment
@@ -1203,6 +1599,11 @@ compatibility purposes. No semantic change has been made (we hope).
 Optional and keyword arguments now dispatch via special VM operations,
 without the need to cons rest arguments, making them very fast.
 
+** New syntax: define-once
+
+`define-once' is like Lisp's `defvar': it creates a toplevel binding,
+but only if one does not exist already.
+
 ** New function, `truncated-print', with `format' support
 
 `(ice-9 pretty-print)' now exports `truncated-print', a printer that
@@ -1224,6 +1625,9 @@ macros like `quote' are printed better.
 The `format' procedure in `(ice-9 format)' now emits a deprecation
 warning if a number is passed as its first argument.
 
+Also, it used to be that you could omit passing a port to `format', in
+some cases.  This still works, but has been formally deprecated.
+    
 ** SRFI-4 vectors reimplemented in terms of R6RS bytevectors
 
 Guile now implements SRFI-4 vectors using bytevectors. Often when you
@@ -1278,6 +1682,198 @@ implementation.
 `*unspecified*' is no longer a variable, so it is optimized properly by
 the compiler, and is not `set!'-able.
 
+** Changes and bugfixes in numerics code
+
+*** Added six new sets of fast quotient and remainder operators
+
+Added six new sets of fast quotient and remainder operator pairs with
+different semantics than the R5RS operators.  They support not only
+integers, but all reals, including exact rationals and inexact
+floating point numbers.
+
+These procedures accept two real numbers N and D, where the divisor D
+must be non-zero.  Each set of operators computes an integer quotient
+Q and a real remainder R such that N = Q*D + R and |R| < |D|.  They
+differ only in how N/D is rounded to produce Q.
+
+`euclidean-quotient' returns the integer Q and `euclidean-remainder'
+returns the real R such that N = Q*D + R and 0 <= R < |D|.  `euclidean/'
+returns both Q and R, and is more efficient than computing each
+separately.  Note that when D > 0, `euclidean-quotient' returns
+floor(N/D), and when D < 0 it returns ceiling(N/D).
+
+`centered-quotient', `centered-remainder', and `centered/' are similar
+except that the range of remainders is -abs(D/2) <= R < abs(D/2), and
+`centered-quotient' rounds N/D to the nearest integer.  Note that these
+operators are equivalent to the R6RS integer division operators `div',
+`mod', `div-and-mod', `div0', `mod0', and `div0-and-mod0'.
+
+`floor-quotient' and `floor-remainder' compute Q and R, respectively,
+where Q has been rounded toward negative infinity.  `floor/' returns
+both Q and R, and is more efficient than computing each separately.
+Note that when applied to integers, `floor-remainder' is equivalent to
+the R5RS integer-only `modulo' operator.  `ceiling-quotient',
+`ceiling-remainder', and `ceiling/' are similar except that Q is
+rounded toward positive infinity.
+
+For `truncate-quotient', `truncate-remainder', and `truncate/', Q is
+rounded toward zero.  Note that when applied to integers,
+`truncate-quotient' and `truncate-remainder' are equivalent to the
+R5RS integer-only operators `quotient' and `remainder'.
+
+For `round-quotient', `round-remainder', and `round/', Q is rounded to
+the nearest integer, with ties going to the nearest even integer.
+
+*** Complex number changes
+
+Guile is now able to represent non-real complex numbers whose
+imaginary part is an _inexact_ zero (0.0 or -0.0), per R6RS.
+Previously, such numbers were immediately changed into inexact reals.
+
+(real? 0.0+0.0i) now returns #f, per R6RS, although (zero? 0.0+0.0i)
+still returns #t, per R6RS.  (= 0 0.0+0.0i) and (= 0.0 0.0+0.0i) are
+#t, but the same comparisons using `eqv?' or `equal?' are #f.
+
+Like other non-real numbers, these complex numbers with inexact zero
+imaginary part will raise exceptions is passed to procedures requiring
+reals, such as `<', `>', `<=', `>=', `min', `max', `positive?',
+`negative?', `inf?', `nan?', `finite?', etc.
+
+**** `make-rectangular' changes
+
+scm_make_rectangular `make-rectangular' now returns a real number only
+if the imaginary part is an _exact_ 0.  Previously, it would return a
+real number if the imaginary part was an inexact zero.
+
+scm_c_make_rectangular now always returns a non-real complex number,
+even if the imaginary part is zero.  Previously, it would return a
+real number if the imaginary part was zero.
+
+**** `make-polar' changes
+
+scm_make_polar `make-polar' now returns a real number only if the
+angle or magnitude is an _exact_ 0.  If the magnitude is an exact 0,
+it now returns an exact 0.  Previously, it would return a real
+number if the imaginary part was an inexact zero.
+
+scm_c_make_polar now always returns a non-real complex number, even if
+the imaginary part is 0.0.  Previously, it would return a real number
+if the imaginary part was 0.0.
+
+**** `imag-part' changes
+
+scm_imag_part `imag-part' now returns an exact 0 if applied to an
+inexact real number.  Previously it returned an inexact zero in this
+case.
+
+*** `eqv?' and `equal?' now compare numbers equivalently
+
+scm_equal_p `equal?' now behaves equivalently to scm_eqv_p `eqv?' for
+numeric values, per R5RS.  Previously, equal? worked differently,
+e.g. `(equal? 0.0 -0.0)' returned #t but `(eqv? 0.0 -0.0)' returned #f,
+and `(equal? +nan.0 +nan.0)' returned #f but `(eqv? +nan.0 +nan.0)'
+returned #t.
+
+*** `(equal? +nan.0 +nan.0)' now returns #t
+
+Previously, `(equal? +nan.0 +nan.0)' returned #f, although
+`(let ((x +nan.0)) (equal? x x))' and `(eqv? +nan.0 +nan.0)'
+both returned #t.  R5RS requires that `equal?' behave like
+`eqv?' when comparing numbers.
+
+*** Change in handling products `*' involving exact 0
+
+scm_product `*' now handles exact 0 differently.  A product containing
+an exact 0 now returns an exact 0 if and only if the other arguments
+are all exact.  An inexact zero is returned if and only if the other
+arguments are all finite but not all exact.  If an infinite or NaN
+value is present, a NaN value is returned.  Previously, any product
+containing an exact 0 yielded an exact 0, regardless of the other
+arguments.
+
+*** `expt' and `integer-expt' changes when the base is 0
+
+While `(expt 0 0)' is still 1, and `(expt 0 N)' for N > 0 is still
+zero, `(expt 0 N)' for N < 0 is now a NaN value, and likewise for
+integer-expt.  This is more correct, and conforming to R6RS, but seems
+to be incompatible with R5RS, which would return 0 for all non-zero
+values of N.
+
+*** `expt' and `integer-expt' are more generic, less strict
+
+When raising to an exact non-negative integer exponent, `expt' and
+`integer-expt' are now able to exponentiate any object that can be
+multiplied using `*'.  They can also raise an object to an exact
+negative integer power if its reciprocal can be taken using `/'.
+In order to allow this, the type of the first argument is no longer
+checked when raising to an exact integer power.  If the exponent is 0
+or 1, the first parameter is not manipulated at all, and need not
+even support multiplication.
+
+*** Infinities are no longer integers, nor rationals
+
+scm_integer_p `integer?' and scm_rational_p `rational?' now return #f
+for infinities, per R6RS.  Previously they returned #t for real
+infinities.  The real infinities and NaNs are still considered real by
+scm_real `real?' however, per R6RS.
+
+*** NaNs are no longer rationals
+
+scm_rational_p `rational?' now returns #f for NaN values, per R6RS.
+Previously it returned #t for real NaN values.  They are still
+considered real by scm_real `real?' however, per R6RS.
+
+*** `inf?' and `nan?' now throw exceptions for non-reals
+
+The domain of `inf?' and `nan?' is the real numbers.  Guile now signals
+an error when a non-real number or non-number is passed to these
+procedures.  (Note that NaNs _are_ considered numbers by scheme, despite
+their name).
+
+*** `rationalize' bugfixes and changes
+
+Fixed bugs in scm_rationalize `rationalize'.  Previously, it returned
+exact integers unmodified, although that was incorrect if the epsilon
+was at least 1 or inexact, e.g. (rationalize 4 1) should return 3 per
+R5RS and R6RS, but previously it returned 4.  It also now handles
+cases involving infinities and NaNs properly, per R6RS.
+
+*** Trigonometric functions now return exact numbers in some cases
+
+scm_sin `sin', scm_cos `cos', scm_tan `tan', scm_asin `asin', scm_acos
+`acos', scm_atan `atan', scm_sinh `sinh', scm_cosh `cosh', scm_tanh
+`tanh', scm_sys_asinh `asinh', scm_sys_acosh `acosh', and
+scm_sys_atanh `atanh' now return exact results in some cases.
+
+*** New procedure: `finite?'
+
+Add scm_finite_p `finite?' from R6RS to guile core, which returns #t
+if and only if its argument is neither infinite nor a NaN.  Note that
+this is not the same as (not (inf? x)) or (not (infinite? x)), since
+NaNs are neither finite nor infinite.
+
+*** Improved exactness handling for complex number parsing
+
+When parsing non-real complex numbers, exactness specifiers are now
+applied to each component, as is done in PLT Scheme.  For complex
+numbers written in rectangular form, exactness specifiers are applied
+to the real and imaginary parts before calling scm_make_rectangular.
+For complex numbers written in polar form, exactness specifiers are
+applied to the magnitude and angle before calling scm_make_polar.
+
+Previously, exactness specifiers were applied to the number as a whole
+_after_ calling scm_make_rectangular or scm_make_polar.
+
+For example, (string->number "#i5.0+0i") now does the equivalent of:
+
+  (make-rectangular (exact->inexact 5.0) (exact->inexact 0))
+
+which yields 5.0+0.0i.  Previously it did the equivalent of:
+
+  (exact->inexact (make-rectangular 5.0 0))
+
+which yielded 5.0.
+
 ** Unicode characters
 
 Unicode characters may be entered in octal format via e.g. `#\454', or
@@ -1312,6 +1908,17 @@ The pre-1.9.3 reader handled 8-bit clean but otherwise unspecified source
 code.  This use is now discouraged.  Binary input and output is
 currently supported by opening ports in the ISO-8859-1 locale.
 
+** Source files default to UTF-8.
+
+If source files do not specify their encoding via a `coding:' block,
+the default encoding is UTF-8, instead of being taken from the current
+locale.
+
+** Interactive Guile installs the current locale.
+    
+Instead of leaving the user in the "C" locale, running the Guile REPL
+installs the current locale.  [FIXME xref?]
+
 ** Support for locale transcoding when reading from and writing to ports
 
 Ports now have an associated character encoding, and port read and write
@@ -1387,6 +1994,14 @@ It used to be that a new thread entering Guile would do so in the
 in which case it was `(guile-user)'. This has been fixed to have all
 new threads unknown to Guile default to `(guile-user)'.
 
+** New helpers: `print-exception', `set-exception-printer!'
+
+These functions implement an extensible exception printer.  Guile
+registers printers for all of the exceptions it throws.  Users may add
+their own printers.  There is also `scm_print_exception', for use by C
+programs.  Pleasantly, this allows SRFI-35 and R6RS exceptions to be
+printed appropriately.
+
 ** GOOPS dispatch in scheme
 
 As an implementation detail, GOOPS dispatch is no longer implemented by
@@ -1437,6 +2052,12 @@ Guile now use a portable implementation of `inet_pton'/`inet_ntop', so
 there is no more need to use `inet-aton'/`inet-ntoa'. The latter
 functions are deprecated.
 
+** `getopt-long' parsing errors throw to `quit', not `misc-error'
+
+This change should inhibit backtraces on argument parsing errors.
+`getopt-long' has been modified to print out the error that it throws
+itself.
+
 ** New primitive: `tmpfile'.
     
 See "File System" in the manual.
@@ -1637,6 +2258,14 @@ should use Guile with Emacs.
 crazy. Please change to use `catch', possibly with a throw-handler, or
 `with-throw-handler'.
 
+** Deprecated: primitive properties
+
+The `primitive-make-property', `primitive-property-set!',
+`primitive-property-ref', and `primitive-property-del!' procedures were
+crufty and only used to implement object properties, which has a new,
+threadsafe implementation.  Use object properties or weak hash tables
+instead.
+
 ** Deprecated `@bind' syntax
 
 `@bind' was part of an older implementation of the Emacs Lisp language,
@@ -1644,13 +2273,14 @@ and is no longer used.
     
 ** Miscellaneous other deprecations
 
-`apply-to-args', `has-suffix?', `scheme-file-suffix'
-`get-option', `for-next-option', `display-usage-report',
-`transform-usage-lambda', `collect', `set-batch-mode?!',
-
 `cuserid' has been deprecated, as it only returns 8 bytes of a user's
 login.  Use `(passwd:name (getpwuid (geteuid)))' instead.
     
+Additionally, the procedures `apply-to-args', `has-suffix?', `scheme-file-suffix'
+`get-option', `for-next-option', `display-usage-report',
+`transform-usage-lambda', `collect', and `set-batch-mode?!' have all
+been deprecated.
+
 ** Add support for unbound fluids
     
 See `make-unbound-fluid', `fluid-unset!', and `fluid-bound?' in the
@@ -1673,15 +2303,23 @@ backward-compatible way.  A new allocation routine,
 Libgc is a conservative GC, which we hope will make interaction with C
 code easier and less error-prone.
 
-** New procedures: `scm_to_latin1_stringn', `scm_from_latin1_stringn'
+** New procedures: `scm_to_stringn', `scm_from_stringn'
+** New procedures: scm_{to,from}_{utf8,latin1}_symbol{n,}
+** New procedures: scm_{to,from}_{utf8,utf32,latin1}_string{n,}
+    
+These new procedures convert to and from string representations in
+particular encodings.
 
-Use these procedures when you know you have latin1-encoded or
-ASCII-encoded strings.
+Users should continue to use locale encoding for user input, user
+output, or interacting with the C library.
 
-** New procedures: `scm_to_stringn', `scm_from_stringn'
+Use the Latin-1 functions for ASCII, and for literals in source code.
 
-Use these procedures if you want to encode or decode from a particular
-locale.
+Use UTF-8 functions for interaction with modern libraries which deal in
+UTF-8, and UTF-32 for interaction with utf32-using libraries.
+
+Otherwise, use scm_to_stringn or scm_from_stringn with a specific
+encoding.
 
 ** New type definitions for `scm_t_intptr' and friends.
 
@@ -1721,7 +2359,7 @@ allocated to primitive procedures, each with its own calling convention.
 Now there is only one, the gsubr. This may affect user code if you were
 defining a procedure using scm_c_make_subr rather scm_c_make_gsubr. The
 solution is to switch to use scm_c_make_gsubr. This solution works well
-both with the old 1.8 and and with the current 1.9 branch.
+both with the old 1.8 and with the current 1.9 branch.
 
 Guile's old evaluator used to have special cases for applying "gsubrs",
 primitive procedures with specified numbers of required, optional, and
@@ -5758,7 +6396,7 @@ incrementally add to the innermost environment, without checking
 whether the restrictions specified in RnRS were met.  This lead to the
 correct behaviour when these restriction actually were met, but didn't
 catch all illegal uses.  Such an illegal use could lead to crashes of
-the Guile interpreter or or other unwanted results.  An example of
+the Guile interpreter or other unwanted results.  An example of
 incorrect internal defines that made Guile behave erratically:
 
   (let ()