Emacs elisp:具有相同参数名称的两个函数出现问题

Emacs elisp:具有相同参数名称的两个函数出现问题,emacs,scoping,Emacs,Scoping,我正在emacs init.el中编写一些util函数。两个参数名相同的函数似乎会导致一些错误 如果我更改一个函数的参数名,一切都正常。但由于参数是函数的局部参数,因此它们不应相互影响 (循环的解除(操作列表变量) (如果(不是(等式列表变量为零)) (项目 (funcall op(车辆列表变量)) (对于循环操作(cdr列表变量(()()))) (defun追加到列表(列表变量元素列表) (let((op(lambda(项目)(添加到列表变量项目))) (对于循环op元素列表))) (setq

我正在emacs init.el中编写一些util函数。两个参数名相同的函数似乎会导致一些错误

如果我更改一个函数的参数名,一切都正常。但由于参数是函数的局部参数,因此它们不应相互影响

(循环的解除(操作列表变量)
(如果(不是(等式列表变量为零))
(项目
(funcall op(车辆列表变量))
(对于循环操作(cdr列表变量(()())))
(defun追加到列表(列表变量元素列表)
(let((op(lambda(项目)(添加到列表变量项目)))
(对于循环op元素列表)))
(setq列表-1’(1 2 3))
(附于列表“列表1”(4 5 6))
如果我将for循环中的名称“list var”更改为其他名称,“anothoer list var”例如,一切正常,但正如上面的代码所示,emacs打印堆栈:

调试器已输入--Lisp错误:(错误的类型参数symbolp(4 5 6))
添加到列表((4 5 6)4)
(lambda(项目)(添加到列表变量项目))(4)
funcall((lambda(项)(添加到列表变量项))4)
(progn(funcall op(车辆列表变量))(for loop(cdr列表变量)))
(如果(不是(eq列表变量为零))(程序(funcall op(汽车列表变量))(循环op(cdr列表变量)))
for循环((lambda(项)(添加到列表变量项))(4 5 6))
(let((op(函数(lambda(项)(添加到列表变量项щщ)))(用于循环op元素列表))
附加到列表(列表1(4 5 6))

欢迎来到动态范围界定的奇妙世界
[当前活动的
列表变量
动态绑定是由
for loop
完成的,而不是由
append to list
完成的,因为它在堆栈中更接近,正如您在回溯中看到的那样。]

第一条建议:不要对局部变量使用
add to list
(最好使用
push
cl pusnew

第二个建议:在Elisp文件的第一行的某处添加
-*-词法绑定:t-*-
,以便默认情况下它们使用更为合理的词法范围