Раньше Emacs не поддерживал лексическую область видимости. Мне интересно, как в те дни люди справлялись с определенной ловушкой динамической области видимости.
Предположим, что Алиса пишет команду my-insert-stuff
, которая опирается на функцию fp-repeat
, определенную в fp.el
(которая, как мы предполагаем, представляет собой библиотеку, предоставляющую множество функций для функционального программирования, написанную Бобом), и предположим, что 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)))
Вскоре Алиса обнаруживает, что ее команда работает не так, как она ожидала. Это потому, что использование Алисой i
и использование Бобом i
противоречат друг другу. В прежние времена, что могли сделать Алиса и/или Боб, чтобы предотвратить такое столкновение?
Возможно, Боб мог бы изменить строку документации на
"Calls FUNC repeatedly, N times.
Warning: Never use i, n, func in FUNC body as nonlocal variables."