From 44453f30dd81ffa1e995662fd75a675b5b208406 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 7 Aug 2023 20:10:54 -0700 Subject: close-stream: new : protocol from close method. * stream.c (close_stream): If the underlying method returns the colon symbol :, then keep the cached close_result as nil, so that the method can be called again, but return t to the caller to indicate success. * tests/018/close-delegate.tl: Test case added. * tests/018/close-delegate.expected: Updated. * txr.1: Documented. --- tests/018/close-delegate.expected | 5 ++++- tests/018/close-delegate.tl | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/018/close-delegate.expected b/tests/018/close-delegate.expected index 227f9f67..de68447f 100644 --- a/tests/018/close-delegate.expected +++ b/tests/018/close-delegate.expected @@ -1,3 +1,6 @@ close called, count 2 close called, count 1 -20 +40 +close called, count 2 +close called, count 1 +40 diff --git a/tests/018/close-delegate.tl b/tests/018/close-delegate.tl index 4cf1d650..64a1dc91 100644 --- a/tests/018/close-delegate.tl +++ b/tests/018/close-delegate.tl @@ -18,3 +18,23 @@ (get-lines s)) len prinl) + +(defstruct refcount-close-alt stream-wrap + stream + (count 1) + + (:method close (me throw-on-error-p) + (put-line `close called, count @{me.count}`) + (when (plusp me.count) + (if (zerop (dec me.count)) + (close-stream me.stream throw-on-error-p) + :)))) + +(flow + (with-stream (s (make-struct-delegate-stream + (new refcount-close-alt + count 2 + stream (open-file *load-path*)))) + (get-lines s)) + len + prinl) -- cgit v1.2.3