core: move for to the syntax tier (and fix multi-group :when)
Port of core-for: desugar a comprehension to nested map/mapcat over the binding colls, :let -> let*, :while -> take-while on the coll. Lives in 00-syntax because doseq (already there) expands to it; the macro body uses only kernel/seed fns so it runs at analyzer-build time. doseq no longer depends on a Janet macro. Fixed a latent bug the Janet macro had: :when wrapped the inner form in (list ...) unconditionally, but for an outer binding group the inner form is already a seq, so mapcat produced a seq-of-seqs instead of flattening. e.g. (for [x [0 1] :when (odd? x) y [:a :b]] [x y]) gave ((... ...)) instead of ([1 :a] [1 :b]). Now the (list ...) wrap is only applied to the last group's scalar body; outer groups contribute their seq directly. Added :let+:when, multi-group :when, and destructuring regression cases. conformance 228x3, fixpoint, clojure-test-suite 3930, full suite green, bench flat.
This commit is contained in:
parent
40b0f525f3
commit
023fe637ce
3 changed files with 57 additions and 59 deletions
|
|
@ -68,6 +68,9 @@
|
|||
["for :when" "[0 2 4]" "(for [x (range 6) :when (even? x)] x)"]
|
||||
["for :while" "[0 1 2]" "(for [x (range 10) :while (< x 3)] x)"]
|
||||
["for :let" "[0 1 4]" "(for [x (range 3) :let [sq (* x x)]] sq)"]
|
||||
["for :let+:when" "[4 6 8]" "(for [x (range 5) :let [y (* x 2)] :when (> y 3)] y)"]
|
||||
["for multi :when" "[[1 :a] [1 :b]]" "(for [x [0 1] :when (odd? x) y [:a :b]] [x y])"]
|
||||
["for destructure" "[3 7]" "(for [[a b] [[1 2] [3 4]]] (+ a b))"]
|
||||
["doseq side-effect" "6" "(let [a (atom 0)] (doseq [x [1 2 3]] (swap! a (fn [v] (+ v x)))) @a)"]
|
||||
["doseq nested" "4" "(let [c (atom 0)] (doseq [x [1 2] y [10 20]] (swap! c inc)) @c)"]
|
||||
["doseq :when" "[1 3]" "(let [a (atom [])] (doseq [x [1 2 3] :when (odd? x)] (swap! a conj x)) @a)"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue