Moved SRFI-4 docs into main part. Moved bit vectors out of array
[bpt/guile.git] / NEWS
diff --git a/NEWS b/NEWS
index 0d1bd79..f89df2c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,22 +1,43 @@
 Guile NEWS --- history of user-visible changes.
 Guile NEWS --- history of user-visible changes.
-Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 See the end for copying conditions.
 
 Please send Guile bug reports to bug-guile@gnu.org.
 See the end for copying conditions.
 
 Please send Guile bug reports to bug-guile@gnu.org.
+
+Each release reports the NEWS in the following sections:
+
+* Changes to the distribution
+* Changes to the stand-alone interpreter
+* Changes to Scheme functions and syntax
+* Changes to the C interface 
+
 \f
 \f
-Changes since the stable branch:
+Changes since the 1.6.x series:
 
 * Changes to the distribution
 
 
 * Changes to the distribution
 
-** Guile now provide and uses an "effective" version number.
+** Guile is now licensed with the GNU Lesser General Public License.
+
+** The manual is now licensed with the GNU Free Documentation License.
+
+** Guile now requires GNU MP (http://swox.com/gmp).
+
+Guile now uses the GNU MP library for arbitrary precision arithmetic.
+
+** Guile now has separate private and public configuration headers.
+
+That is, things like HAVE_STRING_H no longer leak from Guile's
+headers.
+
+** Guile now provides and uses an "effective" version number.
 
 Guile now provides scm_effective_version and effective-version
 functions which return the "effective" version number.  This is just
 the normal full version string without the final micro-version number,
 
 Guile now provides scm_effective_version and effective-version
 functions which return the "effective" version number.  This is just
 the normal full version string without the final micro-version number,
-so the current effective-version is "1.6".  The effective version
+so the current effective-version is "1.7".  The effective version
 should remain unchanged during a stable series, and should be used for
 items like the versioned share directory name
 should remain unchanged during a stable series, and should be used for
 items like the versioned share directory name
-i.e. /usr/share/guile/1.6.
+i.e. /usr/share/guile/1.7.
 
 Providing an unchanging version number during a stable release for
 things like the versioned share directory can be particularly
 
 Providing an unchanging version number during a stable release for
 things like the versioned share directory can be particularly
@@ -24,7 +45,7 @@ important for Guile "add-on" packages, since it provides a directory
 that they can install to that won't be changed out from under them
 with each micro release during a stable series.
 
 that they can install to that won't be changed out from under them
 with each micro release during a stable series.
 
-** There are two new thread implementation options: "null" and "coop-pthreads".
+** Thread implementation has changed.
 
 When you configure "--with-threads=null", you will get the usual
 threading API (call-with-new-thread, make-mutex, etc), but you can't
 
 When you configure "--with-threads=null", you will get the usual
 threading API (call-with-new-thread, make-mutex, etc), but you can't
@@ -33,21 +54,81 @@ equivalent to "--with-threads=null".  This means that the thread API
 is always present, although you might not be able to create new
 threads.
 
 is always present, although you might not be able to create new
 threads.
 
-The "coop-pthread" (or shorter: "copt") thread implementation will use
-portable POSIX threads but will restrict them so that only one thread
-can execute 'in Guile' at any one time.  This option will give you the
-same basic behavior as the old "coop" option, but hopefully in a more
-portable way.
+When you configure "--with-threads=pthreads" or "--with-threads=yes",
+you will get threads that are implemented with the portable POSIX
+threads.  These threads can run concurrently (unlike the previous
+"coop" thread implementation), but need to cooperate for things like
+the GC.  See the manual for details. [XXX - write this.]
+
+The default is "pthreads", unless your platform doesn't have pthreads,
+in which case "null" threads are used.
+
+** New module (ice-9 serialize):
+
+(serialize FORM1 ...) and (parallelize FORM1 ...) are useful when
+you don't trust the thread safety of most of your program, but
+where you have some section(s) of code which you consider can run
+in parallel to other sections.
+
+### move rest to manual
+
+They "flag" (with dynamic extent) sections of code to be of
+"serial" or "parallel" nature and have the single effect of
+preventing a serial section from being run in parallel with any
+serial section (including itself).
+
+Both serialize and parallelize can be nested.  If so, the
+inner-most construct is in effect.
+
+NOTE 1: A serial section can run in parallel with a parallel
+section.
+
+NOTE 2: If a serial section S is "interrupted" by a parallel
+section P in the following manner: S = S1 P S2, S2 is not
+guaranteed to be resumed by the same thread that previously
+executed S1.
+
+WARNING: Spawning new threads within a serial section have
+undefined effects.  It is OK, though, to spawn threads in unflagged
+sections of code where neither serialize or parallelize is in
+effect.
+
+A typical usage is when Guile is used as scripting language in some
+application doing heavy computations.  If each thread is
+encapsulated with a serialize form, you can then put a parallelize
+form around the code performing the heavy computations (typically a
+C code primitive), enabling the computations to run in parallel
+while the scripting code runs single-threadedly.
+
+** New module (srfi srfi-26)
+
+This is an implementation of SRFI-26.
+
+** New module (srfi srfi-31)
+
+This is an implementation of SRFI-31 which provides a special form
+`rec' for recursive evaluation.
+
+** The modules (srfi srfi-13) and (srfi srfi-14) have been merged with
+   the core, making their functionality always available.
 
 
-The default is now "coop-pthread", unless your platform doesn't have
-pthreads, in which case "null" threads are used.
+The modules are still available, tho, and you could use them together
+with a renaming import, for example.
 
 
-** Guile now includes its own version of libltdl.
+** Guile no longer includes its own version of libltdl.
 
 
-We now use a modified version of libltdl that allows us to make
-improvements to it without having to rely on libtool releases.
+The official version is good enough now.
 
 
-* Changes to the standalone interpreter
+** The --enable-htmldoc option has been removed from 'configure'.
+
+Support for translating the documentation into HTML is now always
+provided.  Use 'make html'.
+
+* Changes to the stand-alone interpreter
+
+** New command line option `-L'.
+
+This option adds a directory to the front of the load path.
 
 ** New command line option `--no-debug'.
 
 
 ** New command line option `--no-debug'.
 
@@ -59,27 +140,147 @@ evaluator turned off, even for interactive sessions.
 Previously, the normal evaluator would have been used.  Using the
 debugging evaluator gives better error messages.
 
 Previously, the normal evaluator would have been used.  Using the
 debugging evaluator gives better error messages.
 
+** The '-e' option now 'read's its argument.
+
+This is to allow the new '(@ MODULE-NAME VARIABLE-NAME)' construct to
+be used with '-e'.  For example, you can now write a script like
+
+  #! /bin/sh
+  exec guile -e '(@ (demo) main)' -s "$0" "$@"
+  !#
+
+  (define-module (demo)
+    :export (main))
+
+  (define (main args)
+    (format #t "Demo: ~a~%" args))
+
+
 * Changes to Scheme functions and syntax
 
 * Changes to Scheme functions and syntax
 
-** Checking for duplicate bindings in module system
+** There is now support for copy-on-write substrings, mutation-sharing
+   substrings and read-only strings.
+
+Three new procedures are related to this: substring/shared,
+substring/copy, and substring/read-only.  See the manual for more
+information.
+
+** Backtraces will now highlight the value that caused the error.
+
+By default, these values are enclosed in "{...}", such as in this
+example:
+
+    guile> (car 'a)
+
+    Backtrace:
+    In current input:
+       1: 0* [car {a}]
+
+    <unnamed port>:1:1: In procedure car in expression (car (quote a)):
+    <unnamed port>:1:1: Wrong type (expecting pair): a
+    ABORT: (wrong-type-arg)
+
+The prefix and suffix used for highlighting can be set via the two new
+printer options 'highlight-prefix' and 'highlight-suffix'.  For
+example, putting this into ~/.guile will output the bad value in bold
+on an ANSI terminal:
+
+    (print-set! highlight-prefix "\x1b[1m")
+    (print-set! highlight-suffix "\x1b[22m")
+
+
+** 'gettext' support for internationalization has been added.
+
+See the manual for details.
+
+** New syntax '@' and '@@':
+
+You can now directly refer to variables exported from a module by
+writing
+
+    (@ MODULE-NAME VARIABLE-NAME)
 
 
-The module system now checks for duplicate imported bindings.
+For example (@ (ice-9 pretty-print) pretty-print) will directly access
+the pretty-print variable exported from the (ice-9 pretty-print)
+module.  You don't need to 'use' that module first.  You can also use
+'@' as a target of 'set!', as in (set! (@ mod var) val).
 
 
-The behavior can be controlled by specifying one or more duplicates
-handlers.  For example, to get back the old behavior (which was to use
-the last imported binding of a certain name), write:
+The related syntax (@@ MODULE-NAME VARIABLE-NAME) works just like '@',
+but it can also access variables that have not been exported.  It is
+intended only for kluges and temporary fixes and for debugging, not
+for ordinary code.
+
+** Keyword syntax has been made more disciplined.
+
+Previously, the name of a keyword was read as a 'token' but printed as
+a symbol.  Now, it is read as a general Scheme datum which must be a
+symbol.
+
+Previously:
+
+    guile> #:12
+    #:#{12}#
+    guile> #:#{12}#
+    #:#{\#{12}\#}#
+    guile> #:(a b c)
+    #:#{}#
+    ERROR: In expression (a b c):
+           Unbound variable: a
+    guile> #: foo
+    #:#{}#
+    ERROR: Unbound variable: foo
+
+Now:
+
+    guile> #:12
+    ERROR: Wrong type (expecting symbol): 12
+    guile> #:#{12}#
+    #:#{12}#
+    guile> #:(a b c)
+    ERROR: Wrong type (expecting symbol): (a b c)
+    guile> #: foo
+    #:foo
+
+** 'while' now provides 'break' and 'continue'
+
+break and continue were previously bound in a while loop, but not
+documented, and continue didn't quite work properly.  The undocumented
+parameter to break which gave a return value for the while has been
+dropped.
+
+** 'call-with-current-continuation' is now also available under the name
+   'call/cc'.
+
+** The module system now checks for duplicate bindings.
+
+The module system now can check for name conflicts among imported
+bindings.
+
+The behavior can be controlled by specifying one or more 'duplicates'
+handlers.  For example, to make Guile return an error for every name
+collision, write:
 
 (define-module (foo)
   :use-module (bar)
   :use-module (baz)
 
 (define-module (foo)
   :use-module (bar)
   :use-module (baz)
-  :duplicates last)
+  :duplicates check)
+
+The new default behavior of the module system when a name collision
+has been detected is to
+
+ 1. Give priority to bindings marked as a replacement.
+ 2. Issue a warning (different warning if overriding core binding).
+ 3. Give priority to the last encountered binding (this corresponds to
+     the old behavior).
 
 
-If you want the old behavior without changing your module headers, put
-the line:
+If you want the old behavior back without replacements or warnings you
+can add the line:
 
 
-  (default-module-duplicates-handler 'last)
+  (default-duplicate-binding-handler 'last)
 
 
-in your .guile init file.
+to your .guile init file.
+
+### move rest to manual
 
 The syntax for the :duplicates option is:
 
 
 The syntax for the :duplicates option is:
 
@@ -95,14 +296,24 @@ Currently available duplicates handlers are:
   warn              issue a warning for bindings with a common name
   replace           replace bindings which have an imported replacement
   warn-override-core issue a warning for imports which override core bindings
   warn              issue a warning for bindings with a common name
   replace           replace bindings which have an imported replacement
   warn-override-core issue a warning for imports which override core bindings
+                    and accept the override
   first                     select the first encountered binding (override)
   last              select the last encountered binding (override)
   first                     select the first encountered binding (override)
   last              select the last encountered binding (override)
+
+These two are provided by the (oop goops) module:
+  
   merge-generics     merge generic functions with a common name
                     into an <extended-generic>
   merge-generics     merge generic functions with a common name
                     into an <extended-generic>
+  merge-accessors    merge accessors with a common name
 
 The default duplicates handler is:
 
 
 The default duplicates handler is:
 
-  (replace warn-override-core check)
+  (replace warn-override-core warn last)
+
+A recommended handler (which is likely to correspond to future Guile
+behavior) can be installed with:
+
+  (default-duplicate-binding-handler '(replace warn-override-core check))
 
 ** New define-module option: :replace
 
 
 ** New define-module option: :replace
 
@@ -112,7 +323,24 @@ replacement.
 A typical example is `format' in (ice-9 format) which is a replacement
 for the core binding `format'.
 
 A typical example is `format' in (ice-9 format) which is a replacement
 for the core binding `format'.
 
-** Merging generic functions
+** Adding prefixes to imported bindings in the module system
+
+There is now a new :use-module option :prefix.  It can be used to add
+a prefix to all imported bindings.
+
+  (define-module (foo)
+    :use-module ((bar) :prefix bar:))
+
+will import all bindings exported from bar, but rename them by adding
+the prefix `bar:'.
+
+** Conflicting generic functions can be automatically merged.
+
+When two imported bindings conflict and they are both generic
+functions, the two functions can now be merged automatically.  This is
+activated with the 'duplicates' handler 'merge-generics'.
+
+### move the rest to the manual
 
 It is sometimes tempting to use GOOPS accessors with short names.
 For example, it is tempting to use the name `x' for the x-coordinate
 
 It is sometimes tempting to use GOOPS accessors with short names.
 For example, it is tempting to use the name `x' for the x-coordinate
@@ -175,50 +403,15 @@ Returns the "effective" version number.  This is just the normal full
 version string without the final micro-version number.  See "Changes
 to the distribution" above.
 
 version string without the final micro-version number.  See "Changes
 to the distribution" above.
 
-** Futures
-
-Futures is a way of providing an alternative evaluation policy, very
-similar in principle to "promises".  Like promises, futures allow the
-main process to continue instantly, but while promises postpone
-evaluation ("lazy" evaluation) until the value is requested, futures
-immediately starts evaluation in a parallel thread.
-
-Futures are good when you want to express that "I'll need the value of
-this computation sometime soon" and want to allow processing to go on
-in the background until that time arrives.
-
-** New syntax: future FORM
+** New feature, 'futures': future, make-future, future-ref
 
 
-Begin evaluation of FORM in a parallel thread and return the future
-immediately.  (Akin to 'delay'.)
+Futures are like promises, but begin execution immediately in a new
+thread.  See the "Futures" section in the reference manual.
 
 
-** New procedure: future-ref FUTURE
+** New threading functions: parallel, letpar, par-map, and friends
 
 
-Return the computed value of the future.  Wait if the computation is
-not finished.  (Akin to 'force'.)
-
-** New syntax: parallel FORM ...
-
-Compute the results of FORM ... in parallel (in a separate thread for
-each form) and return them as multiple values.
-
-** New syntax: letpar ((VAR EXP) ...) BODYFORM ...
-
-Like 'let' but evaluates the binding expressions EXP ... in parallel.
-
-** New functions: par-map, par-for-each PROC ARGLIST ...
-
-Like 'map' and 'for-each' but evaluate the procedure PROC in a
-separate thread for each (set of) argument(s).  All applications are
-guaranteed to be completed before the procedure returns.
-
-** New functions: n-par-map, n-par-for-each N PROC ARGLIST ...
-
-Like 'par-map' and 'par-for-each' but evaluate the procedure PROC in N
-threads.  This is useful when PROC uses large amounts of resources
-and/or the argument list(s) is/are long so that one thread per (set
-of) argument(s) would consume too much system resources.  On a
-dual-CPU system, N = 4 would often be a good choice.
+These are convenient ways to run calculations in parallel in new
+threads.  See "Parallel forms" in the manual for details.
 
 ** Fair mutexes and condition variables
 
 
 ** Fair mutexes and condition variables
 
@@ -237,7 +430,7 @@ A fair condition variable must be used together with a fair mutex,
 just as a standard condition variable must be used together with a
 standard mutex.
 
 just as a standard condition variable must be used together with a
 standard mutex.
 
-** New functions: make-fair-mutex, make-fair-condition-variable'
+*** New functions: make-fair-mutex, make-fair-condition-variable'
 
 Make a new fair mutex and a new fair condition variable respectively.
 
 
 Make a new fair mutex and a new fair condition variable respectively.
 
@@ -344,9 +537,54 @@ platform supports this, too.  The two zeros are equal according to
     (eqv? 0.0 (- 0.0))
     => #f
 
     (eqv? 0.0 (- 0.0))
     => #f
 
-** We now have uninterned symbols.
+** Guile now has exact rationals.
+
+Guile can now represent fractions such as 1/3 exactly.  Computing with
+them is also done exactly, of course:
+
+    (* 1/3 3/2)
+    => 1/2
+
+** 'floor', 'ceiling', 'round' and 'truncate' now return exact numbers
+   for exact arguments.
+
+For example: (floor 2) now returns an exact 2 where in the past it
+returned an inexact 2.0.  Likewise, (floor 5/4) returns an exact 1.
+
+** inexact->exact no longer returns only integers.
 
 
-The new function 'make-symbol' will return a uninterned symbol.  This
+Without exact rationals, the closest exact number was always an
+integer, but now inexact->exact returns the fraction that is exactly
+equal to a floating point number.  For example:
+
+    (inexact->exact 1.234)
+    => 694680242521899/562949953421312
+
+When you want the old behavior, use 'round' explicitely:
+
+    (inexact->exact (round 1.234))
+    => 1
+
+** New function 'rationalize'.
+
+This function finds a simple fraction that is close to a given real
+number.  For example (and compare with inexact->exact above):
+
+    (rationalize (inexact->exact 1.234) 1/2000)
+    => 58/47
+
+Note that, as required by R5RS, rationalize returns only then an exact
+result when both its arguments are exact.
+
+** 'odd?' and 'even?' work also for inexact integers.
+
+Previously, (odd? 1.0) would signal an error since only exact integers
+were recognized as integers.  Now (odd? 1.0) returns #t, (odd? 2.0)
+returns #f and (odd? 1.5) signals an error.
+
+** Guile now has uninterned symbols.
+
+The new function 'make-symbol' will return an uninterned symbol.  This
 is a symbol that is unique and is guaranteed to remain unique.
 However, uninterned symbols can not yet be read back in.
 
 is a symbol that is unique and is guaranteed to remain unique.
 However, uninterned symbols can not yet be read back in.
 
@@ -357,7 +595,7 @@ interned or not.
 
 The function pretty-print from the (ice-9 pretty-print) module can now
 also be invoked with keyword arguments that control things like
 
 The function pretty-print from the (ice-9 pretty-print) module can now
 also be invoked with keyword arguments that control things like
-maximum output width.  See its online documentation.
+maximum output width.  See the manual for details.
 
 ** Variables have no longer a special behavior for `equal?'.
 
 
 ** Variables have no longer a special behavior for `equal?'.
 
@@ -370,15 +608,11 @@ compare their values.  This is no longer done.  Variables are now only
 You can now use an empty `begin' form.  It will yield #<unspecified>
 when evaluated and simply be ignored in a definition context.
 
 You can now use an empty `begin' form.  It will yield #<unspecified>
 when evaluated and simply be ignored in a definition context.
 
-** Removed: substring-move-left!, substring-move-right!
-
-Use `substring-move!' instead.
-
 ** Deprecated: procedure->macro
 
 ** Deprecated: procedure->macro
 
-Change your code to use either procedure->memoizing-macro or, probably better,
-to use r5rs macros.  Also, be aware that macro expansion will not be done
-during evaluation, but prior to evaluation.
+Change your code to use 'define-macro' or r5rs macros.  Also, be aware
+that macro expansion will not be done during evaluation, but prior to
+evaluation.
 
 ** Soft ports now allow a `char-ready?' procedure
 
 
 ** Soft ports now allow a `char-ready?' procedure
 
@@ -397,8 +631,302 @@ chapter in the reference manual.
 
 There is no replacement for undefine.
 
 
 There is no replacement for undefine.
 
+* The functions make-keyword-from-dash-symbol and keyword-dash-symbol
+  have been discouraged.
+
+They are relics from a time where a keyword like #:foo was used
+directly as a Tcl option "-foo" and thus keywords were internally
+stored as a symbol with a starting dash.  We now store a symbol
+without the dash.
+
+Use symbol->keyword and keyword->symbol instead.
+
+
 * Changes to the C interface
 
 * Changes to the C interface
 
+** There is the new notion of 'discouraged' features.
+
+This is a milder form of deprecation.
+
+Things that are discouraged should not be used in new code, but it is
+OK to leave them in old code for now.  When a discouraged feature is
+used, no warning message is printed like there is for 'deprecated'
+features.  Also, things that are merely discouraged are nevertheless
+implemented efficiently, while deprecated features can be very slow.
+
+You can omit discouraged features from libguile by configuring it with
+the '--disable-discouraged' option.
+
+** A new family of functions for converting between C values and
+   Scheme values has been added.
+
+These functions follow a common naming scheme and are designed to be
+easier to use, thread-safe and more future-proof than the older
+alternatives.
+
+  - int scm_is_* (...)
+  These are predicates that return a C boolean: 1 or 0.  Instead of
+  SCM_NFALSEP, you can now use scm_is_true, for example.
+
+  - <type> scm_to_<type> (SCM val, ...)
+
+  These are functions that convert a Scheme value into an appropriate
+  C value.  For example, you can use scm_to_int to safely convert from
+  a SCM to an int.
+
+  - SCM scm_from_<type>) (<type> val, ...)
+
+  These functions convert from a C type to a SCM value; for example,
+  scm_from_int for ints.
+
+There is a huge number of these functions, for numbers, strings,
+symbols, vectors, etc.  They are documented in the reference manual in
+the API section together with the types that they apply to.
+
+** New functions for dealing with complex numbers in C have been added.
+
+The new functions are scm_c_make_rectangular, scm_c_make_polar,
+scm_c_real_part, scm_c_imag_part, scm_c_magnitude and scm_c_angle.
+They work like scm_make_rectangular etc but take or return doubles
+directly.
+
+** The function scm_make_complex has been discouraged.
+
+Use scm_c_make_rectangular instead.
+
+** The INUM macros have been deprecated.
+
+A lot of code uses these macros to do general integer conversions,
+although the macros only work correctly with fixnums.  Use the
+following alternatives.
+
+  SCM_INUMP             ->  scm_is_integer or similar
+  SCM_NINUMP            ->  !scm_is_integer or similar
+  SCM_MAKINUM           ->  scm_from_int or similar
+  SCM_INUM              ->  scm_to_int or similar
+
+  SCM_VALIDATE_INUM_*   ->  Do not use these; scm_to_int, etc. will
+                            do the validating for you.
+
+** The scm_num2<type> and scm_<type>2num functions and scm_make_real
+   have been discouraged.
+
+Use the newer scm_to_<type> and scm_from_<type> functions instead for
+new code.  The functions have been discouraged since they don't fit
+the naming scheme.
+
+** The 'boolean' macros SCM_FALSEP etc have been discouraged.
+
+They have strange names, especially SCM_NFALSEP, and SCM_BOOLP
+evaluates its argument twice.  Use scm_is_true, etc. instead for new
+code.
+
+** The macro SCM_EQ_P has been discouraged.
+
+Use scm_is_eq for new code, which fits better into the naming
+conventions.
+
+** The macros SCM_CONSP, SCM_NCONSP, SCM_NULLP, and SCM_NNULLP have
+   been discouraged.
+
+Use the function scm_is_pair or scm_is_null instead.
+
+** The functions scm_round and scm_truncate have been deprecated and
+   are now available as scm_c_round and scm_c_truncate, respectively.
+
+These functions occupy the names that scm_round_number and
+scm_truncate_number should have.
+
+** The functions scm_c_string2str, scm_c_substring2str, and
+   scm_c_symbol2str have been deprecated.
+
+Use scm_to_locale_stringbuf or similar instead, maybe together with
+scm_substring.
+
+** New functions scm_c_make_string, scm_c_string_length,
+   scm_c_string_ref, scm_c_string_set_x, scm_c_substring,
+   scm_c_substring_shared, scm_c_substring_copy.
+
+These are like scm_make_string, scm_length, etc. but are slightly
+easier to use from C.
+
+** The macros SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_LENGTH,
+   SCM_SYMBOL_CHARS, and SCM_SYMBOL_LENGTH have been deprecated.
+
+They export too many assumptions about the implementation of strings
+and symbols that are no longer true in the presence of
+mutation-sharing substrings and when Guile switches to some form of
+Unicode.
+
+When working with strings, it is often best to use the normal string
+functions provided by Guile, such as scm_c_string_ref,
+scm_c_string_set_x, scm_string_append, etc.  Be sure to look in the
+manual since many more such functions are now provided than
+previously.
+
+When you want to convert a SCM string to a C string, use the
+scm_to_locale_string function or similar instead.  For symbols, use
+scm_symbol_to_string and then work with that string.  Because of the
+new string representation, scm_symbol_to_string does not need to copy
+and is thus quite efficient.
+
+** Some string, symbol and keyword functions have been discouraged.
+
+They don't fit into the uniform naming scheme and are not explicit
+about the character encoding.
+
+Replace according to the following table:
+
+    scm_allocate_string       -> scm_c_make_string
+    scm_take_str              -> scm_take_locale_stringn 
+    scm_take0str              -> scm_take_locale_string
+    scm_mem2string            -> scm_from_locale_stringn
+    scm_str2string            -> scm_from_locale_string
+    scm_makfrom0str           -> scm_from_locale_string
+    scm_mem2symbol            -> scm_from_locale_symboln
+    scm_mem2uninterned_symbol -> scm_from_locale_stringn + scm_make_symbol
+    scm_str2symbol            -> scm_from_locale_symbol
+
+    SCM_SYMBOL_HASH           -> scm_hashq
+    SCM_SYMBOL_INTERNED_P     -> scm_symbol_interned_p
+
+    scm_c_make_keyword        -> scm_from_locale_keyword
+
+** The functions scm_keyword_to_symbol and sym_symbol_to_keyword are
+   now also available to C code.
+
+** SCM_KEYWORDP and SCM_KEYWORDSYM have been deprecated.
+
+Use scm_is_keyword and scm_keyword_to_symbol instead, but note that
+the latter returns the true name of the keyword, not the 'dash name',
+as SCM_KEYWORDSYM used to do.
+
+** SCM_CELL_WORD_LOC has been deprecated.
+
+Use the new macro SCM_CELL_OBJECT_LOC instead, which returns a pointer
+to a SCM, as opposed to a pointer to a scm_t_bits.
+
+This was done to allow the correct use of pointers into the Scheme
+heap.  Previously, the heap words were of type scm_t_bits and local
+variables and function arguments were of type SCM, making it
+non-standards-conformant to have a pointer that can point to both.
+
+** New macros SCM_SMOB_DATA_2, SCM_SMOB_DATA_3, etc.
+
+These macros should be used instead of SCM_CELL_WORD_2/3 to access the
+second and third words of double smobs.  Likewise for
+SCM_SET_SMOB_DATA_2 and SCM_SET_SMOB_DATA_3.
+
+Also, there is SCM_SMOB_FLAGS and SCM_SET_SMOB_FLAGS that should be
+used to get and set the 16 exra bits in the zeroth word of a smob.
+
+And finally, there is SCM_SMOB_OBJECT and SCM_SMOB_SET_OBJECT for
+accesing the first immediate word of a smob as a SCM value, and there
+is SCM_SMOB_OBJECT_LOC for getting a pointer to the first immediate
+smob word.  Like wise for SCM_SMOB_OBJECT_2, etc.
+
+** New way to deal with non-local exits and re-entries.
+
+There is a new set of functions that essentially do what
+scm_internal_dynamic_wind does, but in a way that is more convenient
+for C code in some situations.  Here is a quick example of how to
+prevent a potential memory leak:
+
+  void
+  foo ()
+  {
+    char *mem;
+
+    scm_frame_begin (0);
+
+    mem = scm_malloc (100);
+    scm_frame_unwind_handler (free, mem, SCM_F_WIND_EXPLICITELY);
+
+    /* MEM would leak if BAR throws an error.
+       SCM_FRAME_UNWIND_HANDLER frees it nevertheless.  
+     */
+
+    bar ();
+  
+    scm_frame_end ();
+
+    /* Because of SCM_F_WIND_EXPLICITELY, MEM will be freed by 
+       SCM_FRAME_END as well. 
+    */
+  }
+
+For full documentation, see the node "Frames" in the manual.
+
+** New function scm_frame_free
+
+This function calls 'free' on a given pointer when a frame is left.
+Thus the call to scm_frame_unwind_handler above could be replaced with
+simply scm_frame_free (mem).
+
+** New way to block and unblock asyncs
+
+In addition to scm_c_call_with_blocked_asyncs you can now also use
+scm_frame_block_asyncs in a 'frame' (see above).  Likewise for
+scm_c_call_with_unblocked_asyncs and scm_frame_unblock_asyncs.
+
+** New way to temporarily set the current input, output or error ports
+
+C code can now use scm_frame_current_<foo>_port in a 'frame' (see
+above).  <foo> is one of "input", "output" or "error".
+
+** New way to temporarily set fluids
+
+C code can now use scm_frame_fluid in a 'frame' (see
+above) to temporarily set the value of a fluid.
+
+** New types scm_t_intmax and scm_t_uintmax.
+
+On platforms that have them, these types are identical to intmax_t and
+uintmax_t, respectively.  On other platforms, they are identical to
+the largest integer types that Guile knows about.
+
+** The functions scm_unmemocopy and scm_unmemoize have been removed.
+
+You should not have used them.
+
+** Many public #defines with generic names have been made private.
+
+#defines with generic names like HAVE_FOO or SIZEOF_FOO have been made
+private or renamed with a more suitable public name.
+
+** The macro SCM_TYP16S has been deprecated.
+
+This macro is not intended for public use.
+
+** The macro SCM_SLOPPY_INEXACTP has been deprecated.
+
+Use scm_is_true (scm_inexact_p (...)) instead.
+
+** The macro SCM_SLOPPY_REALP has been deprecated.
+
+Use scm_is_real instead.
+
+** The macro SCM_SLOPPY_COMPLEXP has been deprecated.
+
+Use scm_is_complex instead.
+
+** Some preprocessor defines have been deprecated.
+
+These defines indicated whether a certain feature was present in Guile
+or not.  Going forward, assume that the features are always present.
+
+The macros are: USE_THREADS, GUILE_ISELECT, READER_EXTENSIONS,
+DEBUG_EXTENSIONS, DYNAMIC_LINKING.
+
+The following macros have been removed completely: MEMOIZE_LOCALS,
+SCM_RECKLESS, SCM_CAUTIOUS.
+
+** The preprocessor define STACK_DIRECTION has been deprecated.
+
+There should be no need to know about the stack direction for ordinary
+programs.
+
 ** New function: scm_effective_version
 
 Returns the "effective" version number.  This is just the normal full
 ** New function: scm_effective_version
 
 Returns the "effective" version number.  This is just the normal full
@@ -463,7 +991,7 @@ GUILE_INIT_SEGMENT_SIZE_1, and GUILE_MIN_YIELD_2 should be used.
 
 The name scm_definedp is deprecated.
 
 
 The name scm_definedp is deprecated.
 
-** The struct scm_cell has been renamed to scm_t_cell
+** The struct scm_cell type has been renamed to scm_t_cell
 
 This is in accordance to Guile's naming scheme for types.  Note that
 the name scm_cell is now used for a function that allocates and
 
 This is in accordance to Guile's naming scheme for types.  Note that
 the name scm_cell is now used for a function that allocates and
@@ -489,11 +1017,6 @@ The old functions for memory management have been deprecated.  They
 are: scm_must_malloc, scm_must_realloc, scm_must_free,
 scm_must_strdup, scm_must_strndup, scm_done_malloc, scm_done_free.
 
 are: scm_must_malloc, scm_must_realloc, scm_must_free,
 scm_must_strdup, scm_must_strndup, scm_done_malloc, scm_done_free.
 
-** New function: scm_str2string
-
-This function creates a scheme string from a 0-terminated C string.  The input
-string is copied.
-
 ** Declarations of exported features are marked with SCM_API.
 
 Every declaration of a feature that belongs to the exported Guile API
 ** Declarations of exported features are marked with SCM_API.
 
 Every declaration of a feature that belongs to the exported Guile API
@@ -506,15 +1029,16 @@ If you `#define SCM_IMPORT' before including <libguile.h>, SCM_API
 will expand into "__declspec (dllimport) extern", which is needed for
 linking to the Guile DLL in Windows.
 
 will expand into "__declspec (dllimport) extern", which is needed for
 linking to the Guile DLL in Windows.
 
-There are also SCM_RL_IMPORT, QT_IMPORT, SCM_SRFI1314_IMPORT, and
+There are also SCM_RL_IMPORT, SCM_SRFI1314_IMPORT, and
 SCM_SRFI4_IMPORT, for the corresponding libraries.
 
 ** SCM_NEWCELL and SCM_NEWCELL2 have been deprecated.
 
 SCM_SRFI4_IMPORT, for the corresponding libraries.
 
 ** SCM_NEWCELL and SCM_NEWCELL2 have been deprecated.
 
-Use the new functions scm_cell and scm_double_cell instead.  The old macros
-had problems because with them allocation and initialization was separated and
-the GC could sometimes observe half initialized cells.  Only careful coding by
-the user of SCM_NEWCELL and SCM_NEWCELL2 could make this safe and efficient.
+Use the new functions scm_cell and scm_double_cell instead.  The old
+macros had problems because with them allocation and initialization
+was separated and the GC could sometimes observe half initialized
+cells.  Only careful coding by the user of SCM_NEWCELL and
+SCM_NEWCELL2 could make this safe and efficient.
 
 ** CHECK_ENTRY, CHECK_APPLY and CHECK_EXIT have been deprecated.
 
 
 ** CHECK_ENTRY, CHECK_APPLY and CHECK_EXIT have been deprecated.
 
@@ -527,107 +1051,49 @@ Use scm_c_source_property_breakpoint_p instead.
 
 ** Deprecated: scm_makmacro
 
 
 ** Deprecated: scm_makmacro
 
-Change your code to use either scm_makmmacro or, probably better, to use r5rs
-macros.  Also, be aware that macro expansion will not be done during
-evaluation, but prior to evaluation.
-
-** Removed from scm_root_state: def_inp, def_outp, def_errp, together
-with corresponding macros scm_def_inp, scm_def_outp and scm_def_errp.
-These were undocumented and unused copies of the standard ports at the
-time that Guile was initialised.  Normally the current ports should be
-used instead, obtained from scm_current_input_port () etc.  If an
-application needs to retain earlier ports, it should save them in a
-gc-protected location.
-
-** Removed compile time option MEMOIZE_LOCALS
-
-Now, caching of local variable positions during memoization is mandatory.
-However, the option to disable the caching has most probably not been used
-anyway.
-
-** Removed compile time option SCM_RECKLESS
-
-Full number of arguments checking of closures is mandatory now.  However, the
-option to disable the checking has most probably not been used anyway.
-
-** Removed compile time option SCM_CAUTIOUS
-
-Full number of arguments checking of closures is mandatory now.  However, the
-option to disable the checking has most probably not been used anyway.
-
-** Deprecated configure flags USE_THREADS and GUILE_ISELECT
-
-Previously, when the C preprocessor macro USE_THREADS was defined,
-libguile included a thread API.  This API is now always included, even
-when threads are not really supported.  Thus, you don't need to test
-for USE_THREADS.
-
-Analogously, GUILE_ISELECT was defined when the function
-scm_internal_select was provided by Guile.  This function is now
-always defined, and GUILE_ISELECT with it.
-
-** Removed definitions:  scm_lisp_nil, scm_lisp_t, s_nil_ify, scm_m_nil_ify,
-s_t_ify, scm_m_t_ify, s_0_cond, scm_m_0_cond, s_0_ify, scm_m_0_ify, s_1_ify,
-scm_m_1_ify, scm_debug_newcell,        scm_debug_newcell2, scm_tc16_allocated,
-SCM_SET_SYMBOL_HASH, SCM_IM_NIL_IFY, SCM_IM_T_IFY, SCM_IM_0_COND,
-SCM_IM_0_IFY, SCM_IM_1_IFY, SCM_GC_SET_ALLOCATED, scm_debug_newcell,
-scm_debug_newcell2, scm_substring_move_left_x, scm_substring_move_right_x,
-long_long, ulong_long, scm_sizet, SCM_WNA, SCM_OUTOFRANGE, SCM_NALLOC,
-SCM_HUP_SIGNAL, SCM_INT_SIGNAL, SCM_FPE_SIGNAL,        SCM_BUS_SIGNAL,
-SCM_SEGV_SIGNAL, SCM_ALRM_SIGNAL, SCM_GC_SIGNAL, SCM_TICK_SIGNAL,
-SCM_SIG_ORD, SCM_ORD_SIG, SCM_NUM_SIGS, moddata, registered_mods,
-scm_register_module_xxx, scm_registered_modules,
-scm_clear_registered_modules, scm_wta, *top-level-lookup-closure*,
-scm_top_level_lookup_closure_var, scm_system_transformer, scm_eval_3,
-scm_eval2, SCM_SETAND_CAR, SCM_SETOR_CAR, SCM_SETAND_CDR, SCM_SETOR_CDR,
-SCM_FREEP, SCM_NFREEP, SCM_GC8MARKP, SCM_SETGC8MARK, SCM_CLRGC8MARK,
-SCM_GCTYP16, SCM_GCCDR, scm_remember, scm_protect_object,
-scm_unprotect_object, root_module_lookup_closure, scm_sym_app,
-scm_sym_modules, module_prefix, make_modules_in_var,
-beautify_user_module_x_var, try_module_autoload_var, scm_module_full_name,
-scm_the_root_module, scm_make_module, scm_ensure_user_module,
-scm_load_scheme_module, scm_port, scm_ptob_descriptor, scm_port_rw_active,
-scm_close_all_ports_except, scm_rstate, scm_rng, scm_i_rstate,
-SCM_SLOPPY_STRINGP, SCM_RWSTRINGP, SCM_STRING_UCHARS, SCM_STRING_CHARS,
-scm_read_only_string_p, scm_makstr, scm_makfromstr,
-scm_make_shared_substring, scm_tc7_substring, SCM_SLOPPY_CONSP,
-SCM_SLOPPY_NCONSP, scm_tc7_ssymbol, scm_tc7_msymbol, scm_tcs_symbols,
-sym_huh, scm_variable_set_name_hint, scm_builtin_variable, SCM_VARVCELL,
-SCM_UDVARIABLEP, SCM_DEFVARIABLEP, scm_internal_with_fluids,
-scm_make_gsubr, scm_make_gsubr_with_generic, scm_create_hook, list*,
-SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
-SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify, scm_sloppy_memq,
-scm_sloppy_memv, scm_sloppy_member, scm_end_of_file_key,
-scm_read_and_eval_x, scm_mkbig, scm_big2inum, scm_adjbig, scm_normbig,
+Change your code to use either scm_makmmacro or to define macros in
+Scheme, using 'define-macro'.
+
+** New function scm_c_port_for_each.
+
+This function is like scm_port_for_each but takes a pointer to a C
+function as the callback instead of a SCM value.
+
+** Many definitions have been removed that were previously deprecated.
+
+scm_lisp_nil, scm_lisp_t, s_nil_ify, scm_m_nil_ify, s_t_ify,
+scm_m_t_ify, s_0_cond, scm_m_0_cond, s_0_ify, scm_m_0_ify, s_1_ify,
+scm_m_1_ify, scm_debug_newcell, scm_debug_newcell2,
+scm_tc16_allocated, SCM_SET_SYMBOL_HASH, SCM_IM_NIL_IFY, SCM_IM_T_IFY,
+SCM_IM_0_COND, SCM_IM_0_IFY, SCM_IM_1_IFY, SCM_GC_SET_ALLOCATED,
+scm_debug_newcell, scm_debug_newcell2, SCM_HUP_SIGNAL, SCM_INT_SIGNAL,
+SCM_FPE_SIGNAL, SCM_BUS_SIGNAL, SCM_SEGV_SIGNAL, SCM_ALRM_SIGNAL,
+SCM_GC_SIGNAL, SCM_TICK_SIGNAL, SCM_SIG_ORD, SCM_ORD_SIG,
+SCM_NUM_SIGS, scm_top_level_lookup_closure_var,
+*top-level-lookup-closure*, scm_system_transformer, scm_eval_3,
+scm_eval2, root_module_lookup_closure, SCM_SLOPPY_STRINGP,
+SCM_RWSTRINGP, scm_read_only_string_p, scm_make_shared_substring,
+scm_tc7_substring, sym_huh, SCM_VARVCELL, SCM_UDVARIABLEP,
+SCM_DEFVARIABLEP, scm_mkbig, scm_big2inum, scm_adjbig, scm_normbig,
 scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl, SCM_FIXNUM_BIT,
 scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl, SCM_FIXNUM_BIT,
-scm_subr_entry, SCM_SUBR_DOC, scm_make_subr_opt, scm_make_subr,
-scm_make_subr_with_generic, setjmp_type, setjmp_type,
-scm_call_catching_errors, scm_make_smob_type_mfpe, scm_set_smob_mfpe,
-scm_strprint_obj, scm_read_0str, scm_eval_0str, SCM_CHARS, SCM_UCHARS,
 SCM_SETCHARS, SCM_SLOPPY_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET,
 SCM_SETCHARS, SCM_SLOPPY_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET,
-SCM_LENGTH_MAX, SCM_LENGTH, SCM_SETLENGTH, SCM_ROSTRINGP, SCM_ROLENGTH,
-SCM_ROCHARS, SCM_ROUCHARS, SCM_SUBSTRP, SCM_COERCE_SUBSTR, scm_strhash,
-scm_sym2vcell, scm_sym2ovcell_soft, scm_sym2ovcell,
-scm_intern_obarray_soft, scm_intern_obarray, scm_intern, scm_intern0,
-scm_sysintern, scm_sysintern0, scm_sysintern0_no_module_lookup,
-scm_symbol_value0, scm_string_to_obarray_symbol, scm_intern_symbol,
-scm_unintern_symbol, scm_symbol_binding, scm_symbol_interned_p,
-scm_symbol_bound_p, scm_symbol_set_x, scm_gentemp,
-scm_init_symbols_deprecated, s_vector_set_length_x, scm_vector_set_length_x,
-scm_contregs, scm_debug_info, scm_debug_frame, SCM_DSIDEVAL, SCM_OPDIRP,
-scm_fport, scm_option, SCM_CONST_LONG, SCM_VCELL, SCM_GLOBAL_VCELL,
-SCM_VCELL_INIT, SCM_GLOBAL_VCELL_INIT, scm_srcprops, scm_srcprops_chunk,
-scm_info_frame, scm_stack, scm_array, scm_array_dim, SCM_ARRAY_CONTIGUOUS,
-SCM_HUGE_LENGTH, SCM_FUNC_NAME, SCM_WTA, RETURN_SCM_WTA,
-SCM_VALIDATE_NUMBER_COPY, SCM_VALIDATE_NUMBER_DEF_COPY,
-SCM_VALIDATE_STRINGORSUBSTR, SCM_VALIDATE_ROSTRING,
+SCM_LENGTH_MAX, SCM_SETLENGTH, SCM_ROSTRINGP, SCM_ROLENGTH,
+SCM_ROCHARS, SCM_ROUCHARS, SCM_SUBSTRP, SCM_COERCE_SUBSTR,
+scm_sym2vcell, scm_intern, scm_intern0, scm_sysintern, scm_sysintern0,
+scm_sysintern0_no_module_lookup, scm_init_symbols_deprecated,
+scm_vector_set_length_x, scm_contregs, scm_debug_info,
+scm_debug_frame, SCM_DSIDEVAL, SCM_CONST_LONG, SCM_VCELL,
+SCM_GLOBAL_VCELL, SCM_VCELL_INIT, SCM_GLOBAL_VCELL_INIT,
+SCM_HUGE_LENGTH, SCM_VALIDATE_STRINGORSUBSTR, SCM_VALIDATE_ROSTRING,
 SCM_VALIDATE_ROSTRING_COPY, SCM_VALIDATE_NULLORROSTRING_COPY,
 SCM_VALIDATE_ROSTRING_COPY, SCM_VALIDATE_NULLORROSTRING_COPY,
-SCM_VALIDATE_RWSTRING, SCM_VALIDATE_OPDIR, DIGITS, scm_small_istr2int,
-scm_istr2int, scm_istr2flo, scm_istring2number, scm_istr2int,
-scm_istr2flo, scm_istring2number, scm_vtable_index_vcell, scm_si_vcell,
-SCM_ECONSP, SCM_NECONSP, SCM_GLOC_VAR, SCM_GLOC_VAL, SCM_GLOC_SET_VAL,
-SCM_GLOC_VAL_LOC, scm_make_gloc, scm_gloc_p, scm_tc16_variable
+SCM_VALIDATE_RWSTRING, DIGITS, scm_small_istr2int, scm_istr2int,
+scm_istr2flo, scm_istring2number, scm_istr2int, scm_istr2flo,
+scm_istring2number, scm_vtable_index_vcell, scm_si_vcell, SCM_ECONSP,
+SCM_NECONSP, SCM_GLOC_VAR, SCM_GLOC_VAL, SCM_GLOC_SET_VAL,
+SCM_GLOC_VAL_LOC, scm_make_gloc, scm_gloc_p, scm_tc16_variable,
+SCM_CHARS, SCM_LENGTH, SCM_SET_STRING_CHARS, SCM_SET_STRING_LENGTH.
 
 
+\f
 Changes since Guile 1.4:
 
 * Changes to the distribution
 Changes since Guile 1.4:
 
 * Changes to the distribution
@@ -1480,24 +1946,18 @@ Instead, use scm_c_memq or scm_memq, scm_memv, scm_member.
 
 ** New functions: scm_call_0, scm_call_1, scm_call_2, scm_call_3
 
 
 ** New functions: scm_call_0, scm_call_1, scm_call_2, scm_call_3
 
-Call a procedure with the indicated number of arguments.
-
-Example:
-
-  scm_call_1 (proc, arg1);
+Call a procedure with the indicated number of arguments.  See "Fly
+Evaluation" in the manual.
 
 ** New functions: scm_apply_0, scm_apply_1, scm_apply_2, scm_apply_3
 
 
 ** New functions: scm_apply_0, scm_apply_1, scm_apply_2, scm_apply_3
 
-Call a procedure with the indicated number of arguments and a list
-of arguments.
-
-Example:
-
-  scm_apply_1 (proc, arg1, args);
+Call a procedure with the indicated number of arguments and a list of
+further arguments.  See "Fly Evaluation" in the manual.
 
 ** New functions: scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5
 
 
 ** New functions: scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5
 
-Create a list of the given number of elements.
+Create a list of the given number of elements.  See "List
+Constructors" in the manual.
 
 ** Renamed function: scm_listify has been replaced by scm_list_n.
 
 
 ** Renamed function: scm_listify has been replaced by scm_list_n.
 
@@ -2238,10 +2698,6 @@ These macros will be removed in a future release of Guile.
 scm_dblproc, SCM_UNEGFIXABLE, SCM_FLOBUFLEN, SCM_INEXP, SCM_CPLXP, SCM_REAL,
 SCM_IMAG, SCM_REALPART, scm_makdbl, SCM_SINGP, SCM_NUM2DBL, SCM_NO_BIGDIG
 
 scm_dblproc, SCM_UNEGFIXABLE, SCM_FLOBUFLEN, SCM_INEXP, SCM_CPLXP, SCM_REAL,
 SCM_IMAG, SCM_REALPART, scm_makdbl, SCM_SINGP, SCM_NUM2DBL, SCM_NO_BIGDIG
 
-Further, it is recommended not to rely on implementation details for guile's
-current implementation of bignums.  It is planned to replace this
-implementation with gmp in the future.
-
 ** Port internals: the rw_random variable in the scm_port structure
 must be set to non-zero in any random access port.  In recent Guile
 releases it was only set for bidirectional random-access ports.
 ** Port internals: the rw_random variable in the scm_port structure
 must be set to non-zero in any random access port.  In recent Guile
 releases it was only set for bidirectional random-access ports.