【发布时间】:2013-08-15 09:36:43
【问题描述】:
在过去,Emacs 不支持词法作用域。我想知道当时人们是如何处理动态范围的特定陷阱的。
假设 Alice 编写了一个命令 my-insert-stuff,它依赖于在 fp.el 中定义的 fp-repeat 函数(我们假设这是一个为 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")))
鲍勃fp.el的部分内容:
(defun fp-repeat (n func)
"Calls FUNC repeatedly, N times."
(dotimes (i n)
(funcall func)))
Alice 很快发现她的命令并没有像她预期的那样工作。那是因为 Alice 对 i 的使用和 Bob 对 i 的使用发生冲突。在过去,Alice 或/和 Bob 可以做些什么来防止这种碰撞的发生?
也许 Bob 可以将文档字符串更改为
"Calls FUNC repeatedly, N times.
Warning: Never use i, n, func in FUNC body as nonlocal variables."
【问题讨论】:
标签: emacs elisp dynamic-scope