X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=guile18%2Fice-9%2Fstack-catch.scm;fp=guile18%2Fice-9%2Fstack-catch.scm;h=81faca063140f51157573b9b45ac33927ef68864;hb=139c38d9204dd07f6b235f83bae644faedbc63fd;hp=0000000000000000000000000000000000000000;hpb=652ed35a2013489d0a14fede6307cd2595abb2c4;p=lilypond.git diff --git a/guile18/ice-9/stack-catch.scm b/guile18/ice-9/stack-catch.scm new file mode 100644 index 0000000000..81faca0631 --- /dev/null +++ b/guile18/ice-9/stack-catch.scm @@ -0,0 +1,43 @@ +;;; installed-scm-file + +;;;; Copyright (C) 2001, 2006 Free Software Foundation, Inc. +;;;; +;;;; This library is free software; you can redistribute it and/or +;;;; modify it under the terms of the GNU Lesser General Public +;;;; License as published by the Free Software Foundation; either +;;;; version 2.1 of the License, or (at your option) any later version. +;;;; +;;;; This library 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 +;;;; Lesser General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU Lesser General Public +;;;; License along with this library; if not, write to the Free Software +;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 + thunk + handler + lazy-handler-dispatch))