【问题标题】:setq: wrong type argument: listp 1setq:错误类型参数:listp 1
【发布时间】: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


【解决方案1】:

你的问题出在:

               (append (cons diff (1+ (car (cdr (assq diff diffs)))))
                       (assq-delete-all diff diffs)))

上面的cons 创建了一个(DIFF . N) 形式的单元格,这不是一个正确的列表。它是一对两个元素,而不是两个元素的列表。包含两个元素的列表将采用 (DIFF N) 的形式,它是 (DIFF . (N . nil)) 的简写。

我没有尝试了解您的总体目标是什么,但是有两种方法可以解决您的问题:替换

(append (cons diff FOO)
        ...)

(append (list diff FOO)
        ...)

或与

(cons (cons diff FOO)
      ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2021-10-24
    • 2020-10-17
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多