В старите дни 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
от Боб се сблъскват. В старите времена какво биха могли да направят Алис и/или Боб, за да предотвратят този вид сблъсък?
Може би Боб може да промени docstring на
"Calls FUNC repeatedly, N times.
Warning: Never use i, n, func in FUNC body as nonlocal variables."