From 2a7ea27bb73e5fb2285cab5eee53bf4b9e118140 Mon Sep 17 00:00:00 2001 From: primo-ppcg Date: Sun, 11 Jun 2023 19:15:48 +0700 Subject: [PATCH] do not expand false branch more than once Fixes #1191 --- src/boot/boot.janet | 12 +++++++----- test/suite-boot.janet | 7 ++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/boot/boot.janet b/src/boot/boot.janet index 43699aa6..c6c1ff27 100644 --- a/src/boot/boot.janet +++ b/src/boot/boot.janet @@ -668,18 +668,20 @@ (def len (length bindings)) (if (= 0 len) (error "expected at least 1 binding")) (if (odd? len) (error "expected an even number of bindings")) + (def res (gensym)) (defn aux [i] (if (>= i len) - tru + ~(do (set ,res ,tru) true) (do (def bl (in bindings i)) (def br (in bindings (+ 1 i))) (if (symbol? bl) - ~(if (def ,bl ,br) ,(aux (+ 2 i)) ,fal) + ~(if (def ,bl ,br) ,(aux (+ 2 i))) ~(if (def ,(def sym (gensym)) ,br) - (do (def ,bl ,sym) ,(aux (+ 2 i))) - ,fal))))) - (aux 0)) + (do (def ,bl ,sym) ,(aux (+ 2 i)))))))) + ~(do + (var ,res nil) + (if ,(aux 0) ,res ,fal))) (defmacro when-let "Same as `(if-let bindings (do ;body))`." diff --git a/test/suite-boot.janet b/test/suite-boot.janet index 18a3074c..77a2bc92 100644 --- a/test/suite-boot.janet +++ b/test/suite-boot.janet @@ -130,7 +130,12 @@ (assert (= (if-let [[a b] my-array] a) 1) "if-let 5") (assert (= (if-let [{:a a :b b} {:a 1 :b 2}] b) 2) "if-let 6") (assert (= (if-let [[a b] nil] :t :f) :f) "if-let 7") -(assert (= (if-let [a true b false] b a) true) "if-let 8") + +# #1191 +(var cnt 0) +(defmacro upcnt [] (++ cnt)) +(assert (= (if-let [a true b true c true] nil (upcnt)) nil) "issue #1191") +(assert (= cnt 1) "issue #1191") (assert (= 14 (sum (map inc @[1 2 3 4]))) "sum map") (def myfun (juxt + - * /))