【问题标题】:Principles of Biomedical Informatics in SBCL: what's wrong with this let?SBCL 中的生物医学信息学原理:这有什么问题?
【发布时间】:2018-11-15 15:35:23
【问题描述】:

这里的 Lisp 菜鸟,倾向于相信我肯定误解了某些东西,因为这是第二版相当长的书的第 35 页的问题。我一直在阅读let binding,所以让我通过引用他来确保作者*的意图是明确的:

在以下代码中,符号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 已经死了,所以我不能问他。

【问题讨论】:

标签: syntax-error lisp common-lisp let


【解决方案1】:

如果出现此类错误,重新缩进代码通常很有用。通常可以在编辑器中使用键盘命令来完成。

但 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))))

这样可以更容易地看出ifpos 变量绑定处于相同的缩进级别。 这不可能!

要使用 Lisp 格式化您的代码,您只需要:

(let ((*print-right-margin* 60))
  (pprint '

; here goes your code

))

Lisp 会帮你格式化...

【讨论】:

    【解决方案2】:

    正如我之前的回答者所说,一个简单的括号问题:

    ;; 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
    

    【讨论】:

    • 抱歉,现已更正。 (我在终端更正但我猜在编辑器中复制了错误的东西)。顺便说一句,我也想买这本书。 :)
    • 谢谢,运行。我确实喜欢这本书,尤其是因为它的内容与我的培训和工作相关。我有点失望,这个错误是通过两个版本的编辑造成的,但我觉得对括号的健康尊重是 lisp 程序员的基本属性,并且怀疑别人的代码,甚至是书作者的,是很好。
    【解决方案3】:

    您似乎遇到了不平衡的括号问题。一种查看方法是查看 NIL 之后的右括号。这将关闭 IF 语句。在那之后,还有两个关闭 LET 和 DEFUN 的关闭。但是,在那之后你还有一个。这就是导致问题的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2011-04-30
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多