|
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