我认为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可以做得更简单、更简洁!