clojure - LISP 的魅力是什么?

标签 clojure lisp

<分区>

正如标题所说,LISP 的魅力何在?

我见过它升到高天然后又升到高处,然后放在一个基座上。我看到这里的人,我认识的实际程序员,大学教授都这样做过一种语言优于另一种语言。

我试着学习它,我看了一些教程,在 lisp 和 clojure 的“在 y 分钟内学习 x”页面上(因为据我所知,它是在 jvm 上运行的 lisp,并投入了更多的 FP),我了解语法以及如何在其中做事。在过去的几个月里,我多次回头看关于它的教程,但每次语法都让我想找一个高中生,并因为他的代码困惑而对他大吼大叫,因为看起来像 C 风格的 if-condition 变得疯狂所有嵌套的括号和简单的事情似乎变成了一件苦差事。 lisp 似乎用几行代码就能完成的工作,其他 FP 语言(如 Haskell 或 F#)甚至非 FP 语言(如 C#)刚刚发现 map 和 filter 似乎可以用更少的表达方式完成。

我看错了吗? 是否需要点击一下? 我只找到蹩脚的资源吗?(如果是,请给我一些学习 lisp/clojure 的好资源,最好有一些练习)

lisp 的吸引力到底是什么?在这里对上帝诚实的问题。

提前致谢!

最佳答案

当我在 2009 年第一次听说 Clojure 时,我写了一篇题为“Clojure:优雅在哪里?”的博文。我当时是 Python 的优雅风格(“可执行伪代码”)的忠实粉丝,而 Lisp 则深感陌生。不过,我继续与 Clojure 搏斗,因为“列表处理”似乎是我工具集中的一个重要编程范例。有一段时间我大量使用 JavaScript、Ruby 和 C#,并在空闲时间玩弄 ClojureScript。当我终于在 2017 年回到 Python 进行一些数据处理时,我发现我正在编写很多受 Clojure 启发的函数来提供帮助。最后,我刚开始用 Clojure 编写数据处理,我不会回头。因此,虽然您提出了一个可能无法回答的问题,但也许我可以阐明是什么导致了您的观点与 Lisp 社区的热情之间存在差异。

首先,虽然 Lisp 与 C、Python 和 Ruby 的丰富语法非常不同,但事实证明 Lisp 语法的轻便性是一种巨大的福祉。它减轻了很多认知负担。多种语法错误完全消失。但到目前为止,我从 Lisp 一致的语法中得到的最大好处是它可以很容易地转换。在使用其他语言工作时,我最怀念的是无需修改代码的实际文本即可重新排列 AST 的能力。使用 Lisp 比我体验过的任何其他语言都流畅得多。

其次,控制代码的计算方式很简单。关于宏的荣耀已经写了很多,但对我来说,最基本的超能力是你可以阻止代码被评估,以特定的顺序评估它,或者多次评估它,所有这些都没有将代码包装在一个功能。也就是说,我不怎么写宏,但当我写时,函数是一个糟糕的替代品。

第三,大多数语言对实时编码的支持不是很好。我通常不使用 REPL 本身,而是依靠编辑器集成来评估代码。 Clojure 的工具非常好,我可以用几十个命名空间塑造整个代码库,而无需重新启动 JVM 进程或将单个大代码文件拆分为单独的模块。

第四,Lisp 代码的组合非常好。在一切都是返回值的表达式和建立在相对较小的数据结构集上的语言之间,您可以非常自由地混合和匹配语言结构。这为其他语言设置隔离墙开辟了很多可能性。

所有这些的共同因素是该语言会尽最大努力让开你。当我还是一名新手程序员时,C 和 Python 以及 Ruby 的复杂语法是编程的辅助工具。它让我走在正直和狭窄的道路上。语言结构就像导航的地标。没有这些地标,Lisp 感觉就像一个陌生的国家。但是当你对 Lisp 越来越熟悉时,其他语言会感觉人为地限制并且难以在其中四处走动,就像在你可以飞行的时候在路上开车一样。 Lisp 非常自由,但根据我的个人经验,我可以告诉你,就像飞行一样,在它的陌生感从恐惧变成自由之前需要练习。

关于clojure - LISP 的魅力是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50229618/

相关文章:

regex - 在 emacs 标题行中设置正则表达式

haskell中与 "imperative"算法相关的性能

lisp - 使用 html5-parser 和 xmls Common Lisp 浏览网页

java - 在java程序中嵌入swank-clojure

clojure - 带有 compojure-api 的可选查询参数(具有默认值)

arrays - 在 Clojure 中从类型特定数组创建通用数组

loops - Lisp:在循环中收集多个列表

list - 使用 LISP 遍历列表中的每个项目

clojure - 分层 leiningen 项目有优势吗?

jar - Clojure:如何使 leiningen 构建可重现?