主要Lisp方言における動的スコープ
サークルの先輩から「なんかどのLispも動的スコープだと思っている人が多くない?」と指摘を受ける.
ELispは最初から動的スコープ.
Schemeは静的スコープで有名である.動的スコープの実現はライブラリによる方針を取っている.SRFIに(割と歴史の古い)fluid-let
が提案されたものの取り消され,現在 "parameter" 系が標準になっているらしい.マルチスレッドとの相性が肝のようだ.
- http://practical-scheme.net/gauche/man/gauche-refj_26.html Gauche ユーザリファレンス: 4.6 変数束縛
- http://srfi.schemers.org/srfi-15/ SRFI 15: Syntax for dynamic scoping.
- http://srfi.schemers.org/srfi-39/ SRFI 39: Parameter objects
Common Lispも基本は静的スコープだが,動的スコープも仕様に組み込まれている.defparameter
等のオペレータで定義した変数は動的スコープになる(special variable, dynamic variable)し,ローカル変数はdynamic-extent
としてdeclare
すれば動的スコープに変更できる.
- http://www.lisp.org/HyperSpec/Body/mac_defparametercm_defvar.html Macro DEFPARAMETER, DEFVAR
- http://www.lisp.org/HyperSpec/Body/dec_dynamic-extent.html Declaration DYNAMIC-EXTENT
しかし「トップレベルで静的スコープの変数を作るにはどうするの?」これが分からない.できないんじゃね?