请分享您对 Clojure 2024 情况调查 的看法!

欢迎!请参阅 关于 页面获取更多关于如何使用本站的信息。

0 投票
编译器
我正在尝试编写一个宏,该宏使用一些反射来生成 reify 表达式。

clojure.reflect 产生的类型符号类似于 'java.util.Iterator& '<> '

不幸的是,编译器不接受类型提示中的 & '<> 语法

(reify Iterable (^{:tag java.util.Iterator} iterator [this] nil)) ; 运作正常

(reify Iterable (^{:tag java.util.Iterator& '<>} iterator [this] nil)) ;; 失败
CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException: java.util.Iterator& '<>, compiling:(NO_SOURCE_PATH:1325)

看起来编译器应该足以理解并去除 & '<> 而不是拒绝它。这将使编写涉及类型提示和反射的正确宏变得更加容易。

我一直在使用的解决办法是

(defn hint
  "clojure.reflect 使用尖括号标记泛型,但
   编译器不支持类型提示中的泛型"
  [obj tag]
  (let [tag (-> tag .toString (.replace "& '<>" "") symbol)]
    (with-meta obj {:tag tag}));)

2 个答案

0 投票

评论者:bbloom

很抱歉,我之前弄错了。问题是真实的,但问题是关于 数组,而不是 泛型

我的解决办法不起作用... :-/

0 投票
参考资料: https://clojure.atlassian.net/browse/CLJ-938 (由 bbloom 提交)
...