【发布时间】:2017-08-23 05:43:28
【问题描述】:
我和我的小组正在尝试创建一个缺点列表。它可能看起来像这样
((2 100032) (4 32413) (6 2131251) ... (232 12))
不幸的是,我们不断收到“错误的类型参数”。这可能很简单,但我也想知道我们是否在使用 cons 时做错了什么。
任何回复表示赞赏:
(defun find-diffs ()
(let ((diffs (list))
(index 0)
(previous 0))
(while (< index (length first-ten-million-primes))
; Add the difference to the list of diffs.
(setq diff (- (aref first-ten-million-primes index) previous))
; We only want to bother recording it if the index is above zero and
; the difference is odd.
(if (and (> index 0) (evenp diff))
(setq diffs
; Can we find this one in our list of diffs?
(if (cdr (assoc diff diffs))
; Yes
; ERROR happens when we call this statement
(setq diffs
(append (cons diff (1+ (car (cdr (assq diff diffs)))))
(assq-delete-all diff diffs)))
; No
(setq diffs (plist-put diffs diff 1)))))
; Set previous value to this one.
(setq previous (aref first-ten-million-primes index))
; Increment the index.
(setq index (1+ index)))
diffs)
注释掉 (setq diffs) 会修复它,但我认为我们设置变量的方式没有任何问题。
谢谢!
回溯是巨大的,所以我只会发布第一部分。我的团队仍然对出了什么问题感到困惑,因此感谢任何回复。
调试器回溯:
Debugger entered--Lisp error: (wrong-type-argument listp 1)
append((2 . 1) nil)
(setq diffs (append (cons diff 1) diffs))
(if (cdr (assoc diff diffs)) (setq diffs (append (cons diff (1+ (car (cdr (assq diff diffs)))))
【问题讨论】:
-
您不必在
if中重复(setq diffs部分。这种方式表示“不”,即你得到(setq diffs (setq diffs (plist-put diffs diff1)))。 -
请修正缩进和括号放置。
-
请将
debug-on-error设置为t并报告*Backtrace*缓冲区的内容。 -
好的,我去掉了单行括号,并打印了回溯的开头。我仍在寻找任何帮助,不胜感激!谢谢!
标签: elisp