diff options
author | Andy Wingo <wingo@pobox.com> | 2010-02-16 23:01:09 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-02-18 22:12:55 +0100 |
commit | d69531e21326dbec935da6ead29335f2cccf1a3f (patch) | |
tree | 5a64b8d80a97377212b408f91eb247db9af37aed /libguile/dynwind.c | |
parent | ac1ef09bfee23177052aa157f8cb049ae8dbd64e (diff) | |
download | guile-d69531e21326dbec935da6ead29335f2cccf1a3f.tar.gz |
dynwind is now a part of guile's primitive language
* libguile/memoize.h (scm_sym_at_dynamic_wind, SCM_M_DYNWIND)
* libguile/memoize.c (memoized_tags, MAKMEMO_DYNWIND)
(scm_m_at_dynamic_wind, unmemoize): Add dynwind as a primitive
expression type.
* libguile/dynwind.c (scm_dynamic_wind): Downgrade to a normal C
function.
* libguile/eval.c (eval):
* module/ice-9/eval.scm (primitive-eval): Add dynwind support.
* module/ice-9/r4rs.scm: More relevant docs.
(apply): Define in a more regular way.
(dynamic-wind): Add to this file, with docs, dispatching to
@dynamic-wind.
* module/language/tree-il/primitives.scm: Parse @dynamic-wind into a
tree-il dynamic-wind.
Diffstat (limited to 'libguile/dynwind.c')
-rw-r--r-- | libguile/dynwind.c | 56 |
1 files changed, 4 insertions, 52 deletions
diff --git a/libguile/dynwind.c b/libguile/dynwind.c index b34f9bef3..5eccb176f 100644 --- a/libguile/dynwind.c +++ b/libguile/dynwind.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2003, 2004, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2003, 2004, 2006, 2008, 2010 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 @@ -50,57 +50,9 @@ -SCM_DEFINE (scm_dynamic_wind, "dynamic-wind", 3, 0, 0, - (SCM in_guard, SCM thunk, SCM out_guard), - "All three arguments must be 0-argument procedures.\n" - "@var{in_guard} is called, then @var{thunk}, then\n" - "@var{out_guard}.\n" - "\n" - "If, any time during the execution of @var{thunk}, the\n" - "continuation of the @code{dynamic_wind} expression is escaped\n" - "non-locally, @var{out_guard} is called. If the continuation of\n" - "the dynamic-wind is re-entered, @var{in_guard} is called. Thus\n" - "@var{in_guard} and @var{out_guard} may be called any number of\n" - "times.\n" - "@lisp\n" - "(define x 'normal-binding)\n" - "@result{} x\n" - "(define a-cont (call-with-current-continuation\n" - " (lambda (escape)\n" - " (let ((old-x x))\n" - " (dynamic-wind\n" - " ;; in-guard:\n" - " ;;\n" - " (lambda () (set! x 'special-binding))\n" - "\n" - " ;; thunk\n" - " ;;\n" - " (lambda () (display x) (newline)\n" - " (call-with-current-continuation escape)\n" - " (display x) (newline)\n" - " x)\n" - "\n" - " ;; out-guard:\n" - " ;;\n" - " (lambda () (set! x old-x)))))))\n" - "\n" - ";; Prints:\n" - "special-binding\n" - ";; Evaluates to:\n" - "@result{} a-cont\n" - "x\n" - "@result{} normal-binding\n" - "(a-cont #f)\n" - ";; Prints:\n" - "special-binding\n" - ";; Evaluates to:\n" - "@result{} a-cont ;; the value of the (define a-cont...)\n" - "x\n" - "@result{} normal-binding\n" - "a-cont\n" - "@result{} special-binding\n" - "@end lisp") -#define FUNC_NAME s_scm_dynamic_wind +SCM +scm_dynamic_wind (SCM in_guard, SCM thunk, SCM out_guard) +#define FUNC_NAME "dynamic-wind" { SCM ans, old_winds; SCM_ASSERT (scm_is_true (scm_thunk_p (out_guard)), |