We're currently using the not_idempotent decorator to mark certain functions as not being fusable. This works, but it's a little tricky to check all of the situations.
(For example, if caching is disabled, we still need a fallback to avoid evaluating non-idempotent operations more than once).
Should we instead just make "expressions must be deterministic" be the rule, and handle non-deterministic operations by forcing them immediately?