我认为Clojure作为一门入门语言非常出色。这很容易说,但要支持这种说法却很困难 —— Clojure不是我的第一门语言,我在学习Clojure之前就已经掌握了Java。
我认为编程在总体上有一个相当陡峭的学习曲线,因为从文本文件中的代码到程序执行时的行为之间存在一个非常复杂的映射。作为软件开发者,你需要在大脑中有一个虚拟机,可以执行你编写的代码。从编写代码到看到其执行结果的反馈循环越长,你的心理虚拟机的负担就越大,进步就越难。其他主流编程语言试图通过类型系统和IDE来解决这个问题的,但我认为它们在这方面的表现还不够好,因为
- 类型系统引入了复杂性,并要求你始终编写与类型有关的代码而不是与你的问题有关的代码;
- 类型系统很简单,它们只检查可以用类型表达的内容,因此它们只能帮助防止某些不适当的组合(例如,它们可以防止你将字符串与数字相加),但不能帮助你的代码在执行时的行为(例如,它们不能防止你在期望在列表开头添加值时却在末尾进行添加)。
类型系统变得越复杂,就越有助于你编写正确的代码。你可以看看Idris如何促进类型驱动型开发,这有助于编写矩阵转置:https://youtu.be/mOtKD7ml0NU?t=1607
以下是一个Idris中矩阵转置的类型签名,没有任何实现
transpose : Vect n (Vect m a) -> Vect m (Vect n a)
我认为语言在你想转置矩阵时能帮助你填补空白是件好事,但你有没有想过允许实际实现比这个签名更短的语言呢?
(defn transpose [xs] (apply mapv vector xs))
如果你可以立即尝试这段特定的代码并看到它的行为会怎样呢?
(transpose [[1 2] [3 4]])
=> [[1 3] [2 4]]
最终,我们想要编写让计算机表现出我们期望行为的代码。我认为立即看到你编写的代码执行结果是一个比在同一文件中用两种语言编写代码更好的验证行为的方法,其中一种基本语言是用于编译器与你进行对话(类型签名),另一种是用于计算机执行(函数调用)。噪音更少,认知负荷更小,更多关注于问题,更快、更有用的反馈 = 精彩的第一语言,我想:)
顺便说一句,我可以继续关于使用maps和泛型函数与类和方法的数据处理,但现在我没有时间。在Clojure中更加简单和简洁!