Skip to content

Commit 1ed7091

Browse files
mfikesswannodette
authored andcommitted
CLJS-2008: Self-host: backport fixes to threading macros
1 parent be51827 commit 1ed7091

File tree

2 files changed

+72
-14
lines changed

2 files changed

+72
-14
lines changed

src/main/clojure/cljs/core.cljc

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -449,10 +449,13 @@
449449
[expr & clauses]
450450
(core/assert (even? (count clauses)))
451451
(core/let [g (gensym)
452-
pstep (core/fn [[test step]] `(if ~test (-> ~g ~step) ~g))]
452+
steps (map (core/fn [[test step]] `(if ~test (-> ~g ~step) ~g))
453+
(partition 2 clauses))]
453454
`(let [~g ~expr
454-
~@(interleave (repeat g) (map pstep (partition 2 clauses)))]
455-
~g))))
455+
~@(interleave (repeat g) (butlast steps))]
456+
~(if (empty? steps)
457+
g
458+
(last steps))))))
456459

457460
#?(:cljs
458461
(core/defmacro cond->>
@@ -463,10 +466,13 @@
463466
[expr & clauses]
464467
(core/assert (even? (count clauses)))
465468
(core/let [g (gensym)
466-
pstep (core/fn [[test step]] `(if ~test (->> ~g ~step) ~g))]
469+
steps (map (core/fn [[test step]] `(if ~test (->> ~g ~step) ~g))
470+
(partition 2 clauses))]
467471
`(let [~g ~expr
468-
~@(interleave (repeat g) (map pstep (partition 2 clauses)))]
469-
~g))))
472+
~@(interleave (repeat g) (butlast steps))]
473+
~(if (empty? steps)
474+
g
475+
(last steps))))))
470476

471477
#?(:cljs
472478
(core/defmacro as->
@@ -475,30 +481,38 @@
475481
successive form, returning the result of the last form."
476482
[expr name & forms]
477483
`(let [~name ~expr
478-
~@(interleave (repeat name) forms)]
479-
~name)))
484+
~@(interleave (repeat name) (butlast forms))]
485+
~(if (empty? forms)
486+
name
487+
(last forms)))))
480488

481489
#?(:cljs
482490
(core/defmacro some->
483491
"When expr is not nil, threads it into the first form (via ->),
484492
and when that result is not nil, through the next etc"
485493
[expr & forms]
486494
(core/let [g (gensym)
487-
pstep (core/fn [step] `(if (nil? ~g) nil (-> ~g ~step)))]
495+
steps (map (core/fn [step] `(if (nil? ~g) nil (-> ~g ~step)))
496+
forms)]
488497
`(let [~g ~expr
489-
~@(interleave (repeat g) (map pstep forms))]
490-
~g))))
498+
~@(interleave (repeat g) (butlast steps))]
499+
~(if (empty? steps)
500+
g
501+
(last steps))))))
491502

492503
#?(:cljs
493504
(core/defmacro some->>
494505
"When expr is not nil, threads it into the first form (via ->>),
495506
and when that result is not nil, through the next etc"
496507
[expr & forms]
497508
(core/let [g (gensym)
498-
pstep (core/fn [step] `(if (nil? ~g) nil (->> ~g ~step)))]
509+
steps (map (core/fn [step] `(if (nil? ~g) nil (->> ~g ~step)))
510+
forms)]
499511
`(let [~g ~expr
500-
~@(interleave (repeat g) (map pstep forms))]
501-
~g))))
512+
~@(interleave (repeat g) (butlast steps))]
513+
~(if (empty? steps)
514+
g
515+
(last steps))))))
502516

503517
#?(:cljs
504518
(core/defmacro if-some

src/test/cljs/cljs/core_test.cljs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,50 @@
491491
(is (= expected (hash uuid)))
492492
(is (= expected (.-__hash uuid))))))
493493

494+
(def constantly-nil (constantly nil))
495+
496+
(deftest some->test
497+
(is (nil? (some-> nil)))
498+
(is (= 0 (some-> 0)))
499+
(is (= -1 (some-> 1 (- 2))))
500+
(is (nil? (some-> 1 constantly-nil (- 2)))))
501+
502+
(deftest some->>test
503+
(is (nil? (some->> nil)))
504+
(is (= 0 (some->> 0)))
505+
(is (= 1 (some->> 1 (- 2))))
506+
(is (nil? (some->> 1 constantly-nil (- 2)))))
507+
508+
(deftest cond->test
509+
(is (= 0 (cond-> 0)))
510+
(is (= -1 (cond-> 0 true inc true (- 2))))
511+
(is (= 0 (cond-> 0 false inc)))
512+
(is (= -1 (cond-> 1 true (- 2) false inc))))
513+
514+
(deftest cond->>test
515+
(is (= 0 (cond->> 0)))
516+
(is (= 1 (cond->> 0 true inc true (- 2))))
517+
(is (= 0 (cond->> 0 false inc)))
518+
(is (= 1 (cond->> 1 true (- 2) false inc))))
519+
520+
(deftest as->test
521+
(is (= 0 (as-> 0 x)))
522+
(is (= 1 (as-> 0 x (inc x))))
523+
(is (= 2 (as-> [0 1] x
524+
(map inc x)
525+
(reverse x)
526+
(first x)))))
527+
528+
(deftest threading-loop-recur
529+
(is (nil? (loop []
530+
(as-> 0 x
531+
(when-not (zero? x)
532+
(recur))))))
533+
(is (nil? (loop [x nil] (some-> x recur))))
534+
(is (nil? (loop [x nil] (some->> x recur))))
535+
(is (= 0 (loop [x 0] (cond-> x false recur))))
536+
(is (= 0 (loop [x 0] (cond->> x false recur)))))
537+
494538
;; =============================================================================
495539
;; Tickets
496540

0 commit comments

Comments
 (0)