/ / Emacs: грешка грешка тип грешка в Emacs23, но не и в Emacs24 - emacs, компилатор-грешки, elisp, emacs24, emacs23

Emacs: Грешка в аргумента в Emacs23, но не и в Emacs24 - emacs, compiler-errors, elisp, emacs24, emacs23

На първо място, ще призная, че съм пъленначинаещ в Emacs и ELisp (и общо взето Lisp) и аз се натъкнах на грешка, която ме накара да се счупя от доста време, докато се опитвах да напиша моя файл .emacs.

Ето минимум пример за код, необходим за възпроизвеждане на проблема (т.е. имащи .emacs, съдържащи само следното):

(defun define-esc-key (keybind)
(define-key key-translation-map (kbd keybind) "my-esc))
(define-esc-key "M-j")

Това ще доведе до следната грешка с Emacs23:

Lisp error: (wrong-type-argument integer-or-marker-p keybind)
read-kbd-macro(keybind)
#[(keys) "301!207" [keys read-kbd-macro] 2 2186954](keybind)
(kbd keybind)
(define-key key-translation-map (kbd keybind) (quote my-esc))
define-esc-key("M-j")

но работи както очаквам в Emacs24. Тя също работи в Emacs23, ако заменя инстанцията на keybind в define-esc-key функционален орган от "M-j".

(Между другото, съжалявам за лошата титла, но не можех да мисля за нищо по-описателно.)

Отговори:

1 за отговор № 1

От NEWS файл:

* Lisp Changes in Emacs 24.3
...
*** `kbd" is now a function rather than a macro.

Това означава, че в по-ранните версии на Emacs аргументът към kbd трябва буквално да присъства в поканата, за разлика от използването на променлива във вашия пример.

Друга възможност е да използвате eval и допълнителни котировки за вмъкване на стойността:

(eval `(kbd ,keybind))