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))))
这样可以更容易地看出if
与pos
变量绑定处于相同的缩进级别。 这不可能!
要使用 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 中的生物医学信息学原理:这有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
医学方VIP科研沙龙正式启动!——R语言与GEO/TCGA数据挖掘测序分析