【问题标题】:elisp: two function with same argument name problemelisp:两个具有相同参数名称的函数问题
【发布时间】:2019-07-20 13:26:33
【问题描述】:

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

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

(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”更改为其他名称,例如“anthoer-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))

【问题讨论】:

    标签: emacs scoping


    【解决方案1】:

    欢迎来到动态作用域的精彩世界!
    [list-var 的当前活动动态 绑定是由for-loop 完成的绑定,而不是由append-to-list 完成的绑定,因为它在堆栈中更近,正如您在回溯中看到的那样。 ]

    第一个建议:永远不要在局部变量上使用add-to-list(最好使用pushcl-pusnew)!

    第二个建议:在 Elisp 文件第一行的某处添加 -*- lexical-binding:t -*-,以便它们默认使用更清晰的 lexical 范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多