Skip to content

Commit

Permalink
fix: cannot take value of macro (#13)
Browse files Browse the repository at this point in the history
  • Loading branch information
erdos committed Jan 16, 2022
1 parent d726679 commit df3bb88
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
9 changes: 6 additions & 3 deletions src/uclj/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -595,9 +595,12 @@
(gen-eval-node (aget #^objects &b index)))
(if (var? (resolve expr))
(let [^clojure.lang.Var resolved-expr (resolve expr)]
(if (and (bound? resolved-expr) (not (.isDynamic resolved-expr)))
(let [expr-val @resolved-expr] (gen-eval-node {::var resolved-expr} expr-val))
(gen-eval-node {::unbound-var resolved-expr} @resolved-expr))) ;; var was unbound at compile time so we need to deref in in runtime
(cond (.isMacro resolved-expr)
(throw (new RuntimeException (str "Can't take value of a macro: " resolved-expr)))
(and (bound? resolved-expr) (not (.isDynamic resolved-expr)))
(let [expr-val @resolved-expr] (gen-eval-node {::var resolved-expr} expr-val))
:else
(gen-eval-node {::unbound-var resolved-expr} @resolved-expr))) ;; var was unbound at compile time so we need to deref in in runtime
(if-let [parent (some-> expr namespace symbol resolve)]
(if (class? parent)
(gen-eval-node (clojure.lang.Reflector/getStaticField ^Class parent (name expr)))
Expand Down
4 changes: 4 additions & 0 deletions test/uclj/core_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
(evaluator '(let [~@(interleave varnames (range i))]
(+ ~@(take i varnames)))))))))))

(deftest test-eval-sym
(testing "taking value of macro"
(is (thrown? RuntimeException (evaluator '(do ->))))))

(deftest test-eval-try
(testing "try-catch maintains sybol usage across closure"
(is (= 2 (evaluator '(let [a 1 b 2 c 3]
Expand Down

0 comments on commit df3bb88

Please sign in to comment.