我认为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]]
最终,我们想要编写的代码能够让计算机按照我们的期望行事。我认为,当你在编写代码时立即看到代码执行结果,这比在同一文件中使用两种语言(一种用于与编译器进行对话的类型签名,另一种用于计算机执行函数调用)来验证行为要更好。更少的噪音,更少的认知负荷,将更多的注意力集中在问题上,更快、更有用的反馈 = 优秀的首选语言,我认为如此 :)
顺便说一句,我可以继续阐述使用映射和泛型函数与类和方法的数据处理,但我现在没有时间。在Clojure中,这更加简单和简洁!