when i set out to find better program semantics, one of the background requirements was "make it canonicalizable", and then i totally forgot about it and just went by instinct.
now i realize nudl programs fit the requirement: the program is formulated as a non-recursive dataflow DAG, with all mutations happening on weak backedges. and, because there is a mechanism to encapsulate mutations as storage operations, each iteration of the program can be made pure.
how this is good: