We simulate it in the following way:
1- An opaque 'let'-expressions (let x : t := v in b) is encoded as
((fun (x : t), b) v)
We also use a macro (let-macro) to mark this pattern.
Thus, the pretty-printer knows how to display it correctly.
2- Transparent 'let'-expressions are eagerly expanded by the parser.
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
We reduce the cost by avoiding the allocation of std::functional objects, and the unnecessary increment/decrement of reference counters.
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>