我非常喜欢的一件事是阅读不同的编程语言。目前我正在学习Scala,但这并不意味着我对Groovy,Clojure,Python和其他许多人都不感兴趣。所有这些语言都具有独特的外观和一些特征。在clojure的情况下,我不理解这些设计决策之一。据我所知,Clojure非常强调其功能范式,并且几乎迫使你尽可能地使用不可变的“变量”。因此,如果您的一半值是不可变的,为什么语言会动态输入? clojure网站说:
首先,Clojure是动态的。这意味着Clojure程序不仅仅是您编译和运行的东西,而是您可以与之交互的东西。
那听起来很奇怪。如果程序已编译,则无法再更改它。当然你可以与它“互动”,这就是用户所使用的UI,但网站当然并不意味着一个整洁的“动态”GUI。
Clojure如何从动态类型中受益
我的意思是Clojure的特殊情况,而不是动态类型的一般优势。
动态类型系统如何帮助改进函数式编程
同样,我知道不会溢出“int a;”的乐趣。整个源代码,但类型推断可以缓解很多痛苦。因此,我想知道动态类型如何支持函数式语言的概念。
答案 0 :(得分:18)
如果程序已编译,则无法再更改它。
这是错误的。在基于图像的系统中,如Lisp(Clojure可以被视为Lisp方言)和Smalltalk,您可以更改编译环境。使用这种语言进行开发通常意味着在运行系统上工作,添加和更改函数定义,宏定义,参数等。(添加意味着编译和加载到图像中)。
这有很多好处。首先,所有工具都可以直接与程序交互,而不需要猜测系统的行为。您也没有任何长编译暂停,因为每个编译单元都非常小(重新编译所有内容非常罕见)。美国国家航空航天局的JPL曾在太空数十万公里外的探测器上纠正了一个正在运行的Lisp系统。
对于这样的系统,在运行时提供类型信息是非常自然的(这就是动态类型的意思)。当然,没有什么能阻止你在编译时进行类型推断和类型检查。这些概念是正交的。现代Lisp实现通常可以同时执行这两种操作。
答案 1 :(得分:14)
首先,Clojure是一个Lisp,Lisps传统上一直是动态类型的。
第二,你引用的摘录说Clojure是一种动态语言。这意味着,您可以在运行时定义新函数,在运行时评估任意代码等等。所有这些事情在静态类型语言中都很难或不可能完成(没有在整个地方抹灰)。
另一个原因是宏可能会极大地使调试类型错误复杂化。我想,为宏生成的代码生成的类型错误生成有意义的错误消息对于编译器来说是一项非常重要的任务。
答案 2 :(得分:11)
我同意,纯函数式语言仍然可以使用交互式read-eval-print-loop,并且可以更轻松地进行类型推断。我认为Clojure希望通过成为“jvm的lisp”吸引lisp程序员,并选择像其他lisps一样动态。另一个因素是需要将类型系统设计为语言的第一步,语言实现者跳过该步骤的速度更快。
答案 3 :(得分:7)
Clojure是一个带有宏系统和代码作为数据哲学的Lisp,这种哲学很难与静态类型系统相处。例如,这种列表的类型是什么:
(defn square [x] (* x x))
?
然而,如果您需要静态类型,Clojure允许使用type hints。
答案 4 :(得分:4)
因为这就是世界/市场所需要的。在构建已经建成的东西时没有任何意义。
我听说JVM已经有了静态类型的语言;)
答案 5 :(得分:-1)
几个原因:
动态类型的语言更灵活,更快速地使用。
顾名思义,动态语言更具动态性,这是巨大的,因为动态语言当时并不会妨碍您探索想法和解决设计问题的节奏。很多时候,强类型会降低您的工作效率(当我处于抽象顶部时,谁会在乎字符串是否是字符串?)。
在整个程序员的生活中,更难的部分是通过软件组件(简单易读的组件)来处理表达域(及其语义)的复杂过程。强类型语言在该过程中增加了一点价值。
我认为,更多的程序员发现动态语言更易于使用,并且在任何工作中,愉悦性都是重要的。
强类型语言是一种过早的优化,这是一个严重的缺点。
此外,当使用spec完成常规结构时,可以在clojure中添加“类型”。理想情况下,一种语言应允许您将类型逐渐地超集到代码中,并且可以使用spec做到这一点。