返回

文章详情

是什么使 Lisp 难以阅读?

Hacker News2026年9月28日 15:12

或者,在你的下一个语言中应该放置括号的位置。Lisp 编程语言家族以其大量的括号语法而臭名昭著。许多人,包括我自己,发现这种语法比 Python、Java 或 C 等语言的符号更难读取。Lisp 的可读性问题被认为是相当重要的,以至于有多次尝试创建新的符号来帮助 Lisp 的采用。然而,尽管有这些尝试,以及 Lisp 几乎和计算机科学一样古老,我仍然没有找到一个令人满意的解释,说明为什么 Lisp 被认为不够可读。Lisp 开发者常常争辩说,这只是一个熟悉度问题;Lisp 语法不如 C 语法常见,因此程序员对其阅读不够习惯。声明到习惯使用 Lisp 后,人们甚至不会注意到括号, allegedly。我相信这不仅仅是这样,通过更深入的研究,我们可能会获得关于如何设计令人愉快语法的见解。在本文中,我将解释我为什么认为 Lisp 的语法——尤其是括号的放置——需要更多的解析努力,这受到认知科学一些观察的启发。对于那些可能不熟悉 Lisp 语法的人来说,在一个典型的 Lisp 程序中,每个语句、表达式和函数调用都是用相同的语法编写的: (operation arguments...)。比较 Lisp (Scheme) 中递归阶乘函数的定义和 JavaScript 中的等效函数: (define (factorial n) (if (= n 1) n (* n (factorial (- n 1))))) 在 Scheme 中的 Lisp 风格阶乘定义。 function factorial(n) { if (n == 1) { return n; } else { return (n * factorial(n - 1)); } } 在 JavaScript 中的 C 风格阶乘定义。你会注意到 Lisp 示例缺乏中缀符号 ( n == 1 )、关键字 ( else ) 和不同类型的分隔符 ( {} )。这些差异往往在可读性讨论中引起最多关注。尽管我同意这些符号在可读性上有一定影响,但我怀疑它们的重要性被夸大了;除了熟悉度,我并没有发现 (- n 1) 明显劣于 (n - 1)。C 风格语言在这些不同形式的符号中存在的语法变异确实可能显著影响可读性。我打算在不同的帖子中探讨这个方面。在这篇文章中,我将主要关注比较常规函数应用时所剩下的差异,也就是说,为什么 operation(arguments ...) 看起来比 (operation arguments...) 更加愉悦。硬件加速在人类感知中的作用。要明白括号的放置为何重要,我们必须考虑到人类感知并非对所有输入一视同仁。为了体验这一点,试着尽可能快地大声说出下面单词的显示颜色:你会发现第二行——文本颜色与书写颜色不匹配——阅读的速度较慢。这就是著名的 Stroop 效应。已经发现了几个这样的效应,可能会妨碍或帮助视觉处理任务。我喜欢将这些效应视为嵌入我们感知机能中的一种硬件加速。1 就像编程一样,我们应该努力充分利用我们硬件的能力。例如,考虑下面两个相同数据集的可视化。我在数据中隐藏了两个离群值。下面的一个可视化使用了一种“硬件加速”的技巧,以便更容易找到离群值:你无疑会发现第二个可视化中的离群值比第一个可视化更快看到。事实上,对于简单的数据展示,搜索任务大约需要 𝑂(𝑛),而硬件加速的搜索在 𝑂(1) 中奇迹般地终止。好的设计运用这个效应来使他们的界面通过例如形状不同的图标和高亮颜色变得更容易搜索。我选择了 Stroop 效应和突显效应来说明人类的硬件加速,因为这些效应是明显且容易重复的。不幸的是,认知科学中的发现并非所有都是明显或明确的。应用这些效应需要一定的创造力和主观性。因此,我并不打算建议可读性完全由要讨论的认知效应客观上解释。2 相反,我提及这些效应是为了作为设计原则,并支持我自己的观察。参数邻近性。回到符号,语法的主要目标是指示标记应如何分组。格式塔心理学描述了我们倾向于感知分组的几种方式。其中一个最具体的例子是格式塔的邻近性法则。这条“法则”是对彼此接近的物体被认为是相关的观察。例如,下面再次是相同数据的两个展示。找一种方法将数据点分成两组:第二个可视化显然暗示着数据...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

☕请我喝杯咖啡