Robert Harper写了一篇引人入胜的文章,名为“动态语言是静态语言”。他在其中写道:
这正是动态类型语言的错误所在:它们没有提供忽略类型的自由,而是强加了将注意力限制在单一类型上的束缚!每个值都必须是该类型的值,您别无选择!
这意味着单类型语言。(单一类型的语言)。
现在 Clojure声称是一种动态语言:
Clojure 是一种针对 Java 虚拟机(以及 CLR 和 JavaScript)的动态编程语言。它被设计为一种通用语言,将脚本语言的可接近性和交互式开发与用于多线程编程的高效且健壮的基础架构相结合。Clojure 是一种编译语言——它直接编译为 JVM 字节码,但仍然是完全动态的。Clojure 支持的每个功能都在运行时得到支持。
通过“动态”,它们的意思是“可以在运行时进行交互”,而不是“没有类型”。
现在静态和动态之间的关键区别似乎是“我可以在编译时获得类型失败吗?”
如果我编写以下 Clojure 代码:
(deftype circle-type [radius] )
(deftype square-type [side-length])
(defn def-check-type [new-symbol-type existing-symbol]
(let [existing-symbol-type (type existing-symbol)]
(cond
(= new-symbol-type existing-symbol-type)
(def new-symbol existing-symbol)
:else (str "types didn't match: " new-symbol-type " : " existing-symbol-type))))
(println (def-check-type circle-type (square-type. 2)));)
然后在 Leiningen 中编译它:
lein uberjar
然后我得到以下信息:
$ lein uberjar
Compiling clojure-unittyped.core
types didn't match: class clojure_unittyped.core.circle-type : class clojure_unittyped.core.square-type
在动态语言中,这似乎是编译时的类型失败。
我的问题是:Clojure 是单类型的吗?
编辑 - 我知道core.typed - 这是一项出色的工作。我问这个问题是分开的。