Hi Nathan. Interesting post. Here are some questions that I wrote down while
reading it.
First-class continuations + distributed programming sounds like a nightmare that
would wake me up in a cold sweat. Like if a void pointer was bitten by a
radioactive goto. Does your language have restrictions that make such a pairing
comprehensible to average programmers like myself? I assume so, so my real
question is: what distributed programming languages / paradigms is your language
inspired by?
The usage of leiningen
and deps.edn is interesting. How are they combined?
Do you handle all deps with deps.edn, and use lein as a task runner, or...?
(After reading the post comments, it seems somewhat more complicated.
Complicated build processes: I am shocked. Shocked, I tell you.)
Using with-redefs + concurrency has bitten me before. Is it not a problem
because your tests are high-level and run sequentially, so the per-test redefs
don't interfere with each other? (I think this is mostly answered by the
"Deterministic simulation" section, but answer if you'd like.)
The "no-op functions as a structured event log" pattern is interesting. Did you
try out any other methods, like implementing the event logging as separate
components, or directly redef'ing the side-effecting code? If so, what are the
pros & cons you considered?
Are these testing methods just for internal use, or are you planning to make
them easy to use by the end-users of your language? I have a lot of questions
about your language, actually, but I'll just wait for your demo.
It is an ambitious project, and I hope it succeeds. (Since most software
nowadays becomes part of "distributed systems" and they are, frankly, a PITA.)
Cheers,
Leif