HS: fix guard in loops to re-raise non-break/continue exceptions

All loop guards (repeat-times, repeat-forever, repeat-while,
repeat-until, for-each) now only catch hs-break and hs-continue,
re-raising all other exceptions (including hs-return from def
functions). Previously, guards caught everything via (true (str e)),
which swallowed return/throw inside loops.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-21 05:49:16 +00:00
parent 922e7a7892
commit 5a3bae5516

View File

@@ -330,7 +330,7 @@
(when
(< i n)
(let
((signal (guard (e (true (str e))) (do (thunk) nil))))
((signal (guard (e ((or (= (str e) "hs-break") (= (str e) "hs-continue")) (str e)) (true (raise e))) (do (thunk) nil))))
(cond
((= signal "hs-break") nil)
((= signal "hs-continue") (do-repeat (+ i 1)))
@@ -346,7 +346,7 @@
(fn
()
(let
((signal (guard (e (true (str e))) (do (thunk) nil))))
((signal (guard (e ((or (= (str e) "hs-break") (= (str e) "hs-continue")) (str e)) (true (raise e))) (do (thunk) nil))))
(cond
((= signal "hs-break") nil)
((= signal "hs-continue") (do-forever))
@@ -360,7 +360,7 @@
(when
(cond-fn)
(let
((signal (guard (e (true (str e))) (do (thunk) nil))))
((signal (guard (e ((or (= (str e) "hs-break") (= (str e) "hs-continue")) (str e)) (true (raise e))) (do (thunk) nil))))
(cond
((= signal "hs-break") nil)
((= signal "hs-continue") (hs-repeat-while cond-fn thunk))
@@ -371,7 +371,7 @@
(fn
(cond-fn thunk)
(let
((signal (guard (e (true (str e))) (do (thunk) nil))))
((signal (guard (e ((or (= (str e) "hs-break") (= (str e) "hs-continue")) (str e)) (true (raise e))) (do (thunk) nil))))
(cond
((= signal "hs-break") nil)
((= signal "hs-continue")
@@ -391,7 +391,7 @@
(when
(not (empty? remaining))
(let
((signal (guard (e (true (str e))) (do (fn-body (first remaining)) nil))))
((signal (guard (e ((or (= (str e) "hs-break") (= (str e) "hs-continue")) (str e)) (true (raise e))) (do (fn-body (first remaining)) nil))))
(cond
((= signal "hs-break") nil)
((= signal "hs-continue") (do-loop (rest remaining)))