我认为Clojure作为第一门语言非常出色。这很容易说,但很难证实——Clojure并非我的第一门语言,我学习Clojure之前先学习了Java。
我认为编程总体上学习曲线很陡峭,因为将文本文件中的代码映射到执行程序时的行为是非常复杂的。作为一名软件开发人员,您需要在心中有一个可以执行代码的虚拟机。从编写代码到看到执行结果之间的反馈循环越长,您的心理虚拟机的负担就越大,进步就越难。其他主流编程语言试图通过类型系统和IDE来解决此问题,但我认为它们做得不够好,因为
- 类型系统引入了复杂性,并要求您始终编写关于类型而不是关于您问题的代码;
- 类型系统是基本的,它们只检查可以用类型表示的东西,因此它们可以帮助您知道如何不组合事情(例如,它们可以阻止您将字符串与数字相加),但不能帮助您知道当代码执行时的行为(例如,它们不能阻止您在您想从列表开头添加值时将其添加到末尾)。
类型系统变得越来越复杂,以帮助您编写正确的代码。您可以看看Idris如何促进类型驱动开发,帮助编写矩阵转置:[https://youtu.be/mOtKD7ml0NU?t=1607](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中,这要简单得多、简洁得多!