Skip to content

Commit df3bb88

Browse files
authored
fix: cannot take value of macro (#13)
1 parent d726679 commit df3bb88

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

src/uclj/core.clj

+6-3
Original file line numberDiff line numberDiff line change
@@ -595,9 +595,12 @@
595595
(gen-eval-node (aget #^objects &b index)))
596596
(if (var? (resolve expr))
597597
(let [^clojure.lang.Var resolved-expr (resolve expr)]
598-
(if (and (bound? resolved-expr) (not (.isDynamic resolved-expr)))
599-
(let [expr-val @resolved-expr] (gen-eval-node {::var resolved-expr} expr-val))
600-
(gen-eval-node {::unbound-var resolved-expr} @resolved-expr))) ;; var was unbound at compile time so we need to deref in in runtime
598+
(cond (.isMacro resolved-expr)
599+
(throw (new RuntimeException (str "Can't take value of a macro: " resolved-expr)))
600+
(and (bound? resolved-expr) (not (.isDynamic resolved-expr)))
601+
(let [expr-val @resolved-expr] (gen-eval-node {::var resolved-expr} expr-val))
602+
:else
603+
(gen-eval-node {::unbound-var resolved-expr} @resolved-expr))) ;; var was unbound at compile time so we need to deref in in runtime
601604
(if-let [parent (some-> expr namespace symbol resolve)]
602605
(if (class? parent)
603606
(gen-eval-node (clojure.lang.Reflector/getStaticField ^Class parent (name expr)))

test/uclj/core_test.clj

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
(evaluator '(let [~@(interleave varnames (range i))]
2929
(+ ~@(take i varnames)))))))))))
3030

31+
(deftest test-eval-sym
32+
(testing "taking value of macro"
33+
(is (thrown? RuntimeException (evaluator '(do ->))))))
34+
3135
(deftest test-eval-try
3236
(testing "try-catch maintains sybol usage across closure"
3337
(is (= 2 (evaluator '(let [a 1 b 2 c 3]

0 commit comments

Comments
 (0)