Я пишу некоторую полезную функцию в моем emacs init.el. Кажется, что две функции с одинаковым именем аргумента вызывают некоторую ошибку.
Если я изменю имя аргумента одной функции, все в порядке. Но поскольку аргумент является локальным для функции, они не должны влиять друг на друга.
(defun for-loop (op list-var)
(if (not (eq list-var nil))
(progn
(funcall op (car list-var))
(for-loop op (cdr list-var)))))
(defun append-to-list (list-var element-list)
(let ((op (lambda (item) (add-to-list list-var item))))
(for-loop op element-list)))
(setq list-1 '(1 2 3))
(append-to-list 'list-1 '(4 5 6))
Если я изменю имя «list-var» в цикле for на другое имя, например, «anothoer-list-var». все идет нормально, но, как и в приведенном выше коде, emacs печатает стек:
Debugger entered--Lisp error: (wrong-type-argument symbolp (4 5 6))
add-to-list((4 5 6) 4)
(lambda (item) (add-to-list list-var item))(4)
funcall((lambda (item) (add-to-list list-var item)) 4)
(progn (funcall op (car list-var)) (for-loop op (cdr list-var)))
(if (not (eq list-var nil)) (progn (funcall op (car list-var)) (for-loop op (cdr list-var))))
for-loop((lambda (item) (add-to-list list-var item)) (4 5 6))
(let ((op (function (lambda (item) (add-to-list list-var item))))) (for-loop op element-list))
append-to-list(list-1 (4 5 6))





Добро пожаловать в удивительный мир области видимости динамичный!
[ Текущая активная привязка динамичный для list-var выполняется for-loop, а не append-to-list, поскольку она находится ближе в стеке, как вы можете видеть на обратной трассировке. ]
Первая рекомендация: никогда не используйте add-to-list для локальных переменных (вместо этого лучше используйте push или cl-pusnew)!
Вторая рекомендация: добавьте -*- lexical-binding:t -*- где-нибудь в первой строке ваших файлов Elisp, чтобы по умолчанию они использовали более разумную область видимости лексический.