|
612 | 612 | pb (core/fn pb [bvec b v]
|
613 | 613 | (core/let [pvec
|
614 | 614 | (core/fn [bvec b val]
|
615 |
| - (core/let [gvec (gensym "vec__")] |
616 |
| - (core/loop [ret (core/-> bvec (conj gvec) (conj val)) |
| 615 | + (core/let [gvec (gensym "vec__") |
| 616 | + gseq (gensym "seq__") |
| 617 | + gfirst (gensym "first__") |
| 618 | + has-rest (some #{'&} b)] |
| 619 | + (core/loop [ret (core/let [ret (conj bvec gvec val)] |
| 620 | + (if has-rest |
| 621 | + (conj ret gseq (core/list `seq gvec)) |
| 622 | + ret)) |
617 | 623 | n 0
|
618 | 624 | bs b
|
619 | 625 | seen-rest? false]
|
620 | 626 | (if (seq bs)
|
621 | 627 | (core/let [firstb (first bs)]
|
622 | 628 | (core/cond
|
623 |
| - (= firstb '&) (recur (pb ret (second bs) (core/list `nthnext gvec n)) |
624 |
| - n |
625 |
| - (nnext bs) |
626 |
| - true) |
| 629 | + (= firstb '&) (recur (pb ret (second bs) gseq) |
| 630 | + n |
| 631 | + (nnext bs) |
| 632 | + true) |
627 | 633 | (= firstb :as) (pb ret (second bs) gvec)
|
628 | 634 | :else (if seen-rest?
|
629 |
| - (throw |
630 |
| - #?(:clj (new Exception "Unsupported binding form, only :as can follow & parameter") |
631 |
| - :cljs (new js/Error "Unsupported binding form, only :as can follow & parameter"))) |
632 |
| - (recur (pb ret firstb (core/list `nth gvec n nil)) |
633 |
| - (core/inc n) |
634 |
| - (next bs) |
635 |
| - seen-rest?)))) |
| 635 | + (throw #?(:clj (new Exception "Unsupported binding form, only :as can follow & parameter") |
| 636 | + :cljs (new js/Error "Unsupported binding form, only :as can follow & parameter"))) |
| 637 | + (recur (pb (if has-rest |
| 638 | + (conj ret |
| 639 | + gfirst `(first ~gseq) |
| 640 | + gseq `(next ~gseq)) |
| 641 | + ret) |
| 642 | + firstb |
| 643 | + (if has-rest |
| 644 | + gfirst |
| 645 | + (core/list `nth gvec n nil))) |
| 646 | + (core/inc n) |
| 647 | + (next bs) |
| 648 | + seen-rest?)))) |
636 | 649 | ret))))
|
637 | 650 | pmap
|
638 | 651 | (core/fn [bvec b v]
|
639 | 652 | (core/let [gmap (gensym "map__")
|
640 | 653 | defaults (:or b)]
|
641 | 654 | (core/loop [ret (core/-> bvec (conj gmap) (conj v)
|
642 |
| - (conj gmap) (conj `(if (implements? ISeq ~gmap) (apply cljs.core/hash-map ~gmap) ~gmap)) |
643 |
| - ((core/fn [ret] |
644 |
| - (if (:as b) |
645 |
| - (conj ret (:as b) gmap) |
646 |
| - ret)))) |
| 655 | + (conj gmap) (conj `(if (implements? ISeq ~gmap) (apply cljs.core/hash-map ~gmap) ~gmap)) |
| 656 | + ((core/fn [ret] |
| 657 | + (if (:as b) |
| 658 | + (conj ret (:as b) gmap) |
| 659 | + ret)))) |
647 | 660 | bes (reduce
|
648 |
| - (core/fn [bes entry] |
649 |
| - (reduce #(assoc %1 %2 ((val entry) %2)) |
650 |
| - (dissoc bes (key entry)) |
651 |
| - ((key entry) bes))) |
652 |
| - (dissoc b :as :or) |
653 |
| - {:keys #(if (core/keyword? %) % (keyword (core/str %))), |
654 |
| - :strs core/str, :syms #(core/list `quote %)})] |
| 661 | + (core/fn [bes entry] |
| 662 | + (reduce #(assoc %1 %2 ((val entry) %2)) |
| 663 | + (dissoc bes (key entry)) |
| 664 | + ((key entry) bes))) |
| 665 | + (dissoc b :as :or) |
| 666 | + {:keys #(if (core/keyword? %) % (keyword (core/str %))), |
| 667 | + :strs core/str, :syms #(core/list `quote %)})] |
655 | 668 | (if (seq bes)
|
656 | 669 | (core/let [bb (key (first bes))
|
657 | 670 | bk (val (first bes))
|
658 |
| - has-default (contains? defaults bb)] |
659 |
| - (recur (pb ret bb (if has-default |
660 |
| - (core/list 'cljs.core/get gmap bk (defaults bb)) |
661 |
| - (core/list 'cljs.core/get gmap bk))) |
662 |
| - (next bes))) |
| 671 | + bv (if (contains? defaults bb) |
| 672 | + (core/list 'cljs.core/get gmap bk (defaults bb)) |
| 673 | + (core/list 'cljs.core/get gmap bk))] |
| 674 | + (recur (core/cond |
| 675 | + (core/symbol? bb) (core/-> ret (conj (if (namespace bb) (symbol (name bb)) bb)) (conj bv)) |
| 676 | + (core/keyword? bb) (core/-> ret (conj (symbol (name bb)) bv)) |
| 677 | + :else (pb ret bb bv)) |
| 678 | + (next bes))) |
663 | 679 | ret))))]
|
664 | 680 | (core/cond
|
665 | 681 | (core/symbol? b) (core/-> bvec (conj (if (namespace b) (symbol (name b)) b)) (conj v))
|
666 | 682 | (core/keyword? b) (core/-> bvec (conj (symbol (name b))) (conj v))
|
667 | 683 | (vector? b) (pvec bvec b v)
|
668 | 684 | (map? b) (pmap bvec b v)
|
669 | 685 | :else (throw
|
670 |
| - #?(:clj (new Exception (core/str "Unsupported binding form: " b)) |
671 |
| - :cljs (new js/Error (core/str "Unsupported binding form: " b))))))) |
| 686 | + #?(:clj (new Exception (core/str "Unsupported binding form: " b)) |
| 687 | + :cljs (new js/Error (core/str "Unsupported binding form: " b))))))) |
672 | 688 | process-entry (core/fn [bvec b] (pb bvec (first b) (second b)))]
|
673 | 689 | (if (every? core/symbol? (map first bents))
|
674 | 690 | bindings
|
|
0 commit comments