Details
-
Type:
Defect
-
Status:
Open
-
Priority:
Minor
-
Resolution: Unresolved
-
Affects Version/s: Release 1.3
-
Fix Version/s: None
-
Component/s: None
-
Labels:None
Description
I'm trying to write a macro which generate reify forms using some reflection.
clojure.reflect produces type symbols similar to 'java.util.Iterator<>
Unfortunately, the compiler doesn't accept the <> syntax in type hints:
(reify Iterable (^{:tag java.util.Iterator} iterator [this] nil)) ; works
(reify Iterable (^{:tag java.util.Iterator<>} iterator [this] nil)) ;; fails
CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException: java.util.Iterator<>, compiling:(NO_SOURCE_PATH:1325)
It seems like the compiler should understand the <> just enough to strip it, rather than reject it. This would make it much easier to write correct macros involving type hinting and reflection.
The workaround I have been using is:
(defn hint
"clojure.reflect demarks generics with angle brackets, but
the compiler does not support generics in type hints"
[obj tag]
(let [tag (-> tag .toString (.replace "<>" "") symbol)]
(with-meta obj {:tag tag}))![]()
I'm sorry, I got this wrong earlier. The problem is real, but it's arrays, not generics.
My workaround is useless... :-/