Ошибка неправильного типа при оценке функции, привязанной к клавише в emacs

Я написал функцию init-set-key-mappings, которая устанавливает все глобальные ключи в файле .emacs.

(defun init-set-key-mappings ()
 "All the key mappings go here"
  (let ((mappings (list
                '("\C-ca"   'open-fileline))))
    (mapcar (lambda (mapping)
          (let ((key (car mapping))
                (func (cadr mapping)))
            (progn
              (message (format "map key %s to %s" key func))
              (global-set-key key func))))
        mappings)))

Он оценивается нормально, но когда я нажимаю C-c a, Emacs жалуется: «Неверный тип аргумента commandp, (цитата open-fileline)»

Что я делаю неправильно?

РЕДАКТИРОВАТЬ: я нашел ответ. Удаление кавычки перед открытием файла, кажется, решает проблему. Почему проблема в том, чтобы быть символом? Разве не так передаются функции — как символы?


person Ravi    schedule 18.03.2012    source источник


Ответы (1)


Вы дважды заключили в кавычки функцию open-fileline. В выражении

(list '("\C-ca" 'open-fileline)))

первая кавычка означает, что все в следующем списке заключено в кавычки. Затем вы добавили вторую кавычку к open-fileline. Это означает, что список на самом деле содержит не символ в качестве второго элемента своего автомобиля, а символ в кавычках. Сравнивать:

(symbolp (cadar (list '("string" 'open-fileline))))

и

(symbolp (cadar (list '("string" open-fileline))))
person Tyler    schedule 18.03.2012