setq:错误的类型参数:listp 1
setq: wrong type argument: listp 1
我和我的小组正在尝试创建一个缺点列表列表。它可能看起来像这样
((2 100032) (4 32413) (6 2131251) ... (232 12))
不幸的是,我们不断收到 "wrong type argument"。这可能很简单,但我也想知道我们是否在 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) 将修复它,但我没有发现我们设置变量的方式有任何问题。
谢谢!
回溯非常庞大,所以我只会 post 第一部分。我的团队仍然对问题所在感到困惑,因此欢迎任何回复。
调试器回溯:
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)))))
您的问题在:
(append (cons diff (1+ (car (cdr (assq diff diffs)))))
(assq-delete-all diff diffs)))
上面的 cons
创建了一个格式为 (DIFF . N)
的单元格,这不是正确的列表。它是一对两个元素而不是两个元素的列表。两个元素的列表将具有 (DIFF N)
的形式,它是 shorthand for (DIFF . (N . nil))
.
我没有尝试了解您的总体目标是什么,但有两种方法可以解决您的问题:替换
(append (cons diff FOO)
...)
和
(append (list diff FOO)
...)
或与
(cons (cons diff FOO)
...)
我和我的小组正在尝试创建一个缺点列表列表。它可能看起来像这样
((2 100032) (4 32413) (6 2131251) ... (232 12))
不幸的是,我们不断收到 "wrong type argument"。这可能很简单,但我也想知道我们是否在 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) 将修复它,但我没有发现我们设置变量的方式有任何问题。
谢谢!
回溯非常庞大,所以我只会 post 第一部分。我的团队仍然对问题所在感到困惑,因此欢迎任何回复。
调试器回溯:
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)))))
您的问题在:
(append (cons diff (1+ (car (cdr (assq diff diffs)))))
(assq-delete-all diff diffs)))
上面的 cons
创建了一个格式为 (DIFF . N)
的单元格,这不是正确的列表。它是一对两个元素而不是两个元素的列表。两个元素的列表将具有 (DIFF N)
的形式,它是 shorthand for (DIFF . (N . nil))
.
我没有尝试了解您的总体目标是什么,但有两种方法可以解决您的问题:替换
(append (cons diff FOO)
...)
和
(append (list diff FOO)
...)
或与
(cons (cons diff FOO)
...)