昔、Emacs はレキシカル スコープをサポートしていませんでした。当時、人々は動的スコープの特定の落とし穴にどのように対処していたのだろうか。
Alice が で定義された関数(Bob によって書かれた関数型プログラミングのための多くの関数を提供するライブラリであると仮定します)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)))
Alice はすぐに、コマンドが期待どおりに機能しないことに気付きます。これは、アリスの使用i
とボブの使用がi
衝突するためです。昔は、この種の衝突が起こらないようにするために、アリスまたはボブと一緒に何ができたでしょうか?
おそらく、ボブは docstring を次のように変更できます。
"Calls FUNC repeatedly, N times.
Warning: Never use i, n, func in FUNC body as nonlocal variables."