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
|
(when
|
||||||
(< i n)
|
(< i n)
|
||||||
(let
|
(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
|
(cond
|
||||||
((= signal "hs-break") nil)
|
((= signal "hs-break") nil)
|
||||||
((= signal "hs-continue") (do-repeat (+ i 1)))
|
((= signal "hs-continue") (do-repeat (+ i 1)))
|
||||||
@@ -346,7 +346,7 @@
|
|||||||
(fn
|
(fn
|
||||||
()
|
()
|
||||||
(let
|
(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
|
(cond
|
||||||
((= signal "hs-break") nil)
|
((= signal "hs-break") nil)
|
||||||
((= signal "hs-continue") (do-forever))
|
((= signal "hs-continue") (do-forever))
|
||||||
@@ -360,7 +360,7 @@
|
|||||||
(when
|
(when
|
||||||
(cond-fn)
|
(cond-fn)
|
||||||
(let
|
(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
|
(cond
|
||||||
((= signal "hs-break") nil)
|
((= signal "hs-break") nil)
|
||||||
((= signal "hs-continue") (hs-repeat-while cond-fn thunk))
|
((= signal "hs-continue") (hs-repeat-while cond-fn thunk))
|
||||||
@@ -371,7 +371,7 @@
|
|||||||
(fn
|
(fn
|
||||||
(cond-fn thunk)
|
(cond-fn thunk)
|
||||||
(let
|
(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
|
(cond
|
||||||
((= signal "hs-break") nil)
|
((= signal "hs-break") nil)
|
||||||
((= signal "hs-continue")
|
((= signal "hs-continue")
|
||||||
@@ -391,7 +391,7 @@
|
|||||||
(when
|
(when
|
||||||
(not (empty? remaining))
|
(not (empty? remaining))
|
||||||
(let
|
(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
|
(cond
|
||||||
((= signal "hs-break") nil)
|
((= signal "hs-break") nil)
|
||||||
((= signal "hs-continue") (do-loop (rest remaining)))
|
((= signal "hs-continue") (do-loop (rest remaining)))
|
||||||
|
|||||||
Reference in New Issue
Block a user