I managed to get the system to boot after removing the "must make progress rule" from ANY and SOME in historical PARSE.
Only one change was needed, to CLEAN-PATH. I've extracted the relevant bit so you can get a sense of what kinds of situations the old behavior was for:
parse reverse target [ ; actually processing file path string *backwards*
some [
"../" (handle-slash-dot-dot) ; backwards, remember?
|
"./" (handle-slash-dot)
|
"/" (handle-slash)
|
part: across [to "/" | to <end>] (handle-fragment part)
]
]
Once you reach END, this will loop forever.
The reason why is that in this list of alternates, the last alternate decays to [to <end>], which will always succeed at the end.
This could be changed to use SOME FURTHER and it would resolve the problem. But there's a couple of oddities on this code. It's using SOME and it doesn't actually check the parse result at all, so the intent is actually OPT SOME.
But FURTHER kind of says more than it wants to say. It wants to say that if the loop reaches END then it should consider itself done. Why not just say that... using the cool new WHILE?
parse reverse target [ ; actually processing file path string *backwards*
while [not <end>] [
"../" (handle-slash-dot-dot) ; backwards, remember?
|
"./" (handle-slash-dot)
|
"/" (handle-slash)
|
copy part: [to "/" | to <end>] (handle-fragment part)
]]
]
For this case, it would be my preference over trying to find a way to use FURTHER. Because it's really about wanting to make sure the loop stops at the end. But if you're talking about something that isn't end-specific, that wouldn't work.
Anyway, hopefully this makes sense. I think it's a lot clearer than before!