是Clojure Uni-Typed?

时间:2014-04-25 01:26:43

标签: dynamic types clojure static-language

Robert Harper撰写了一篇名为"Dynamic languages are static languages"的精彩文章。他写道:

  

这正是动态类型语言的错误:它们不是提供忽略类型的自由,而是强加了将注意力限制在单一类型上的束缚!每个值都必须是该类型的值,您别无选择!

has come to mean uni-typed languages。 (单一语言)。

现在Clojure claims to be a dynamic language

  

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 Uni-Typed?


编辑 - 我了解core.typed - 这是一项出色的工作。我问这个问题是分开的。

2 个答案:

答案 0 :(得分:11)

是的,Clojure是单类型的,但Sam Tobin-Hochstadt argues单一类型的分类在实践中并不是很有用。

单一类型的理论很少揭示动态类型语言中编程的本质;它主要用于证明类型理论中存在“动态”类型。

Typed Racket这样的项目的发明正是为了发现和模拟程序员在这些语言中使用的隐式类型信息。通常类型非常准确,并且表明还有很多事情要比满足眼睛要多。

答案 1 :(得分:8)

我看了。我不明白。但是,正如作者罗伯特哈珀猜测的那样,我没有去卡内基梅隆。我们似乎有一堆针对稻草人的讽刺,最后是动态类型语言动态输入的惊人结论。

这里主要的混淆是术语“动态编程语言”和“动态类型”。这些都不是一回事。例如,动态编程语言可以具有强大的静态类型系统,即使大多数情况不是这样。哈珀通过混合术语使这种混乱永久化。

动态语言

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

  

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

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

这值得吹牛。

所以,当哈珀讽刺地问道,“那么,嘿,动态语言很酷,对吧?”,我真诚地回答,“是的,先生,他们是,但显然我们不是在谈论同样的事情!”。

动态类型

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

你的例子

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

您的问题

要回答您的标题问题,Clojure属于动态类型标题。如果你真的想要,你可以调用动态类型的“uni-typed”;但是,至少在那篇文章的背景下,看起来这个术语被用作贬义词。所以,as Lawrence would say,“不,不,伙计.S ***,不,伙计。我相信你会得到一个像这样的东西,男人。”只需称它为动态打字,我们知道这意味着什么。有一天,是的,你将有一个“星期一的案例”追逐可能在编译时捕获的一些运行时错误。

更大的问题是,如果你专注于动态与静态类型,你就会错过,是的,非常酷,Clojure是一个动态编程语言。像core.typed这样的项目最终将提供打字。凉爽的部分将保留。