我认为 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 中这要简单和紧凑得多!