World: r4wp
[!REBOL3] General discussion about REBOL 3
older newer | first last |
BrianH 12-Mar-2013 [1771] | REPEAT would be used with the range, not FOR. FOR takes too many parameters. |
Gregg 12-Mar-2013 [1772x2] | Brian, yes. I vote for an error because FOR says, to me, that you expect the loop to terminate. If you want an infinite loop, use FOREVER to make that clear. |
Well, yes, REPEAT would be the clear choice, but if you have a range! and passed its lower and upper bounds to FOR, what would you expect? FWIW, I've always thought 'bump should have been a refinement option in FOR. | |
BrianH 12-Mar-2013 [1774] | Right. One thing we need to consider is whether we want changes to the index in the code block to affect the index of the loop, or whether we just want to do that with BREAK. There are advantages to either model. If manual changes to the index are ignored, it becomes safe to change in your code. If they aren't ignored, it becomes another way to affect the loop in your code. |
Gregg 12-Mar-2013 [1775] | Another fun question. :-) |
BrianH 12-Mar-2013 [1776] | If you have a range type (which was rejected, btw, but might get revisited) and you break out its upper and lower bounds so it can be passed to FOR's *two* parameters for those values, the programmer would still need to specify them as they see fit. |
Gregg 12-Mar-2013 [1777x2] | While I think it's a bad idea to mess with the index, there are reasons to allow it. I think manual changes should be allowed, but discouraged. |
On range!, my thinking is that the default would be a 'bump of 1 (next value in a series), because that's how I think of iterating over a range of values. | |
BrianH 12-Mar-2013 [1779] | We can't really discourage anything because we don't have "warnings" in Rebol (no way to implement them without a logging facility, and no point in logging them without a precompiler). It's allowed or it's not. If it's allowed (in R3 at least) it's because it's part of the intentioned model. |
Ladislav 12-Mar-2013 [1780] | We can't really discourage anything - I guess that Gregg mentions to discourage it in the documentation |
Gregg 12-Mar-2013 [1781] | Yes, in docs. |
Ladislav 12-Mar-2013 [1782] | (should be "means") |
BrianH 12-Mar-2013 [1783x3] | The range! type turned out to not actually be useful. You can stop adding a ! when referring to ranges :) |
So the question we're posing is whether we want the developer to be able to manually affect the FOR loop process from the inside (a feature, useful for advanced developers), or whether we want the loop process to be inviolate regardless of changes to the index in the code (another feature, useful for compilers that might want to unroll loops). Given that we don't have a compiler, that suggests that affecting it might be a useful feature, but Red compatibility and the overhead of checking the index value rather than just setting it based on an internal value in native code suggests that the latter might be better. There is no point in discouraging anything, since there is so much overhead to allowing it at all that we should only do so to provide a feature explicitly. | |
If you have the loop process inviolate then you can use a C value or even a raw value slot as an internal loop counter. If you want changes to the index in the code to persist, the loop would need to check that word after the loop cycle ends to determine its current value, then change that. That has overhead, like checking for and reacting to unset values, that just ignoring the word's value doesn't have. So if we want to allow it at all, it shouldn't be discouraged except as a potential gotcha, it should be considered a feature. | |
Maxim 12-Mar-2013 [1786] | in languages like C the for loop is the basic iterator and it should be completely open. but in REBOL we do have a lot of purpose-built iterators, I think FOR shoudn't allow non advancing steps and should't allow the inner loop to affect index. This would make FOR faster for its primary purpose. I don't see the point in trying to make every different iterator another interface to while/until |
Ladislav 12-Mar-2013 [1787] | in languages like C the for loop is the basic iterator and it should be completely open - actually, C does not have a FOR loop, it only have a general loop called for () |
Maxim 12-Mar-2013 [1788] | IMHO, differenciation of each iterator, increase their relative "relevance" in the language. |
BrianH 12-Mar-2013 [1789] | Whatever we choose with FOR, we should make REPEAT behave similarly in that same choice. Those two are in the same family. |
Ladislav 12-Mar-2013 [1790] | i.e. C language for () is not a FOR loop, in fact. it is a general loop |
BrianH 12-Mar-2013 [1791] | Ladislav, try to keep on topic. We're not talking about CFOR, we're talking about FOR :) |
Ladislav 12-Mar-2013 [1792] | It was Max who mentioned that |
BrianH 12-Mar-2013 [1793x3] | Back to the step argument: For FOR, the main factor for whether the loop would normally end is whether the step > 0 if start < end, or step < 0 if start > end. So it's not whether it = 0. We should allow one iteration when start = end, but trigger an error otherwise if we have a non-advancing step. Developers can just as easily use BREAK and such for an advancing step. |
Simply not doing anything is bad here because it makes the error much harder to track down. It's terrible for debugging. | |
Wait, I might be wrong about step. For start > end, if step is positive then FOR should do nothing. It should only trigger an error for 0. The step sign determines the direction of the FOR. | |
Maxim 12-Mar-2013 [1796x2] | exactly. it should only raise an error when the step = 0 |
I've used some languages that try to prevent ranges which are opposite to step (with an error) but I found that very annoying when playing with code which uses variables for start & end values. | |
BrianH 12-Mar-2013 [1798x3] | Do we have enough factors to make some tests and tickets for FOR? I'm not sure whether we came to an agreement about the changing index issue, so that might be worth an issue ticket (assuming this conversation will disappear because we're in AltME, not CureCode). |
I can make the tickets later today - it just looks like two, one for step, one for index-changing. | |
Sorry, bump. Don't know why I thought it was called step. | |
Bo 12-Mar-2013 [1801x3] | I think that 'for should be as flexible as possible. One of the main problems IMHO of most programming languages and software systems is designed inflexibility. |
Let's say that I have two series that are the same length, and the values at each position of each series are related to each other. What if I want to use a 'for loop to increment through the first series, but in some cases, depending on the value of the first series, I want to skip x values ahead, and on other values, I want to access that same position in the second series and perform an action on it. Why couldn't I use a 'for loop to do this if I wanted? | |
It would be sad if 'for was designed to disallow me from doing this. | |
BrianH 12-Mar-2013 [1804] | Well, FOR isn't a general loop like in C, it's just an iterator. If we need a general loop we should add one, even though general loops are more expensive to use in interpreted languages than specific loops (which is why we have specific loops rather than one general loop). However, "I want to skip x values ahead" does sound like an argument for allowing index changes to affect the looping process, as a power-user feature. |
MarcS 12-Mar-2013 [1805x2] | (Sorry for the tangent:) Can anyone reproduce http://curecode.org/rebol3/ticket.rsp?id=1974 on OSX? For me, I obtain the expected result on OSX and see the erroneous 9.9.9 under Linux. |
s/For me, // | |
Maxim 12-Mar-2013 [1807] | Bo, I'd say don't use FOR its just about the worse fit for that algorithm . :-) |
BrianH 12-Mar-2013 [1808] | I came up with two models for the start/end/bump situation, both of which make sense. We can pick the one we like the most. I'll put it in the ticket. |
Bo 12-Mar-2013 [1809] | Maxim: Right now, I would use something like the following: x: 1 endval: length? b until [ either s1/:x = b [ do something x: x + 1 ][ do something2 x: x + 5 ] x >= endval ] |
Henrik 12-Mar-2013 [1810x2] | MarcS, I cannot replicate that on OSX with build fc51038. |
I don't see it in the experimental 64 bit build either. | |
MarcS 12-Mar-2013 [1812] | Henrik: thanks for the info. |
Henrik 12-Mar-2013 [1813] | BTW, this is on 10.8. |
MarcS 12-Mar-2013 [1814] | Here too |
DocKimbel 12-Mar-2013 [1815] | Bo: you could rely on FORALL and series positions instead of carrying numerical indexes around: forall b [ offset: either b/1 = pick s1 index? b [ do something 1 ][ do something2 5 ] b: skip b offset ] |
MarcS 12-Mar-2013 [1816] | Sunanda mentions that 1.1.1 / .1 is correct under R2/Windows. Can't test that currently, but 9.9.9 is returned by R2/Linux (i.e., this behaviour doesn't look like a regression in R3).. |
Gregg 12-Mar-2013 [1817] | Marc: R2/Win correct here. R3/Win incorrect here. |
MarcS 12-Mar-2013 [1818] | I have a provisional fix in place for R3/Linux. |
Gregg 12-Mar-2013 [1819x2] | Bo, while I want flexibility as well, especially in a language like REBOL, I don't think we need complete flexibility everywhere. Constraints are very powerful and helpful. |
To me, FOR creates an expectation of consistent stepping behavior, *but* there are times when you don't want that, and FOR seems like the first function you still want to go do. | |
older newer | first last |