在旧的Emacs中,没有对词法作用域进行支持。我想知道在那些年代人们是如何处理动态作用域的一个特定问题的。
假设Alice编写了一个命令"my-insert-stuff",它依赖于在"fp.el"中定义的"fp-repeat"函数(我们假设这是Bob编写的提供大量函数的函数式编程库),并且假设"fp-repeat"用于多次调用函数。
来自Alice的"init.el"一部分内容:
艾丽斯很快发现她的命令并没有像她预期的那样起作用。这是因为艾丽斯使用的
假设Alice编写了一个命令"my-insert-stuff",它依赖于在"fp.el"中定义的"fp-repeat"函数(我们假设这是Bob编写的提供大量函数的函数式编程库),并且假设"fp-repeat"用于多次调用函数。
来自Alice的"init.el"一部分内容:
(require 'fp)
(defun my-insert-stuff ()
(interactive)
;; inserts "1111111111\n2222222222\n3333333333" to current buffer
(dolist (i (list "1" "2" "3"))
(fp-repeat 10
(lambda ()
(insert i)))
(insert "\n")))
以下是 Bob 的 fp.el
部分内容:
(defun fp-repeat (n func)
"Calls FUNC repeatedly, N times."
(dotimes (i n)
(funcall func)))
艾丽斯很快发现她的命令并没有像她预期的那样起作用。这是因为艾丽斯使用的
i
与鲍勃使用的i
冲突了。在过去,艾丽斯和/或鲍勃可以做些什么来防止这种冲突发生呢?也许鲍勃可以更改docstring为
"Calls FUNC repeatedly, N times.
Warning: Never use i, n, func in FUNC body as nonlocal variables."