20-Jul-2025: I Finally Pushed a New Web Build
It's quite buggy and has about 1,000 failing tests. So I haven't really been shouting "go try it" from the treetops. Still: after a year of no public builds, I finally pushed to master... and it passed the continuous (web) integration (running @gchiu's Chess demo and pharmacy prescription app--even though he's retired from doctor'ing).
Why a whole year of private branch development, you ask?
![]()
I've already discussed the unfortunate turn of events: fundamentally changing how strings worked from {...} (to -[...]- or --[...]-- or ---[...]---) hit a limit of what the 2018 "bootstrap" executable was able to gloss over.
This meant new bootstrap executables were needed. And we all know about the "Second System Effect": so long as I was changing how strings worked, I needed to fix a few other things.
There are good reasons and bad reasons for me doing things the way I did it. It's one of those situations where you are "work shaping" where perhaps the total amount of work you do is more, but you're trying to minimize doing the type of work you like less. If the primary product of your work is actually "thought/design", then irresponsible development practices may counter-intuitively result in a more refined "product" (even if you should be fired by any respectable shipping software company for your methods).
So You Can Test Drive A Revolutionary Disaster
http://hostilefork.com/media/shared/replpad-js/
I'm weary from overthinking so many details, that I sometimes forget how impressive it actually is.
>> num: 1000
>> compose "Hello there (num + 20), World!"
== "Hello there 1020, World!"
Tonight, I'm not up to the task of "explaining why that's non-trivial".
It's not just "string interpolation", it's a generalized framework for implementing your own string interpolation abstractions, all on top of the metaprogramming tooling of Rebol. Where by "string interpolation" I mean "notable because it's a use case of binding working how people actually want/need it"...
..so speaking of that, I also don't want to explain here why this is non-trivial:
>> doubler: func [x] [
let code: copy [add x]
append code to word! "x"
print ["Doubled:" eval code]
]
>> doubler 10
Doubled: 20
I'm assuming the only people reading this appreciate that if such things are possible in something that otherwise is able to do what they expect "a Rebol" to do, that it's understood that major barriers have been knocked down.
Maybe I'll post an addendum to this where I give bullet points of all the interesting things to try that were made possible by the last year's work, but not in the mood for that right now.
TL;DR - What's Going On Now?
Excited by the July accomplishment with the web build, my hope was that I'd quickly get the other historical projects building under continuous integration. (This would be a way of making sure the "meat" was working, and then I'd go chase after all those pesky broken tests...or just decide the tests were outdated and throw them out.)
I managed to get my Whitespacers Project, and @BlackATTR's Query working, which was encouraging.
Then I faced a pretty big psychological obstacle: We were already on the tail end of the tech curve for cipher suites, but letting another year lapse meant finally https://example.com would no longer use any of the cipher suites we had implemented via TLS.
I'm in some sense glad--and in more senses not-glad, of how intimately I've been made aware of the spiraling cat-and-mouse game of internet security.
I don't know how anyone should feel secure. The fact that protocols that worked yesterday suddenly stop working and require easy-to-mess-up patching shouldn't provide anyone with peace of mind. The cryptography codebases themselves shift and morph, favoring "hardware acceleration" over clarity: you aren't even able to trace into the calculation of a hash in your debugger, and the compiler switches of once-clear code vanish into a "just trust us" monolith that you absolutely should not trust.
Why Not Skip The TLS Issue, And Move On?
The Ren-C executable itself is depended on as a piece of testing, and assumptions are that it should be able to do https reads from websites like GitHub (or this forum!).
Falling behind that and having to lean on some cryptographic library would (a) require shifting approaches to lean on some "libcurl" library or other black box and (b) be a really major bummer.
In terms of what I consider fun or not fun: I do not want to really sit down and start hacking on "Galois Counter-Mode" and "ChaCha20-Poly1305" protocols. But also, the library we use for cryptography has jumped the shark, they've deprecated the architecture that was aligned with Rebol premises. Whoever makes decisions for the "version 4" is not the same mind that designed the original good code... and it's no longer a reliable or well-designed basis for the kind of philosophy we're working on.
There are better directions--Microsoft Research has some nice "High-Assurance Crypto Library" (HACL*) stuff that they translate from formal specifications to C without any of the BS, but it also produces assembly.
It's a major distraction to change horses at this point. So really I probably need to just dig up the TLS spec and do it. But it depresses me and I sort of don't want to.
Other Than The TLS Speedbump, How Are Things?
The only word I can think of is overwhelming.
As a practical issue, I've gotten quite entangled with questions of safety regarding VOID vanishing when it isn't expected, and ACTION! being assigned to SET-WORD! when it isn't expected.
I know these are things Redbol-heads would not care in the least about, but I am trying to produce an artifact that lets people enjoy light-and-free metaprogramming without horrible punishing accidents at every turn. Because I take it seriously, the codebase is full of examples and tests and assertions that prevent me from moving forward unless I resolve these puzzles. That's pretty paralyzing.
It seems each turn unfolds an infinite number of deep and insanely complicated design points to think about... moving any step in any direction confronts a large number of them.
So What's The Bright Side?
UPARSE. A deep and uncompromising usermode accomplishment.
I think that, what I've unlocked here is a truly non-trivial example of a dialect, that has shown how deep this medium can be.
And I don't think I've overfitted for UPARSE. I think UPARSE is a genuine example of how you can build something crazy in this Minecraft-of-Programming without needing to touch a C compiler, and really have a dialect that composes together with the language evaluator in a way that is original and exciting.
What's Happening In The Next Few Months?
I honestly don't know, I'm burning out a bit. And typically if this happens I need a break.
In 2024 I wasn't super productive on the project... but this March or so I dove back into things with a vengeance, and haven't taken much of a break since. But here we are in mid-August. I've had more or less no life outside of scrolling YouTube shorts in that time... and that's too long to do this for. I need to do something else.
Typically I wander off for a while and then come back with new ideas. I don't know how long a break I need, but I feel I need one.
I'll see how I feel tomorrow. ![]()