Lisp noob在这里,倾向于相信我肯定误解了什么,因为这是一本相当长的第二版书的第35页的问题。我一直在阅读关于let绑定的文章,所以让我引用他的话来确保作者的*意图是明确的:
在以下代码中,符号
pos用作临时存储区或变量,其值为position函数表达式的结果。最后,我们将如何积累结果?递归调用应该给我们一个剩余位置的列表,所以第一个找到的位置应该放在前面。我们已经有一个函数可以做到这一点,即cons函数
代码如下:
(defun all-pos (item seq start)
(let ((pos (position item seq :start start))
(if pos
(cons pos
(all-pos item seq (+ 1 pos)))
nil))))这就是错误:
Ch1_Notes.lisp:27:5:
error:
The LET binding spec (IF POS
(CONS POS (ALL-POS ITEM SEQ (+ 1 POS)))
NIL) is malformed.
Compilation failed.这是不是不言而喻的错误?有没有一些前面的代码我也应该包括在内?
*作者Ira J. Kalet已经死了,所以我不能问他。
发布于 2018-06-07 05:52:46
正如我前面的回答者所提到的,一个简单的括号问题:
;; correct version:
(defun all-pos (item seq start)
(let ((pos (position item seq :start start)))
(if pos
(cons pos
(all-pos item seq (+ 1 pos)))
nil)))
;; e.g.
(all-pos '3 '(1 2 3 4 3 5 4) 0)
;; returns (2 4) - correctly发布于 2018-06-06 16:31:02
通常,如果出现这样的错误,重新缩进代码是很有用的。通常可以在编辑器中使用key-command来执行此操作。
但Lisp也提供了内置的代码格式化功能,称为漂亮打印
CL-USER > (let ((*print-right-margin* 60))
(pprint '
; your code follows:
(defun all-pos (item seq start)
(let ((pos (position item seq :start start))
(if pos
(cons pos
(all-pos item seq (+ 1 pos)))
nil))))
))输出如下所示:
(DEFUN ALL-POS (ITEM SEQ START)
(LET ((POS (POSITION ITEM SEQ :START START))
(IF POS (CONS POS (ALL-POS ITEM SEQ (+ 1 POS)))
NIL))))这使得更容易看到绑定与pos变量绑定处于相同的缩进级别。这不可能是对的!
要用Lisp格式化代码,您只需要:
(let ((*print-right-margin* 60))
(pprint '
; here goes your code
))Lisp会为你格式化它。
发布于 2018-06-06 13:41:36
你似乎有不平衡的偏执问题在继续。要了解这一点,可以查看NIL后面的闭括号。这将结束IF语句。在那之后,还有两个关闭的,这将关闭LET和DEFUN。然而,在那之后,你还有一个。这就是导致问题的原因。
https://stackoverflow.com/questions/50712101
复制相似问题