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])`