diff options
-rw-r--r-- | share/txr/stdlib/yield.tl | 17 | ||||
-rw-r--r-- | txr.1 | 10 |
2 files changed, 20 insertions, 7 deletions
diff --git a/share/txr/stdlib/yield.tl b/share/txr/stdlib/yield.tl index ef0518e6..ea9bb4d2 100644 --- a/share/txr/stdlib/yield.tl +++ b/share/txr/stdlib/yield.tl @@ -26,13 +26,16 @@ (defstruct (sys:yld-item val cont) nil val cont) (defun sys:obtain-impl (fun) - (lambda (: reply) - (let ((yi (call fun reply))) - (cond - ((eq (typeof yi) 'sys:yld-item) - (set fun yi.cont) - yi.val) - (t yi))))) + (finalize + (lambda (: reply) + (let ((yi (call fun reply))) + (cond + ((eq (typeof yi) 'sys:yld-item) + (set fun yi.cont) + yi.val) + (t yi)))) + (lambda (cont) + (call cont 'sys:cont-poison)))) (defun sys:yield-impl (name fun ctx-form) (let ((cont (sys:capture-cont name ctx-form))) @@ -27669,6 +27669,16 @@ if it is an ordinary value, it is returned; otherwise, if it is a yield object, its stored value is returned and the state is updated with the new yield object's continuation. +The +.code obtain +macro registers a finalizer against the returned function. +The finalizer invokes the function, passing it the symbol +.codn sys:cont-poison , +thereby triggering unwinding in the most recently captured +continuation. Thus, abandoned +.code obtain +blocks are subject to unwinding when they become garbage. + .TP* Notes: These macros provide a simple abstraction for the use of continuations. |