From 5a3bae5516c98867927fc376d09913db63affc0e Mon Sep 17 00:00:00 2001 From: giles Date: Tue, 21 Apr 2026 05:49:16 +0000 Subject: [PATCH] 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) --- lib/hyperscript/runtime.sx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/hyperscript/runtime.sx b/lib/hyperscript/runtime.sx index 1c1cb627..a4412abb 100644 --- a/lib/hyperscript/runtime.sx +++ b/lib/hyperscript/runtime.sx @@ -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)))