Sat Feb 13 11:05:38 CET 2010
Flattening an expression tree is really just a fold over that tree,
where the accumulated state is the variable->term dictionary and each
term is either reused from the map or creates a new mapping.
This needs a (Term -> Term) function mapping terms to variable terms,
and an equality operation on Terms.
So, it's not necessary to have a Code datatype such that operations
can be lifted: the accumulation/flattening can be completely hidden in
process, resulting in a map of (variable, term).
So.. what is needed is a code fold, and a way to introduce new
bindings. I.e. foldTerm and letTerm.
I don't see it.. Let's write it in its most concrete form first.
The conversion is a tree traversal. One part is an ANF conversion.
The second part is CSE.