From 18791c6b82d78c0cf40f63e61a8cdbfbee7ac15a Mon Sep 17 00:00:00 2001 From: Nathan Marz Date: Sat, 3 Sep 2016 19:58:10 -0400 Subject: [PATCH] inline caching working for cljs, all tests passing --- project.clj | 2 +- src/clj/com/rpl/specter/impl.cljc | 29 +++++++++++++++---------- src/clj/com/rpl/specter/macros.clj | 6 +++-- src/clj/com/rpl/specter/util_macros.clj | 2 +- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/project.clj b/project.clj index fc09529..4818a0b 100644 --- a/project.clj +++ b/project.clj @@ -24,7 +24,7 @@ :profiles {:dev {:dependencies [[org.clojure/test.check "0.7.0"] [org.clojure/clojure "1.7.0"] - [org.clojure/clojurescript "1.7.10"]]} + [org.clojure/clojurescript "1.7.122"]]} :test {:dependencies [[org.clojure/clojure "1.7.0"]]}} diff --git a/src/clj/com/rpl/specter/impl.cljc b/src/clj/com/rpl/specter/impl.cljc index f963672..63775d0 100644 --- a/src/clj/com/rpl/specter/impl.cljc +++ b/src/clj/com/rpl/specter/impl.cljc @@ -180,6 +180,12 @@ (coerce-path [this] (coerce-object this))) +(def STAY* + (reify RichNavigator + (select* [this vals structure next-fn] + (next-fn vals structure)) + (transform* [this vals structure next-fn] + (next-fn vals structure)))) (defn combine-two-navs [nav1 nav2] (reify RichNavigator @@ -203,7 +209,7 @@ (do-comp-paths [navigators] (let [coerced (map coerce-path navigators)] (cond (empty? coerced) - (coerce-path nil) + STAY* (= 1 (count coerced)) (first coerced) @@ -443,13 +449,6 @@ (next-fn vals structure) structure)))) -(def STAY* - (reify RichNavigator - (select* [this vals structure next-fn] - (next-fn vals structure)) - (transform* [this vals structure next-fn] - (next-fn vals structure)))) - (defn ^:direct-nav collected?* [afn] (reify RichNavigator (select* [this vals structure next-fn] @@ -794,6 +793,12 @@ (def ^:dynamic *DEBUG-INLINE-CACHING* false) +#?(:cljs + (defn mk-fn-name-strs [o] + (walk/postwalk + (fn [e] + (if (fn? e) (re-find #" .*" (pr-str e)) e)) + o))) #?(:clj (defn mk-dynamic-path-maker [resolved-code ns-str used-locals-list possible-param] @@ -806,10 +811,12 @@ (binding [*ns* ns] (eval+ code)))) :cljs - (defn mk-dynamic-path-maker [resolved-code ns-str used-locals-list possible-param] + (defn mk-dynamic-path-maker [resolved-code ns-str used-locals-list possible-params] (when *DEBUG-INLINE-CACHING* - (println "Produced dynamic object:") - (println resolved-code) + (println "Possible params:") + (println possible-params) + (println "\nProduced dynamic object:") + (pp/pprint (mk-fn-name-strs resolved-code)) (println)) (fn [dynamic-params] (late-resolve resolved-code dynamic-params)))) diff --git a/src/clj/com/rpl/specter/macros.clj b/src/clj/com/rpl/specter/macros.clj index 68fa9b0..8635316 100644 --- a/src/clj/com/rpl/specter/macros.clj +++ b/src/clj/com/rpl/specter/macros.clj @@ -176,9 +176,11 @@ (mapcat (fn [e] (cond (or (set? e) - (map? e) ; in case inline maps are ever extended + (map? e) (symbol? e) - (and (i/fn-invocation? e) (contains? #{'fn* 'fn} (first e)))) + (and (i/fn-invocation? e) + (or (contains? #{'fn* 'fn} (first e)) + (special-symbol? (first e))))) [e] (sequential? e) diff --git a/src/clj/com/rpl/specter/util_macros.clj b/src/clj/com/rpl/specter/util_macros.clj index 7ef9752..9466958 100644 --- a/src/clj/com/rpl/specter/util_macros.clj +++ b/src/clj/com/rpl/specter/util_macros.clj @@ -39,7 +39,7 @@ (symbol (str "->LateFn" i))) (defn- mk-late-fn-record [i] - (let [fields (gensyms (inc i)) + (let [fields (concat ['fn] (for [j (range i)] (symbol (str "arg" j)))) dparams (gensym "dynamic-params") resolvers (for [f fields] `(~'late-resolve ~f ~dparams))]