SBCL 中的生物医学信息学原理:这有啥问题?

Posted

技术标签:

【中文标题】SBCL 中的生物医学信息学原理:这有啥问题?【英文标题】: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 已经死了,所以我不能问他。

【问题讨论】:

确实是一个错误,但是在后面几页的代码(第25-27页)的以下版本中已修复(books.google.fr/books/about/…) 【参考方案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 的关闭。但是,在那之后你还有一个。这就是导致问题的原因。

【讨论】:

以上是关于SBCL 中的生物医学信息学原理:这有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

生物信息学书籍分享

LaTeX 排版生物信息学 Perl 语言入门

2016年考研调剂----生物信息

医学方VIP科研沙龙正式启动!——R语言与GEO/TCGA数据挖掘测序分析

从事生物信息学数据分析5周年的一些思考和总结(附赠清华北大演讲PPT)

美国材料工程硕士专业怎么样?斯坦福大学计算机科学系学啥?