我目前正在学习 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/

    10-11 22:45
    查看更多