为什么Clojuredynamicinput?
我非常喜欢的一件事是阅读不同的编程语言。 目前我正在学习Scala,但这并不意味着我对Groovy,Clojure,Python等等不感兴趣。 所有这些语言都有独特的外观和感觉以及一些特征。 在clojure的情况下,我不明白这些devise决定之一。 据我所知,Clojure非常重视它的function范例,并且强迫你尽可能使用不可变的“variables”。 所以如果你的一半数值是不变的,为什么这个语言是dynamicinput的呢? clojure网站说:
首先,Clojure是dynamic的。 这意味着一个Clojure程序不只是你编译和运行的东西,而是你可以与之交互的东西。
那听起来很奇怪。 如果一个程序被编译,你不能再改变它了。 当然,你可以与它“交互”,这就是用户界面,但网站当然不意味着一个整洁的“dynamic”graphics用户界面。
Clojure如何从dynamictypes中受益
我的意思是Clojure的特殊情况,而不是dynamictypes的一般优点。
dynamictypes系统如何帮助改进函数式编程
再一次,我知道不会溢出“int a”的乐趣。 所有的源代码,但types推断可以缓解很多的痛苦。 因此,我只想知道dynamictypes如何支持function语言的概念。
我同意,一个纯粹的函数式语言仍然可以有一个交互式的read-eval-print-loop,并且在types推断上会更容易。 我假设Clojure希望通过“聆听jvm”来吸引lisp程序员,并select像其他lisp一样充满活力。 另一个因素是types系统需要被devise为语言的第一步,而语言实现者只是跳过这一步更快。
如果一个程序被编译,你不能再改变它了。
这是错误的。 在基于图像的系统中,比如Lisp(Clojure可以被看作Lisp方言)和Smalltalk,你可以改变编译环境。 用这种语言进行开发通常意味着在正在运行的系统上工作,添加和改变函数定义,macros定义,参数等(增加意味着编译和加载到图像中)。
这有很多好处。 首先,所有的工具都可以直接与程序交互,而不需要猜测系统的行为。 您也没有任何长时间的编译暂停,因为每个编译单元都非常小(重新编译所有内容非常罕见)。 NASA喷气推进实验室曾经在数十万公里外的太空探测器上纠正了一个正在运行的Lisp系统。
对于这样的系统,运行时可以获得types信息是非常自然的(这就是dynamictypes的含义)。 当然,没有什么能阻止你在编译时进行types推断和types检查。 这些概念是正交的。 现代的Lisp实现通常可以兼得。
那么首先Clojure是Lisp和Lisp传统上一直是dynamictypes的。
其次,你引用的摘录说Clojure是一种dynamic的语言。 这意味着,除其他外,您可以在运行时定义新function,在运行时评估任意代码等等。 所有这些事情在静态types的语言中是很难或不可能做到的(没有在所有的地方施用灰泥)。
另一个原因是macros可能会非常复杂地debuggingtypes错误。 我想,为macros生成的代码产生的types错误生成有意义的错误消息将是编译器的一个相当大的任务。
Clojure是一个具有macros观系统和代码为数据的哲学的Lisp,这种哲学很难与静态types系统相一致。 例如,这样的列表的types是什么:
(defn square [x] (* xx))
?
不过,如果你需要静态types,Clojure允许使用types提示 。
因为那是世界/市场所需要的。 没有build设什么已经build成的意义。
我听说JVM已经有一个静态types的语言;)