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