You want to try temporal programming? Try clojure: immutable values, immutable & persistent data structures, software transactional memory.
You need a data base with full history (transaction time), try datomic. Additionally if you need full history AND domain time (bi-temporal) included in your data base, try or xtdb.
I second this, Clojure gives you this both in memory and in the database via Datomic and reasoning about immutable data and pure functions is such a dream. Stateful programming is the worst, once you live in Clojure for a while everything else seems nuts trying to debug what got passed to what and when and what modified what. Such a disaster relatively speaking.
Author here. One goal for MetroC is to have a codebase that can run equally well on a CPU or a FPGA. To do that efficiently, I need pretty detailed information about how exactly my program gets translated into x64 instructions or FPGA gates. I'm not sure I can do that in Clojure, but I haven't done more than a cursory skim of the language.
You need a data base with full history (transaction time), try datomic. Additionally if you need full history AND domain time (bi-temporal) included in your data base, try or xtdb.