Elisp: две функции с одинаковым именем аргумента

Я пишу некоторую полезную функцию в моем 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))
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать в удивительный мир области видимости динамичный!
[ Текущая активная привязка динамичный для list-var выполняется for-loop, а не append-to-list, поскольку она находится ближе в стеке, как вы можете видеть на обратной трассировке. ]

Первая рекомендация: никогда не используйте add-to-list для локальных переменных (вместо этого лучше используйте push или cl-pusnew)!

Вторая рекомендация: добавьте -*- lexical-binding:t -*- где-нибудь в первой строке ваших файлов Elisp, чтобы по умолчанию они использовали более разумную область видимости лексический.

Другие вопросы по теме