There's a pretty good mechanical idea here where the system knows the difference between a BLANK! that's an actual "blank line" for rendering purposes, and one where it's a "comma".
But if you are running something like a FOR-EACH or a PARSE as a user, is there an easy way for you to tell?
I've proposed "new-line-marker aware iteration":
Iterators are still being contemplated, but the idea is that @iter would be "dereference iterator".
This raises a bit of a question about iterators and NULL. I feel like it would be awfully nice to be able to just say:
while [@iter] [
...
iter: next iter (or `next $iter`)
]
But in the model I've discussed, iterators can return null as an in-band value, so you have to test them for DONE?...which is a "hot potato".
until [done? @iter] [
...
iter: next iter (or `next $iter`)
]
The idea with iterators is that it's cheap to get the current value, so you don't need to store it in a temporary value.
Anyway, let's imagine:
>> block: [
a b
c d
]
Then:
iter: each-special block ; or whatever it's called
until [done? @iter] [
if not @iter [ ; e.g. newline marker
next $iter ; advance iterator
if blank? @iter [ ; maybe blank on own line?
next $iter ; advance iterator
if not @iter [ ; another newline marker
... handle blank line...
]
]
]
...
iter: next iter (or `next $iter`)
]
That's rather complicated.
You're doing a PARSE-like task on invisible format bits revealed through an iterator.
The design premise--a single BLANK! type rendered by context as either comma or blank lines--pushes the burden away from code that doesn't care, and onto code that does. That seems like a wise choice, but a bit burdensome when you do care.
Though it could be trivial in PARSE. It could handle this for you with a combinator:
parse block ['a 'b repeat 2 blank!-line 'c 'd]
There could similarly be a BLANK!-COMMA if you wanted to match blanks not on their own line.
I think I'm just having a little bit of a mental disconnect with the idea of manually writing code to recognize the pattern a b a being a peer level of difficulty as recognizing a blank line.
But the rationale is that the reason it is difficult is precisely because most code doesn't want to care and hence introducing multiple kinds of blanks isn't a good idea... kind of like why putting the newline markers themselves in source isn't a good idea.