首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SBCL的生物医学信息学原理:这篇文章有什么问题?

SBCL的生物医学信息学原理:这篇文章有什么问题?
EN

Stack Overflow用户
提问于 2018-06-06 12:05:25
回答 3查看 107关注 0票数 3

Lisp noob在这里,倾向于相信我肯定误解了什么,因为这是一本相当长的第二版书的第35页的问题。我一直在阅读关于let绑定的文章,所以让我引用他的话来确保作者的*意图是明确的:

在以下代码中,符号pos用作临时存储区或变量,其值为position函数表达式的结果。最后,我们将如何积累结果?递归调用应该给我们一个剩余位置的列表,所以第一个找到的位置应该放在前面。我们已经有一个函数可以做到这一点,即cons函数

代码如下:

代码语言:javascript
复制
(defun all-pos (item seq start)
  (let ((pos (position item seq :start start))
    (if pos
        (cons pos
          (all-pos item seq (+ 1 pos)))
    nil))))

这就是错误:

代码语言:javascript
复制
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已经死了,所以我不能问他。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-07 05:52:46

正如我前面的回答者所提到的,一个简单的括号问题:

代码语言:javascript
复制
;; 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
票数 1
EN

Stack Overflow用户

发布于 2018-06-06 16:31:02

通常,如果出现这样的错误,重新缩进代码是很有用的。通常可以在编辑器中使用key-command来执行此操作。

但Lisp也提供了内置的代码格式化功能,称为漂亮打印

代码语言:javascript
复制
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))))

))

输出如下所示:

代码语言:javascript
复制
(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格式化代码,您只需要:

代码语言:javascript
复制
(let ((*print-right-margin* 60))
  (pprint '

; here goes your code

))

Lisp会为你格式化它。

票数 3
EN

Stack Overflow用户

发布于 2018-06-06 13:41:36

你似乎有不平衡的偏执问题在继续。要了解这一点,可以查看NIL后面的闭括号。这将结束IF语句。在那之后,还有两个关闭的,这将关闭LET和DEFUN。然而,在那之后,你还有一个。这就是导致问题的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50712101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档