Итак, я пытаюсь добавить что-то в некоторые переходы режима elisp - в частности, я хотел бы определитьhook и затем активировать его по телефону prettify-symbols-mode
.Использование локальных переменных elisp вместо глобальных переменных для добавления функции в режим-крючок
В любом случае, я получаю org-babel
экспортировать значения в пару списков из таблицы, используя pairlis
, чтобы связать их вместе, как ALIST и add-hook
его в нужный режим, используя анонимную функцию.
Итак, вещь, прямо сейчас, если я использую глобальную переменную, как следующий, он работает:
(let ((token (quote ("not" "*" "/" "->" "map" "/=" "<=" ">=" "lambda")))
(code (quote (172 215 247 8594 8614 8800 8804 8805 955)))) ; Generated automatically using org-babel
(require 'cl)
(setq *globalvar (pairlis token code))
(add-hook 'emacs-lisp-mode-hook
(lambda()
(setq prettify-symbols-alist *globalvar)
(prettify-symbols-mode 1))))
Но если я стараюсь не использовать глобальную переменную, делая это таким образом, он не работает:
(let ((token (quote ("not" "*" "/" "->" "map" "/=" "<=" ">=" "lambda")))
(code (quote (172 215 247 8594 8614 8800 8804 8805 955)))) ; Generated automatically using org-babel
(let (localv)
(require 'cl)
(setq localv (pairlis token code))
(add-hook 'emacs-lisp-mode-hook
(lambda()
(setq prettify-symbols-alist localv)
(prettify-symbols-mode 1))))
Я вроде знаю почему: если I C-h v emacs-lisp-mode-hook
, я вижу, что это относится к любой переменной я использовал в let
форме, которая работает, когда переменная существует, как и в *globalvar
, но не тогда, когда я использую localvar
, w который больше не существует за пределами его формы let
. Но я не уверен, как принудительно оценивать локальную переменную, поскольку я все еще борюсь с множеством концепций в elisp, которые мне не сразу понятны.
Что мне не хватает? Где я здесь не так?
Установите 'lexical-binding' для non-'nil' или' localv' будет свободной переменной в вашей функции hook. Предпочтительно установить «лексическое связывание» в качестве локальной локальной переменной. – Drew
tariqk: Вы хотите прочитать немного о динамической привязке к лексической привязке. Динамическое связывание является значением по умолчанию, и в этом случае ваша 'let'-bound' localv' variable * * привязана (безрезультатно), в то время как ваша форма лямбда * определена *, но больше не связана, когда эта функция выполняется в несколько позже. Вы ожидаете лексического закрытия, которое вы получите, только если вы включите лексическую привязку для библиотеки. – phils
Кроме того, не цитируйте '' (lambda ...) 'like this. См. Http://emacs.stackexchange.com/q/3595/454 – phils