This allows dumping expressions (Init *) as soon as they become concrete. Both of these take a string as the first operand that prefixes the dump of the expression.
!dump can be used in a expression/functional context. For example:
!foreach(i, lst, !dump("elt = ", i))
dump can be used in a "statement" context:
def c: C<3>; dump "c = ", c;
dump is implemented as a syntactic sugar. The above dump is parsed into:
assert 1, !cast<string>(!dump("c = ", c));
Original patch from Adam Nemet <anemet@apple.com>
standard error output?