dear list,
does anyone have any objections against pushing this:
Set *list-end-test* to 'endp instead of 'atom, so (iter (for foo :in something-non-list)) fails instead of silently exists
it bit me several times and long ago i've changed it to 'endp on my local copy. it did not cause me any headaches with any projects i use, but i may be missing some use-cases.
if nobody speaks up for long enough, i'll push it eventually.
Attila Lendvai wrote:
dear list,
does anyone have any objections against pushing this:
Set *list-end-test* to 'endp instead of 'atom, so (iter (for foo :in something-non-list)) fails instead of silently exists
it bit me several times and long ago i've changed it to 'endp on my local copy. it did not cause me any headaches with any projects i use, but i may be missing some use-cases.
if nobody speaks up for long enough, i'll push it eventually.
ENDP sounds like a good idea. I was under the impression that iterate/for/in already failed with improper lists, but if it doesn't yet, it really should.
Cheers,
Hi,
please excuse my always late replies.
Attila Lendvai wrote on the 16th of February:
does anyone have any objections against pushing this: Set *list-end-test* to 'endp instead of 'atom, so (iter (for foo :in something-non-list)) fails instead of silently exists
ENDP sounds like a good idea. I was under the impression that iterate/for/in already failed with improper lists, but if it doesn't yet, it really should.
I object the change. While it could be useful in the case of (FOR IN ...), it produces behaviour incompatible with LOOP in the case of FOR ON
(iter (for x on '(1 2 . 3)) must not fail -- with default settings.
It's written nowhere, I believe, but compatibility with LOOP is a design goal (at least to me). So far I was very surprised at how compatible ITERATE has always been with LOOP, while studying its behaviour and some corner cases. I even started wondering whether ITERATE may have influenced LOOP's design or whether it was strictly the opposite.
I vaguely remember applying a few minor changes to ITERATE to have it match LOOP closer in some obscure cases (e.g. FOR BELOW UPTO ...).
The user ought to expect consistent behaviour. Transition from LOOP to ITERATE should be smooth and trivial.
Note that both old and new behaviour differ from LOOP. While the old one did not signal an error with FOR IN on dotted lists, whereas LOOP would (in clisp, cmucl and CormanLisp), the new one would fail to iterate FOR ON, as noted above.
So a third possibility would be to be even more compatible with LOOP, remove that variable and unconditionaly use ATOM with FOR ON and ENDP with FOR IN.
One less variable is one less cause of trouble with incompatible settings among users. Suppose library A wants Iterate'S variable this way, while the other wants it another way?
In summary, I'm in favour of eliminating this variable *and* differentiate FOR IN-ENDP vs. FOR ON-ATOM. pro: compatible with observable LOOP behaviour contra: incompatible change, FOR IN on dotted lists would error out (like LOOP) Documentation would have to be changed as well!
Actually, there could be somewhat distinct votes 1. Eliminate or not 2. FOR IN dotted list: error out (like LOOP) or not (compatible, someone's code may depend on this) -- apparently, that's the issue where opinions diverge.
Regards, Jörg Höhle.