【发布时间】:2014-07-18 13:46:30
【问题描述】:
我目前正在学习 Lisp,并且我认为我已经掌握了基础知识(我正在使用优秀的书 Land of Lisp,到目前为止,我已经阅读并完成了大约四分之一)。
我尝试根据我已经学到的知识创建自己的 Lisp 程序。不知何故,它起作用了。但这只是以某种方式。到目前为止,我主要使用 C 语法的语言进行开发,例如 C# 和 JavaScript(请注意,我非常清楚 JavaScript 不是基于 C 的语言)。
尽管如此,我习惯用 C 语法“思考”,当我用 C# 或 JavaScript 编写代码时,我可以用一种非常直接的方式写下来。相比之下,在编写 Lisp 代码时,我很难将所有这些括号括起来。
如果我有一个简单的语句,例如
(setf x (+ 2 3))
我总是发现自己试图从左到右阅读它,发现它不起作用,然后搜索最里面的一对括号,然后从内到外进行计算。对于这个简单的表达式,它的工作速度非常快。
但是,如果我有更复杂的代码(尽管它根本不复杂),比如使用let 的函数,那么(至少对我来说)找到最里面的一对括号会更难:
(defun foo ()
(let ((x 23)
(y 42))
(+ x y)))
这里已经有点难以看出什么之后发生了什么,以及什么嵌套到什么。现在添加一些cond 的东西,也许再加上一些lambdas,我完全迷失了,发现自己数着括号数分钟(字面意思)。
写的时候也是这样,我迷失在括号的数量中,我什至还没有看到“复杂”的 Lisp 代码。
随着时间的推移,这会变得更好吗?也就是说,你习惯了吗?或者,有没有一些技巧可以让你更轻松地阅读和编写 Lisp 代码?更有经验的 Lisp 程序员如何做到这一点?有什么提示吗?
【问题讨论】:
-
使用自动缩进代码的编辑器,例如 Emacs,使结构变得可见。例如。在你的最后一个例子中,
(+ x y)应该缩进两个空格,所以你可以看到它是let的主体。 -
嗯,好的。这有助于写作,但阅读呢?例如,当我阅读 StackOverflow 上的代码时 ;-)?
-
一旦代码正确缩进,你几乎可以忽略括号。随着时间的推移,你会习惯像
defun和let这样的常见习语。 -
刚刚为 Sublime 安装了lispindent,事实上,自动缩进真的很有帮助。惊人的 :-)。感谢您的提示!
-
你是对的。 Javascript、c#、java、perl、c++ 和 c++ 都是 Algol 方言。由于您了解 Algol 的语法,因此很容易阅读。 Common lisp 和 Scheme 都是 Lisp 方言,如果你知道其中之一,就很容易阅读。
标签: lisp common-lisp readability code-readability