7

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 - 这是一项出色的工作。我问这个问题是分开的。

4

2 回答 2

11

是的,Clojure 是单类型的,但是 Sam Tobin-Hochstadt认为单类型的分类在实践中并不是很丰富。

单类型理论几乎没有揭示动态类型语言编程的本质。它主要用于证明类型论中“动态”类型的存在。

Typed Racket这样的项目正是为了发现和建模程序员在此类语言中使用的隐式类型信息而发明的。通常类型是相当准确的,并且表明发生的事情比表面上看到的要多得多。

于 2014-04-25T07:02:18.457 回答
8

我读了。我不明白。但是,正如作者罗伯特哈珀猜测的那样,我没有去卡内基梅隆大学。我们似乎有一堆针对稻草人的尖酸刻薄,最终得出了一个惊人的结论,即动态类型语言是动态类型的。

这里的主要混淆在于术语“动态编程语言”和“动态类型”之间。这些不是一回事。例如,动态编程语言可以具有健壮的静态类型系统,尽管大多数语言都没有。哈珀通过混合术语来延续这种混乱。

动态语言

您引用的对 Clojure 的描述是关于 Clojure 是一种“动态编程语言”。

Clojure 支持的每个功能都在运行时得到支持。

关键是 Clojure 的全部功能在运行时可用。您可以在运行时动态添加新代码、添加新类型、将协议扩展到现有类型等。

这是值得吹嘘的。

因此,当 Harper 讽刺地问:“嘿,动态语言很酷,对吗?”时,我真诚地回答:“是的,先生,它们是,但显然我们谈论的不是同一件事!”。

动态类型

动态类型与静态类型是另一个问题。Clojure并不是在吹嘘没有一个健壮的类型系统。大多数 Clojurians 会欢迎这个选项,因此对core.typed很感兴趣。例如,对于Haskell 的类型系统有很多话要说。没有人真正挑战这一点。

你的例子

在您的示例中,您正在使用编译时模糊运行时(这对于动态语言已经模糊,其中编译器的全部功能在运行时可用)。您所做的类型检查发生在println语句的运行时。在 Clojure 中,值具有类型,而引用类型的存储位置(例如var您使用 创建的def)则没有。

你的问题

为了回答您的标题问题,Clojure 属于动态类型的标题。如果你真的想的话,你可以调用动态类型的“uni-typed”;但是,至少在该文章的上下文中,该术语似乎被用作贬义词。只需将其称为动态类型,我们就知道这意味着什么。

但更大的问题是,如果您关注的是动态类型还是静态类型,那么您就错过了 Clojure 作为动态编程语言这一点,是的,非常酷。像 core.typed 这样的项目最终会提供打字。凉爽的部分将保留。

于 2014-04-25T02:53:35.020 回答