スコープの話

(let ((y 5))
  (defun print_y (x) y)  ; print_yを定義します

  (defun map2 (f lst)
    (let ((y 20))
      (mapcar f lst)))   ; print_yを評価します

  (let ((y 10))
    (map2 #'print_y      ; print_yを束縛します
          (list 1 2 3 4 5))))

このコードの出力がどのようになるかを考えてみる。

レキシカルクロージャの場合
(5 5 5 5 5)
ダイナミッククロージャの場合
(10 10 10 10 10)
ラムダ式の場合
(20 20 20 20 20)

という3種類の可能性があるわけだが、
上のコードは実はEmacs Lispなので、開ラムダ式として評価され、結果は(20 20 20 20 20)となる。


ところで、ダイナミッククロージャという言葉が本当にあるのか心配になって確認してみました。日本語では見つからなかったのですが、英語では何件かあります。
http://www.dridus.com/~nyef/lispm/ssdn2/sect12.txtによれば

Conceptually, a dynamic closure object is a function and a remembered binding environment. The remembered binding environment is necessary to resolve possible binding conflicts caused by free references to variables in functions passed as arguments (funargs).


あと、http://www.digitalmars.com/d/archives/11250.htmlでは、D言語クロージャはダイナミッククロージャだと言っているのですが、話の内容を読むと、よくある誤解っぽい気がするなぁと思っていたら、D言語では「動的クロージャ」という言葉を独特の意味で定義しているんですね。
http://www.kmonos.net/alang/d/function.html#closures
これって、誰かがdownward closureとかって言ってたなと思ったのですが(検索すると、数学方面のdownward closureの方ばかり引っかかってしまって大変だったのですが)、ADA方面の言葉みたいですね。
http://www.grammatech.com/rm95html-1.0/rm9x-03-10-02.html#37
この意味では、「動的クロージャ」という言葉より「downward closure」の方が、適切だと思うけど。