summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Djurfeldt <djurfeldt@nada.kth.se>2001-03-03 19:43:35 +0000
committerMikael Djurfeldt <djurfeldt@nada.kth.se>2001-03-03 19:43:35 +0000
commit0109c4bf4952ad164c33cfc9054fe39c23e6c448 (patch)
treedefb2d3fc193b0d88e6951da52e191a41454ad9d
parent97d41e3e07597eb2ffffd2f143ec813a7a1a4bb8 (diff)
downloadguile-0109c4bf4952ad164c33cfc9054fe39c23e6c448.tar.gz
* stack-catch.scm: New file.
* Makefile.am (ice9_sources): Added stack-catch.scm.
-rw-r--r--NEWS6
-rw-r--r--ice-9/ChangeLog6
-rw-r--r--ice-9/Makefile.am10
-rw-r--r--ice-9/stack-catch.scm46
4 files changed, 63 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index abdda6164..51bfe1887 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,12 @@ Changes since Guile 1.4:
* Changes to the distribution
+** New module (ice-9 stack-catch):
+
+stack-catch is like catch, but saves the current state of the stack in
+the the-last-stack fluid for the debugger to inspect or in able to
+re-throw an error.
+
** The module (ice-9 and-let*) has been renamed to (ice-9 and-let-star)
This has been done to prevent problems on lesser operating systems
diff --git a/ice-9/ChangeLog b/ice-9/ChangeLog
index ec2063ce7..cde7a3739 100644
--- a/ice-9/ChangeLog
+++ b/ice-9/ChangeLog
@@ -1,3 +1,9 @@
+2001-03-03 Mikael Djurfeldt <mdj@linnaeus.mit.edu>
+
+ * stack-catch.scm: New file.
+
+ * Makefile.am (ice9_sources): Added stack-catch.scm.
+
2001-03-03 Marius Vollmer <mvo@zagadka.ping.de>
* boot-9.scm, rdelim.scm: Use "'()" instead of "()" in all places
diff --git a/ice-9/Makefile.am b/ice-9/Makefile.am
index d2ad1ee3b..597124072 100644
--- a/ice-9/Makefile.am
+++ b/ice-9/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in.
##
-## Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+## Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
##
## This file is part of GUILE.
##
@@ -26,11 +26,11 @@ ice9_sources = \
and-let-star.scm arrays.scm boot-9.scm calling.scm common-list.scm \
debug.scm debugger.scm documentation.scm emacs.scm expect.scm \
format.scm getopt-long.scm hcons.scm lineio.scm ls.scm mapping.scm \
- match.scm networking.scm null.scm optargs.scm poe.scm popen.scm \
+ match.scm networking.scm null.scm optargs.scm poe.scm popen.scm \
posix.scm psyntax.pp psyntax.ss q.scm r4rs.scm r5rs.scm \
- rdelim.scm receive.scm srfi-8.scm \
- regex.scm runq.scm safe-r5rs.scm safe.scm session.scm slib.scm \
- streams.scm string-fun.scm syncase.scm tags.scm threads.scm
+ rdelim.scm receive.scm srfi-8.scm regex.scm runq.scm \
+ safe-r5rs.scm safe.scm session.scm slib.scm stack-catch.scm \
+ streams.scm string-fun.scm syncase.scm tags.scm threads.scm
subpkgdatadir = $(pkgdatadir)/$(VERSION)/ice-9
subpkgdata_DATA = $(ice9_sources)
diff --git a/ice-9/stack-catch.scm b/ice-9/stack-catch.scm
new file mode 100644
index 000000000..ff160f7b0
--- /dev/null
+++ b/ice-9/stack-catch.scm
@@ -0,0 +1,46 @@
+;;; installed-scm-file
+
+;;;; Copyright (C) 2001 Free Software Foundation, Inc.
+;;;;
+;;;; This program is free software; you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation; either version 2, or (at your option)
+;;;; any later version.
+;;;;
+;;;; This program is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with this software; see the file COPYING. If not, write to
+;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+;;;; Boston, MA 02111-1307 USA
+;;;;
+
+(define-module (ice-9 stack-catch)
+ :export (stack-catch))
+
+(define (stack-catch key thunk handler)
+ "Like @code{catch}, invoke @var{thunk} in the dynamic context of
+@var{handler} for exceptions matching @var{key}, but also save the
+current stack state in the @var{the-last-stack} fluid, for the purpose
+of debugging or re-throwing of an error. If thunk throws to the
+symbol @var{key}, then @var{handler} is invoked this way:\n
+@example
+(handler key args ...)
+@end example\n
+@var{key} is a symbol or #t.\n
+@var{thunk} takes no arguments. If @var{thunk} returns normally, that
+is the return value of @code{catch}.\n
+Handler is invoked outside the scope of its own @code{catch}. If
+@var{handler} again throws to the same key, a new handler from further
+up the call chain is invoked.\n
+If the key is @code{#t}, then a throw to @emph{any} symbol will match
+this call to @code{catch}."
+ (catch key
+ (lambda ()
+ (lazy-catch key
+ thunk
+ lazy-handler-dispatch))
+ handler))