在过去,Emacs 不支持词法作用域。我想知道当时人们如何处理动态范围的特定陷阱。
假设 Alice 编写了一个my-insert-stuff
依赖于其中fp-repeat
定义的函数的命令fp.el
(我们假设这是一个为 Bob 编写的函数式编程提供大量函数的库),并且假设fp-repeat
是为了多次重复调用一个函数。
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)))
爱丽丝很快发现她的命令并没有像她预期的那样工作。那是因为 Alice 的使用i
和 Bob 的使用发生了i
冲突。在过去,Alice 或/和 Bob 可以做些什么来防止这种碰撞的发生?
也许 Bob 可以将文档字符串更改为
"Calls FUNC repeatedly, N times.
Warning: Never use i, n, func in FUNC body as nonlocal variables."