我目前正在学习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
东西,也许结合几个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 ...)
符号给出锚点
((a 10) (b 20))
绑定列表,例如在 LET
(with-foo (foo :option1 1 :option2 2) (body))
宏喜欢WITH-OPEN-FILE
.
然后是复杂的函数arglist本身.位置参数,可选参数,关键字参数.&rest
和&aux
.
还有一些,但不是太多.一旦学会了基本的宏和特殊表单模式,代码阅读就变得容易了.
如何改善?阅读代码.培养.这并不难.有点像骑自行车.第一天似乎很难,然后它是自动化的.
写作.
要编写代码,您需要一个可以缩进的编辑器.大多数只能缩进行,但不能格式化整个表达式.因此,您需要进行格式化.有一些基本规则.Lisp有一台漂亮的打印机,可以格式化.但是这通常在编辑器中不可用,并且它不知道评论之类的东西.
当我编写一段Lisp代码时,我通常也花费一些时间来正确布局代码.
线太长了?
晃来晃去的括号?
结构正确吗?
路线?
足够的视觉线索?
命名?
评论?
文档?