【发布时间】:2011-07-03 21:01:37
【问题描述】:
我非常喜欢的一件事是阅读不同的编程语言。目前,我正在学习 Scala,但这并不意味着我对 Groovy、Clojure、Python 和其他许多东西不感兴趣。所有这些语言都具有独特的外观和感觉以及一些特征。在 Clojure 的情况下,我不理解这些设计决策之一。据我所知,Clojure 非常强调它的函数范式,并且几乎迫使您尽可能使用不可变的“变量”。那么,如果一半的值是不可变的,为什么语言是动态类型的?
Clojure 网站说:
首先,Clojure 是动态的。这意味着 Clojure 程序不仅仅是您编译和运行的东西,而是您可以与之交互的东西。
嗯,这听起来很奇怪。如果一个程序被编译了,你就不能再改变它了。当然,您可以与它“交互”,这就是 UI 的用途,但该网站当然并不意味着整洁的“动态”GUI。
Clojure 如何从动态类型中受益
我指的是 Clojure 的特殊情况,而不是动态类型的一般优势。
动态类型系统如何帮助改进函数式编程
再次,我知道不泄漏“int a;”的乐趣到处都是源代码,但类型推断可以减轻很多痛苦。因此,我只想知道动态类型如何支持函数式语言的概念。
【问题讨论】:
-
请记住,Clojure 是一个 Lisp,而且 Lisp 从那时起就一直是动态类型的,只有极少数例外(例如 Typed Racket) - 无论如何都没有引起太多关注。
-
变量值的不变性和变量的动态类型化是两个非常不同的概念...不确定我是否明白您的第一段.
-
我使用 Python 和 Javascript 以及 Pascal、Java、C++ 和 C# 进行了编程。我当然知道静态类型和动态类型之间的区别。据了解,我没有任何偏好,对我来说只有语言本身很重要。因此,我想知道为什么 clojure 的设计者选择动态而不是静态。他们网站上的奇怪声明让我感到困惑,现在我想知道动态类型对 clojure(不是一般情况)和一般函数式编程范式的优势。
-
我认为您误读了网站上的那句话。它说“Clojure 是动态的”,而不是说 Clojure 是动态类型的(尽管它是动态类型的)。那是不同的侧重点。它说 Clojure 中的大多数东西都是具体化的,可以在运行时更改(例如命名空间)。这是一种务实的选择,如果您添加一些类型限制(参见例如类型提示),没有人会反对。 Rich Hickey 指出,他希望类型系统/限制是可插入的,即与其他语言设计选择正交。这对我来说听起来很明智。
-
你可以在 Lisp 中插入你自己的类型系统,这就是 clojure.typed 和 TypedRacket 的样子。我正在尝试研究如何使用类型推断将单元测试,即 (=(myadd a b) (+ a b)) 转换为 clojure.typed 的类型注释。 Lisp 是如此动态,以至于不可能拥有适用于所有代码的类型,但宏在编译时运行,允许进行静态分析。 Hickey 在 Haskell 中给出了示例,如果你从 (Maybe -> a) 或 (a -> Maybe a) 转换函数,你必须编写 fromJust Just 大部分代码(尽管编译器会告诉你在哪里,它可以是自动)。
标签: dynamic functional-programming clojure language-design paradigms