...When I noticed you hadn't logged in for a while, I sent a mail to your registered address for the forum (Wed, Apr 16, 3:22 PM).
(It should have also been delivered as an announcement from the forum remailer...posts to "Announcements" are supposed to go out by default as notifications.)
The change was due to whoever runs the domain letting it break unannounced, so something had to be done to keep it up.
But welcome back!
I got a new M4 mac, and hunkered down to make bootstrap executables for all the platforms... but I wanted to nail things down as best I could before doing so. (Last bootstrap executables were from 2018, and having that relatively stable has been helpful as the design has undergone its evolution.)
Little did I know that going through that bootstrap executable and pinning things down would lead to a cascade of insights. When you are forced to solve a problem in a way that it works in both an "old" world and a "new" world... sometimes the "compromise" you come up with actually turns out to have properties that are just good on an absolute scale.
The idea of making VOID a purely unstable state--taking the empty antiform PACK! ("none")--and having vanishing done only by antiform COMMA! (now "VOID!") nailed down longstanding problems. It caused a flurry of adjustments, but those adjustments are putting everything in its right place.
It was a revelation to make (^foo: xxx) store a lifted form and (^foo) fetches the unlifted form. It also means we can probably avoid putting trailing apostrophes on the name, because ^foo' and ^foo are redundant, if all assignments and fetches carry the caret. This also is the final piece in the puzzle for how to deal with (for-each [key value] obj [...]) potentially picking up value as an action antiform and running it accidentally via reference: don't let FOR-EACH pick up antiform actions unless you use ^value... and there you have it.
I got over my squeamishness about COMPOSE defaulting to picking up the context from the callsite. So you can use plain old COMPOSE to interpolate strings--and blocks using the callsite context. Then the arity-2 version is COMPOSE2, so you can pass in a pattern that also can carry an environment.
I decided that --[...]-- Strings Look Better than --{...}-- Strings, since we have a choice. But there will likely be stringlike uses for all the asymmetric delimiters when dashed.
Anyway those are some of the biggest things. Lots of little things, and things are starting to move at a breakneck pace... it's actually rather exciting at the moment.