Clojure 静态类型,第 2 部分

标签 clojure static-typing

这是 my previous question 的后续内容关于 Clojure 静态类型。

我浏览了编译器的Java源代码,有几个地方检查了*warn-on-reflection*的值,但是当我编译以下代码时,我只得到一个运行时错误:

(defn div-2 [^String s] (/ 2 s))

是否有任何情况下此代码应该给出编译时警告(实际上没有)?让编译器对以下代码发出警告有多困难:

(defn get-length [^String s] (.length s))
(defn test-get-length [] (get-length 2.0))

谢谢。

最佳答案

问题是编译器不跟踪 def 的变量的类型。所以是的,在你的简单例子中,这是可能的。但是您多久传递一次文字呢?在实际的程序中很少见。

使类型像在真正的静态类型语言中那样“流动”将需要大量的返工。您必须通过变量、动态反弹变量、取消引用等来跟踪类型信息。然后,您仍然会遇到从集合/序列中提取项目的问题,这意味着泛型类型,这是一个巨大的蠕虫......

Clojure 中的类型注释从来都不是为了在编译时提供类型安全 - 它们只是允许编译器生成更优化的代码(如果遇到意外类型,则会出现运行时错误。)

用完整的静态类型信息来检测编译器可能是可能的,但那时您已经很大程度上重写了语言,并且您必须在如何处理类型方面做出许多决定和权衡。它真的不再是 Clojure。

关于Clojure 静态类型,第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204629/

相关文章:

c# - 大型机平面文件到 C# 类

amazon-s3 - 使用 Clojure 的 Amazonica 创建 S3 签名 URL 时如何指定 ACL 策略?

function - Clojure 函数的更惯用和优雅的方式

haskell - Clojure 中的 mapcat 和 Haskell 中的 concatmap 有什么区别?

javascript - node.js API 到 ClojureScript 的惯用转换

C 风格类型注解与其他注解

java - Clojure:如何将 Varargs 扩展为 Java 方法的列表

programming-languages - 静态键入如何限制宏?

python-3.x - 如何让 mypy 提示将 Any 分配给 int(第 2 部分)

types - 动态类型语言如何工作?