ClojureScriptコンパイラにまつわる「環境」あれこれ

ClojureScriptのREPLやeval、マクロ等のコンパイラが関わる部分には「環境」がいろいろ出てくる。 compiler envやanalysis env、compiler stateというのもあるし、マクロの&env、 ClojureScriptで怪しげなことをやってるところでは env/*compiler* というのもよく見かける。

ClojureScriptコンパイラの実装を理解するうえで、これらのうち何が同じもので何が違うものなのか、 違うとしたらどう違うのかを一旦整理しておく必要がありそうだったので調べてまとめてみた。