请分享您的观点,参加2024 Clojure 状态调查!

欢迎!请访问关于页面以了解该工作的更多信息。

0投票
Java 互操作
编辑

我经常通过放置类型完全明显的注解来处理反射警告。

(def ^String foo "bar") ;; adding ^String fixes reflection warnings elsewhere

"bar"是一个字符串,这在编译时昭然若揭,因此在我看来,我只是在做一些繁琐的工作,而且还可能在未来变得过时。

有没有考虑过为这样的简单情况添加“类型推断”?

(这里的“类型推断”可能对这个用例来说是一个夸张的术语)

...我可以想象至少一个反对意见:`(def ^CharSequence foo "bar")`也可能是准确和有用的。但一个好的默认设置是推断`x`的类型为`x`的类 - 如果用户想要将`x`注释为其祖先之一(这里:`CharSequence`,`Object`),则可以通过手动覆盖推断的默认值来实现。

1 答案

+1投票

`(def foo "bar")`创建了一个Clojure 变量 - 技术上是一种可变的存储形式。

除非有人提供提示,否则无法保证代码不会执行像`(alter-var-root #'foo #(do % 42))`这样的操作。这将使在核心语言中执行隐式类型推断变得困难。

我考虑过这一点,alter-var-root 可以简单地擦除当前已推断的类型注解,而不是程序员指定的注解(这可以通过额外的元数据轻易地区分)。
使用 alter-var-root 中的运行时操作擦除类型提示,对于已经用原始类型信息编译的代码没有帮助。
如果以无结构的方式重新加载代码(无论选择哪种工作流程)和/或使用低级 API,代码的破坏方式可能有多种。

也许可以通过动态变量或系统属性等来控制这个特性,对于那些关心(并且不会破坏代码)的人来说。
我们当然不反对在可能的情况下添加类型推断,但这个特定的变化并不简单,并且鉴于类型提示的有效性,可能不会得到推广。话虽如此,Typed Clojure 项目可能为此情景提供了令人满意的解决方案,这可能值得探索。 https://typedclojure.org
...