我目前正在学习 Lisp,我认为我已经掌握了基础知识(我正在使用 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
的东西,也许结合一些 lambda
s,我完全迷失了,发现自己数分钟(字面意思)的括号。编写时也是如此,我迷失在括号的数量中,而且我认为我什至还没有看到“复杂”的 Lisp 代码。
随着时间的推移,这会变得更好吗?也就是说,你习惯了吗?或者,是否有关于如何阅读和编写 Lisp 代码以使自己更轻松的技巧?更有经验的 Lisp 程序员如何做到这一点?任何提示?
最佳答案
您需要正确缩进它。你的例子不是。
(defun foo ()
(let ((x 23)
(y 42))
(+ x y)))
这里:
(defun foo ()
(let ((x 23)
(y 42))
(+ x y)))
最后一个表达式需要右移。然后你可以看到它在LET里面。
Lisp 有一些结构模式。不是很多。一旦你学习和训练了这些,阅读 Lisp 就相对容易了。比学习更多人阅读的中文要轻松得多。
一些模式:
(symbol ...)
符号给 anchor
((a 10) (b 20))
绑定(bind)列表,例如在
LET
中(with-foo (foo :option1 1 :option2 2)
(body))
WITH-OPEN-FILE
之类的宏。然后是复杂的函数 arglist 本身。位置参数、可选参数、关键字参数。
&rest
和 &aux
。还有一些,但不是太多。一旦你学会了基本的宏和特殊形式的模式,代码阅读就会变得容易得多。
如何改善?阅读代码。火车。这并不难。有点像骑自行车。第一天似乎很困难,然后它是自动化的。
写作。
要编写代码,您需要一个可以缩进的编辑器。大多数只能缩进行,但不能格式化整个表达式。因此,您需要进行格式化。有一些基本规则。 Lisp 有一个 pretty-print ,可以格式化。但这在编辑器中通常不可用,并且它不知道诸如评论之类的事情。
当我编写一段 Lisp 代码时,我通常也会花一些时间来正确布局代码。
关于lisp - 如何有效地读写 Lisp 代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23926820/