Что означает ошибка elisp "Неверный аргумент типа: sequencep, t"?

Я пытаюсь скомпилировать cc-mode 5.31.3 с помощью emacs 23.1.1 следующим образом:

$ emacs -batch --no-site-file -q -f batch-byte-compile *.el

Но два файла не компилируются (в дополнение к многочисленным предупреждениям):

В c-init-language-vars-for:
cc-mode.el:168:10: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el: 168: 10: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:162:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:162:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:163:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:163:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:164:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:164:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:165:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:165:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:166:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:166:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:167:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:167:53: Предупреждение: функция `mapcan'из пакета cl вызывается во время выполнения
cc-mode.el:562:4: ошибка: неверный аргумент типа: sequencep, t

В c-make-styles-buffer-local:
cc-styles.el:634:6: Предупреждение: `mapcar'требует эффекта; используйте `mapc'или`dolist'
    вместо
cc-styles.el:636:9: ошибка: неверный аргумент типа: sequencep, t

Что означают эти две ошибки и как я могу их исправить?

Строка 562 файла cc-mode.el выглядит так:

  (c-update-modeline)

куда c-update-modeline это функция, определенная в cc-cmds.el это не требует аргументов. Строка 636 из cc-styles.el является частью этой функции:

(defun c-make-styles-buffer-local (&optional this-buf-only-p)
  "Make all CC Mode style variables buffer local.
If `this-buf-only-p' is non-nil, the style variables will be made
buffer local only in the current buffer.  Otherwise they'll be made
permanently buffer local in any buffer that changes their values.

The buffer localness of the style variables are normally controlled
with the variable `c-style-variables-are-local-p', so there's seldom
any reason to call this function directly."

  ;; style variables
  (let ((func (if this-buf-only-p
          'make-local-variable
        'make-variable-buffer-local))
    (varsyms (cons 'c-indentation-style (copy-alist c-style-variables))))
    (delq 'c-special-indent-hook varsyms)
    (mapcar func varsyms)
    ;; Hooks must be handled specially
    (if this-buf-only-p    ;;;;;;;;; LINE 636 ;;;;;;;;;;;;;;;;;;
        (make-local-hook 'c-special-indent-hook)
      (make-variable-buffer-local 'c-special-indent-hook)
      (setq c-style-variables-are-local-p t))
    ))

Эти сообщения об ошибках не имеют смысла. Может ли это повлиять на тот факт, что у меня уже установлена ​​другая версия cc-mode с emacs? Как вы перекомпилируете cc-mode?

2 ответа

Решение

Я все еще не понимаю эти сообщения об ошибках, но ответ таков: cc-mode 5.31.3 довольно старый и не может быть скомпилирован с emacs 23 (я пытался скомпилировать cc-mode ради любопытства). emacs 23 поставляется с обновленной версией cc-mode, версия 5.31.7 - запустите интерактивную команду c-version чтобы получить версию cc-mode, которую вы используете.

Для тех, кто хочет перекомпилировать cc-mode (а не использовать скомпилированный cc-mode.elc который поставляется с emacs), вы должны скачать последнюю версию с анонимного CVS

Смысл ошибки в том, что функция, которая ожидает sequence получено t вместо; и сообщение говорит вам, что t не удовлетворяет предикату sequencep,

Например, попробуйте оценить (length t) и вы увидите в *Backtrace* (при условии, что вы установили debug-on-error в t):

Debugger entered--Lisp error: (wrong-type-argument sequencep t)
  length(t)
  eval((length t) nil)

Сообщение, которое вы видите, создано error-message-string:

(condition-case e (length t)
  (error (error-message-string e)))
==> "Wrong type argument: sequencep, t"
Другие вопросы по тегам