我认为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则会简单得多、简洁得多!