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:
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user