summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-11-14 21:37:00 +0100
committerAndy Wingo <wingo@pobox.com>2019-11-14 21:37:00 +0100
commit4b2c512b94bcdcfc2964f3b72da646ac95e11e82 (patch)
tree5b2adc0d9ae2220f01ba49b7721f0fb99fde6864
parent95efe14e449be5b80c8309ae91682696d6d79c9f (diff)
downloadguile-wip-exceptions.tar.gz
Update NEWS for records and exceptions workwip-exceptions
* NEWS: Update. * doc/ref/api-data.texi (Records): Fix a typo.
-rw-r--r--NEWS66
-rw-r--r--doc/ref/api-data.texi4
2 files changed, 67 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index 314dc6a79..0ec0d83f1 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,63 @@ Changes in alpha 2.9.5 (since alpha 2.9.4):
* Notable changes
+** Record unification
+
+Guile used to have a number of implementations of structured data types
+in the form of "records": a core facility, SRFI-9 (records), SRFI-35
+(condition types -- a form of records) and R6RS records. These
+facilities were not compatible, as they all were built in different
+ways. This had the unfortunate corollary that SRFI-35 conditions were
+not compatible with R6RS conditions. To fix this problem, we have now
+added the union of functionality from all of these record types into
+core records: single-inheritance subtyping, mutable and immutable
+fields, and so on. See "Records" in the manual, for full details.
+
+R6RS records, SRFI-9 records, and the SRFI-35 and R6RS exception types
+have been accordingly "rebased" on top of core records.
+
+** Reimplementation of exceptions
+
+Since Guile's origins 25 years ago, `throw' and `catch' have been the
+primary exception-handling primitives. However these primitives have
+two problems. One is that it's hard to handle exceptions in a
+structured way using `catch'. Few people remember what the
+corresponding `key' and `args' are that an exception handler would see
+in response to a call to `error', for example. In practice, this
+results in more generic catch-all exception handling than one might
+like.
+
+The other problem is that `throw', `catch', and especially
+`with-throw-handler' are quite unlike what the rest of the Scheme world
+uses. R6RS and R7RS, for example, have mostly converged on
+SRFI-34-style `with-exception-handler' and `raise' primitives, and
+encourage the use of SRFI-35-style structured exception objects to
+describe the error. Guile's R6RS layer incorporates an adapter between
+`throw'/`catch' and structured exception handling, but it didn't apply
+to SRFI-34/SRFI-35, and we would have to duplicate it for R7RS.
+
+In light of these considerations, Guile has now changed to make
+`with-exception-handler' and `raise-exception' its primitives for
+exception handling and defined a hierarchy of R6RS-style exception types
+in its core. SRFI-34/35, R6RS, and the exception-handling components of
+SRFI-18 (threads) have been re-implemented in terms of this core
+functionality. There is also a a compatibility layer that makes it so
+that exceptions originating in `throw' can be handled by
+`with-exception-hander', and vice-versa for `raise-exception' and
+`catch'.
+
+Generally speaking, users will see no difference. The one significant
+difference is that users of SRFI-34 will see more exceptions flowing
+through their `with-exception-handler'/`guard' forms, because whereas
+before they would only see exceptions thrown by SRFI-34, now they will
+see exceptions thrown by R6RS, R7RS, or indeed `throw'.
+
+Guile's situation is transitional. Most exceptions are still signalled
+via `throw'. These will probably migrate over time to
+`raise-exception', while preserving compatibility of course.
+
+See "Exceptions" in the manual, for full details on the new API.
+
** More optimization for unexported definitions at -O3
There is a new optimization pass, `seal-private-bindings', which is
@@ -36,7 +93,7 @@ Related to the last point, since the "Fix literal matching for
module-bound literals" change in the 2.2 series, it was no longer
possible to use the conventional `_' binding as an alias for `gettext',
because a local `_' definition would prevent `_' from being recognized
-as aux syntax for `match', `syntax-rules', and similar. The new
+as auxiliary syntax for `match', `syntax-rules', and similar. The new
recommended conventional alias for `gettext' is `G_'.
** Add --r6rs command-line option
@@ -46,6 +103,13 @@ R6RS-compatible. This procedure is called if the user passes `--r6rs'
as a command-line argument. See "R6RS Incompatibilities" in the manual,
for full details.
+* New deprecations
+
+** The two-argument form of `record-constructor'
+
+Calling `record-constructor' with two arguments (the record type and a
+list of field names) is deprecated. Instead, call with just one
+argument, and provide a wrapper around that constructor if needed.
Changes in alpha 2.9.x (since the stable 2.2 series):
diff --git a/doc/ref/api-data.texi b/doc/ref/api-data.texi
index 2708ad5c7..0ea49485f 100644
--- a/doc/ref/api-data.texi
+++ b/doc/ref/api-data.texi
@@ -1,6 +1,6 @@
@c -*-texinfo-*-
@c This is part of the GNU Guile Reference Manual.
-@c Copyright (C) 1996, 1997, 2000-2004, 2006-2017
+@c Copyright (C) 1996, 1997, 2000-2004, 2006-2017, 2019
@c Free Software Foundation, Inc.
@c See the file guile.texi for copying conditions.
@@ -8632,7 +8632,7 @@ promise that records are disjoint with other Scheme types.
@deffn {Scheme Procedure} make-record-type type-name field-names [print] @
[#:parent=@code{#f}] [#:uid=@code{#f}] @
- [#:extensible?=@code{#f}] [#:opaque?] @
+ [#:extensible?=@code{#f}] [#:opaque?=@code{#f}] @
Create and return a new @dfn{record-type descriptor}.
@var{type-name} is a string naming the type. Currently it's only used