Tue Oct 25 13:18:04 EDT 2011

Zipper for Exp?

See [1] for a derivation.  Doing this straight from the polynomial
isn't really possible since it looses too much information.  Though
it's useful for verifying consistency.

One question that bubbles up though is how do I know what the current
toplevel expression is?  Suppose we have:

(Let a 123
(Let b 123
(Let c 123
  (Call f a b c))))

Here the continuation of the Call node needs to be made so that the
inverted Let node can be reconstructed.  The solution of course is to
insert a continuation that does this.  So we need to modify makeVar
after all.

makeVar :: TypeOf (Code t) => (Code t) -> MCode r (Code t)
makeVar term@(Code sterm) = SC c where  
  c (State bs n) k = k (State bs' $ n+1) (Code $ Ref $ var) where
    var = Var typ v 0
    v = regPrefix ++ (show $ n)
    bs' = (Bind var sterm) : bs
    typ = typeOf term

So instead of just calling k directly as in the definition above, we
install a new k that performs the inversion.

It seems simpler to then construct the data structure on an as-needed
basis, defining these continuations.

[1] entry://../compsci/20111025-132211