haw*_*eye 7 types clojure dynamic static-language
罗伯特哈珀写了一篇名为"动态语言是静态语言"的迷人作品.在其中他写道:
这正是动态类型语言的错误:它们不是提供忽略类型的自由,而是强加了将注意力限制在单一类型上的束缚!每个值都必须是该类型的值,您别无选择!
这已经成为单类型语言.(单一语言).
现在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)));)
Run Code Online (Sandbox Code Playgroud)
然后在Leiningen中编译它:
lein uberjar
Run Code Online (Sandbox Code Playgroud)
然后我得到以下内容:
$ lein uberjar
Compiling clojure-unittyped.core
types didn't match: class clojure_unittyped.core.circle-type : class clojure_unittyped.core.square-type
Run Code Online (Sandbox Code Playgroud)
在动态语言中,这似乎是编译时的类型失败.
我的问题是:Clojure Uni-Typed?
编辑 - 我知道core.typed - 这是一项很棒的工作.我问这个问题是分开的.
Amb*_*ose 11
是的,Clojure是单类型的,但Sam Tobin-Hochstadt 认为单一类型的分类在实践中并不是非常有用.
单类理论很少揭示动态类型语言中编程的本质; 它主要用于证明类型理论中存在"动态"类型.
像Typed Racket这样的项目被精心发明,用于发现和模拟程序员在这些语言中使用的隐式类型信息.通常类型都非常准确,并且表明还有很多东西比眼睛看上去还要多.
我读了 我不明白.但是,正如作者罗伯特哈珀猜测的那样,我没有去卡内基梅隆.我们似乎有一堆针对稻草人的讽刺,最后是动态类型语言动态输入的惊人结论.
这里主要的混淆是术语"动态编程语言"和"动态类型".这些都不是一回事.例如,动态编程语言可以具有强大的静态类型系统,即使大多数情况不是这样.哈珀通过混合术语使这种混乱永久化.
您引用的Clojure描述是关于Clojure是一种"动态编程语言".
Clojure支持的每个功能都在运行时受支持.
关键是Clojure的全部功能在运行时可用.您可以在运行时动态添加新代码,添加新类型,将协议扩展到现有类型等.
这值得吹牛.
所以,当哈珀讽刺地问道,"那么,嘿,动态语言很酷,对吧?",我真诚地回答,"是的,先生,他们是,但显然我们不是在谈论同样的事情!".
动态类型与静态类型是另一个问题.Clojure 没有吹嘘没有强大的类型系统.大多数Clojurians会欢迎这个选项,因此对core.typed感兴趣.有很多的哈斯克尔例如型系统可说的.没有人真正挑战那个.
在您的示例中,您使用编译时模糊了运行时(使用动态语言已经很模糊,其中编译器的全部功能在运行时可用).您执行的类型检查发生在println语句的运行时.在Clojure中,值具有类型,引用类型的存储位置(例如var您创建的def)不具有.
要回答你的标题问题,Clojure属于动态类型的标题.如果你真的想要,你可以调用动态类型的"uni-typed"; 但是,至少在那篇文章的背景下,看起来这个术语被用作贬义词.因此,正如劳伦斯所说的那样,"不,不,伙计.S***,不,男人.我相信你会被这样的事情说出来,男人."只要称它为动态打字,我们知道这意味着什么.有一天,是的,你将有一个"星期一的案例"追逐可能在编译时被捕获的一些运行时错误.
更大的问题是,如果你专注于动态与静态类型,你会错过,是的,非常酷,Clojure是一种动态编程语言.像core.typed这样的项目最终将提供打字.凉爽的部分将保留下来.