From 1ec186e5bf74ad67a29e97e4543f81ef04af9c67 Mon Sep 17 00:00:00 2001 From: Mike Fikes Date: Mon, 19 Nov 2018 22:08:09 -0500 Subject: [PATCH] Add requiring-resolve Fixes #835 --- CHANGELOG.md | 2 ++ planck-cljs/src/planck/core.cljs | 14 ++++++++++++++ planck-cljs/src/planck/repl.cljs | 10 +++++++++- planck-cljs/test/planck/core_test.cljs | 4 ++++ planck-cljs/test/planck/requiring_resolve_ns.cljs | 3 +++ site/src/planck-core.md | 11 +++++++++++ 6 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 planck-cljs/test/planck/requiring_resolve_ns.cljs diff --git a/CHANGELOG.md b/CHANGELOG.md index f0d4b01f..153c1fd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). ## [Unreleased] +### Added +- Add `requiring-resolve` ([#835](https://github.com/mfikes/planck/issues/835)) ## [2.19.0] - 2018-11-02 ### Changed diff --git a/planck-cljs/src/planck/core.cljs b/planck-cljs/src/planck/core.cljs index ee9bd051..35d67905 100644 --- a/planck-cljs/src/planck/core.cljs +++ b/planck-cljs/src/planck/core.cljs @@ -393,6 +393,20 @@ :args (s/cat :sym symbol?) :ret (s/nilable var?)) +(defn requiring-resolve + "Resolves namespace-qualified sym per 'resolve'. If initial resolve + fails, attempts to require sym's namespace and retries." + [sym] + (if (qualified-symbol? sym) + (or (resolve sym) + (do (eval `(require '~(-> sym namespace symbol))) + (resolve sym))) + (throw (js/Error. (str "Not a qualified symbol: " sym))))) + +(s/fdef requiring-resolve + :args (s/cat :sym qualified-symbol?) + :ret (s/nilable var?)) + (defn find-var "Returns the global var named by the namespace-qualified symbol, or nil if no var with that name." diff --git a/planck-cljs/src/planck/repl.cljs b/planck-cljs/src/planck/repl.cljs index 46e5ed1f..191165b6 100644 --- a/planck-cljs/src/planck/repl.cljs +++ b/planck-cljs/src/planck/repl.cljs @@ -2093,7 +2093,15 @@ (defn- ns-resolve [ns sym] - (eval `(~'var ~sym) ns)) + (let [result (atom nil)] + (binding [ana/*cljs-warnings* (zipmap (keys ana/*cljs-warnings*) (repeat false))] + (cljs/eval st `(~'var ~sym) + {:ns ns + :context :expr} + (fn [{:keys [value error]}] + (when-not error + (reset! result value))))) + @result)) (defn- resolve [sym] diff --git a/planck-cljs/test/planck/core_test.cljs b/planck-cljs/test/planck/core_test.cljs index 1f4244d2..ae424e9e 100644 --- a/planck-cljs/test/planck/core_test.cljs +++ b/planck-cljs/test/planck/core_test.cljs @@ -146,3 +146,7 @@ (deftest load-string-test (is (= 3 (planck.core/load-string "1 2 3"))) (is (= "hi" (with-out-str (planck.core/load-string "1 (print \"hi\") 2"))))) + +(deftest requiring-resolve-test + (is (nil? (planck.core/resolve 'planck.requiring-resolve-ns/a))) + (is (= 3 @(planck.core/requiring-resolve 'planck.requiring-resolve-ns/a)))) diff --git a/planck-cljs/test/planck/requiring_resolve_ns.cljs b/planck-cljs/test/planck/requiring_resolve_ns.cljs new file mode 100644 index 00000000..fef6a91d --- /dev/null +++ b/planck-cljs/test/planck/requiring_resolve_ns.cljs @@ -0,0 +1,3 @@ +(ns planck.requiring-resolve-ns) + +(def a 3) diff --git a/site/src/planck-core.md b/site/src/planck-core.md index 8deb1f96..31966330 100644 --- a/site/src/planck-core.md +++ b/site/src/planck-core.md @@ -31,6 +31,7 @@ _Vars_ [read-line](#read-line)
[read-password](#read-password)
[read-string](#read-string)
+[requiring-resolve](#requiring-resolve)
[resolve](#resolve)
[sleep](#sleep)
[slurp](#slurp)
@@ -262,6 +263,16 @@ Spec
Spec
_args_: `(alt :unary (cat :s string?) :binary (cat :opts map? :s string?))`

+### requiring-resolve +`([sym])` + + Resolves namespace-qualified sym per [`resolve`](#resolve). If initial resolve + fails, attempts to `require` `sym`'s namespace and retries. + +Spec
+ _args_: `(cat :sym qualified-symbol?)`
+ _ret_: `(nilable var?)`
+ ### resolve `([sym])`