为什么Clojure会动态输入?

lhk*_*lhk 50 paradigms functional-programming language-design clojure dynamic

我非常喜欢的一件事是阅读不同的编程语言.目前我正在学习Scala,但这并不意味着我对Groovy,Clojure,Python和其他许多人都不感兴趣.所有这些语言都具有独特的外观和一些特征.在clojure的情况下,我不理解这些设计决策之一.据我所知,Clojure非常强调其功能范式,并且几乎迫使你尽可能地使用不可变的"变量".因此,如果您的一半值是不可变的,为什么语言会动态输入?clojure网站说:

首先,Clojure是动态的.这意味着Clojure程序不仅仅是您编译和运行的东西,而是您可以与之交互的东西.

那听起来很奇怪.如果程序已编译,则无法再更改它.当然你可以与它"互动",这就是用户所使用的UI,但网站当然并不意味着整洁的"动态"GUI.

Clojure如何从动态类型中受益

我的意思是Clojure的特殊情况,而不是动态类型的一般优点.

动态类型系统如何帮助改进函数式编程

再一次,我知道没有溢出"int a;"的乐趣.整个源代码,但类型推断可以缓解很多痛苦.因此,我想知道动态类型如何支持函数式语言的概念.

Sva*_*nte 22

如果程序已编译,则无法再更改它.

这是错的.在基于图像的系统中,如Lisp(Clojure可以被视为Lisp方言)和Smalltalk,您可以更改编译环境.这种语言的开发通常意味着在运行系统上工作,添加和更改函数定义,宏定义,参数等(添加意味着编译和加载到图像中).

这有很多好处.首先,所有工具都可以直接与程序交互,而不需要猜测系统的行为.您也没有任何长编译暂停,因为每个编译单元都非常小(重新编译所有内容非常罕见).美国国家航空航天局的JPL曾在数十万公里外的太空探测仪上修正了一个正在运行的Lisp系统.

对于这样的系统,在运行时提供类型信息是非常自然的(这就是动态类型的意思).当然,没有什么能阻止你在编译时进行类型推断和类型检查.这些概念是正交的.现代Lisp实现通常可以做到这两点.

  • 什么是基于图像的系统? (7认同)

sep*_*p2k 14

首先,Clojure是一个Lisp,Lisps传统上一直是动态类型的.

其次,你引用的摘录说Clojure是一种动态语言.这意味着,您可以在运行时定义新函数,在运行时评估任意代码等等.所有这些事情在静态类型语言中都很难或不可能完成(没有在整个地方涂抹石膏).

另一个原因是宏可能会极大地使调试类型错误复杂化.我想,为宏​​生成的代码生成的类型错误生成有意义的错误消息对于编译器来说是一项非常重要的任务.


Tob*_*obu 12

我同意,一个纯函数式语言仍然可以有一个交互式的read-eval-print-loop,并且可以更容易地进行类型推断.我假设Clojure希望通过成为"jvm的lisp"吸引lisp程序员,并选择像其他lisps一样动态.另一个因素是类型系统需要被设计为语言的第一步,语言实现者只需跳过该步骤就会更快.

  • "[T] ype系统需要被设计为语言的第一步" - 不是这样.[Typed Racket](http://docs.racket-lang.org/ts-guide/)在无类型功能语言(Racket)之上构建一个类型系统. (9认同)
  • 使用[Typed Clojure](http://typedclojure.org/)完成了同样的事情 - 您甚至可以混合使用静态和动态类型的代码. (4认同)
  • 作为一个Lisp可能是其中的一部分,但Rich Hickey经常推动动态打字,因为它拥有很多优点,即使他没有选择让Clojure成为Lisp,也可能做出这个决定. (2认同)

ffr*_*end 7

Clojure是一个具有宏系统和代码作为数据哲学的Lisp ,这种哲学很难与静态类型系统相处.例如,这种列表的类型是什么:

(defn square [x] (* x x))
Run Code Online (Sandbox Code Playgroud)

不过,如果你需要静态类型,Clojure允许它带有类型提示.

  • 它将是一个'a - >'b`,``a`和`'b`进一步受到`(*)`运算符类型的限制. (18认同)
  • @Tobu:我不是询问结果类型,而是关于表达式的类型作为符号列表.即什么是`(list'sten''square ['x]'(*xx))`的类型 (6认同)
  • 顺便说一下:据我所知,类型提示是一种提高性能的方法,而不是以任何方式保证类型安全. (3认同)
  • @Tobu:在`(defn square [x](*xx))`被评估之后,这将是'square`类型,但我不认为那是朋友的观点.正如我所理解的那样,他的观点是,如果你将函数定义作为数据*传递给*,那将是什么类型. (2认同)

Art*_*ldt 5

因为那是世界/市场所需要的。建造已经建造的东西毫无意义。

我听说JVM已经具有静态类型的语言;)

  • 我希望你是说斯卡拉。 (16认同)
  • Scala过于复杂,有很多像C ++这样的极端情况。 (7认同)
  • @HamishGrubijan有趣,我发现Scala比Clojure更简单。 (3认同)
  • 科特林。现在是2018年 (3认同)