Common Lisp HyperSpecをまじめに読んでたら、だんだんenvironmentが分からなくなってきたのでメモ。

なお、ここでのenvironmentはenvironment objectではなくbindingの集合の意味でのenvironment。

3.1.1 Introduction to Environmentsを読むと、”the global environment”, “a lexical environment”, “a dynamic environment” と書いてあるところから、global environmentはただ一つだけ存在して、lexical environmentとdynamic environmentは複数存在することがうかがえる。ただし明示的にそんなことは書いてない。

3.1.1.2と3.1.1.3によると、プログラム実行中のある時点でactiveなlexical/dynamic environmentのことを “the lexical/dynamic environment” というらしい。ただ、何をもって “active” というのか探したが見当たらないので非常に困る。

3.1.2.1.2.1 Special Formsによるといくつかのspecial operatorはsubformを評価するときに使うためのlexical/dynamic environmentを新たに作るらしい。やはりlexical/dynamic environmentは複数存在するという予想は正しそうだ。

それから具体例としてblockが新たにlexical environmentを作ると書いてある。そのenvironmentはblock formを評価するときに有効(in force)なenvironmentにblock nameとexit pointのbidingを加えたものらしい。何をもってin forceと呼ぶのかわからないのは置いておいて、肝心のblockの説明を見に行くとenvironmentについて何も言及していない。

いかにもenvironmentを作りそうなletの説明を見ても新たなbindingを作るとは書いてあるがenvironmentについてはやはり言及していない。

結局、どのspecial operatorが新たなenvironmentを作るのかわからない。

HyperSpecを探しまわった所、with-accessorsがenvironmentを作るという記述を見つけた。

Creates a lexical environment in which the slots specified by slot-entry are lexically available through their accessors as if they were variables.

with-accessorsはsymbol-macroletに展開できるという話も書いてあるので、symbol-macroletはenvironmentが作ると考えてもいいのかもしれない。しかし、symbol-macroletの説明を見ると、やっぱりenvironmentを作るなんて話は書いてない。

とりあえず、よく分からないということがよく分かった。