1. I'm not sure I understand your question, but here's my best guess.
We don't explicitly have a store, but we do have a "flow analysis" F
that acts like a store.
This flow analysis F maps <g, k_0 label^1> to the closure <(lambda
g ...), env_0, (k0 label^1)>.
To look up the values that can flow to g in the current environment/
context, we look up the contour matching g in the env:
env(g) = (k_0 label^1)
Now using this contour, we look up the values bound to g and the
contour in the flow analysis (store):
F(g, k_0 label^1) = <(lambda g ...), env_0, (k0 label^1)>
Now we have the closure bound to g in the current environment.
2. This is a point I glossed over. However, you might be right. As
far as I can tell at the moment, g is always bound to the same
closure; however, my argument for nontermination is based on the idea
that if we reach the same program point (calling g) with a different
contour, we must continue evaluation.
3. Any static analysis without a proof of termination has limited
use. If you run a program through it, and it's taking a long time,
how do you know if it hit an exponential or if it hit an infinite
loop? There is no way to tell. That said, this paper is successful
in showing that for common (Scheme) programming idioms this analysis
halts and is better than other approaches from the mid 90's. I
consider this discussion of termination to be interesting but not
fatal to the main points of the paper. The biggest impact
nontermination could have on this paper is to cause us to question how
well this analysis preforms when termination is guaranteed. If we
must change the analysis so that we guarantee termination, that change
will most likely reduce the precision of the analysis. If we reduce
the precision of the analysis, how well does it preform now?
Chris