elisp:两个具有相同参数名称的函数问题
elisp: two function with same argument name problem
我正在我的 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))
如果我将 for 循环中的名称 'list-var' 更改为其他名称,例如 '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
的当前活动 dynamic 绑定是由 for-loop
完成的,而不是由 append-to-list
完成的,因为它在堆栈中更近,正如您在回溯中看到的那样。 ]
第一个建议:永远不要对局部变量使用 add-to-list
(最好使用 push
或 cl-pusnew
)!
第二个建议:在 Elisp 文件的第一行某处添加 -*- lexical-binding:t -*-
,以便它们默认使用更合理的 lexical 范围。
我正在我的 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))
如果我将 for 循环中的名称 'list-var' 更改为其他名称,例如 '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
的当前活动 dynamic 绑定是由 for-loop
完成的,而不是由 append-to-list
完成的,因为它在堆栈中更近,正如您在回溯中看到的那样。 ]
第一个建议:永远不要对局部变量使用 add-to-list
(最好使用 push
或 cl-pusnew
)!
第二个建议:在 Elisp 文件的第一行某处添加 -*- lexical-binding:t -*-
,以便它们默认使用更合理的 lexical 范围。