World: r4wp
[!REBOL3] General discussion about REBOL 3
older newer | first last |
Bo 12-Mar-2013 [1802x2] | 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. | |
BrianH 12-Mar-2013 [1821] | Ticket for the FOR stepping behavior: http://issue.cc/r3/1993. The FOR index modification behavior will be a separate ticket, since while they'll likely need to be implemented at the same time, they need to be discussed separately. |
Gregg 12-Mar-2013 [1822] | Thanks Brian. |
Sunanda 12-Mar-2013 [1823] | Is this by design or oversight? DATE can be used for most access paths, but not with PICK ser: [1-jan-2000 9999] select ser 1-jan-2000 == 9999 find ser 1-jan-2000 == [1-Jan-2000 9999] ser/1-jan-2000 == 9999 pick ser 1-jan-2000 ** Script error: invalid argument: 1-Jan-2000 |
Gregg 12-Mar-2013 [1824x2] | I would say it's by design. |
That is, what position would it reference? | |
BrianH 12-Mar-2013 [1826x2] | It would make sense for maps, where SELECT and PICK are pretty much the same thing, but not for series, where they mean something different. |
PICK for series just means the index, or something that can be translated into an index like logic is. | |
Ladislav 12-Mar-2013 [1828x6] | We should allow one iteration when start = end, but trigger an error otherwise if we have a non-advancing step. - I am asking to make sure I understand this formulation. Does it mean that you want to allow for i 1 1 step [...] in case step <> 0 but not in case step = 0? |
For start > end, if step is positive then FOR should do nothing. It should only trigger an error for 0. - hmm, I find it quite natural to prefer: For start > end, if step is not negative then FOR should do nothing like Endo seems to prefer | |
The reason is that it is simpler. | |
even though general loops are more expensive to use in interpreted languages - that may be true in general, but, funnily enough, my general loop implementation was always faster in R2 than FOR | |
Actually, there is one more reason I see why a general loop is quite natural and it is needed in Rebol: in case we need to iterate using decimal! values, it is quite likely that we need more "custom" END comparisons than any FOR implementation can give us. That is exactly the case when FOR cannot be improved much. | |
'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.' - agreed, it may be convenient when the user needs such a feature | |
Bo 12-Mar-2013 [1834] | Gregg: I'm all for constraints if there is a significant "win" component. If it doesn't, don't constrain it. Apple, but especially Microsoft, are really good at artificially constraining software. Frustrates me to death. Most of the time, it just seems like a poor design decision. Other times, I can see how the constraint is being used to generate revenue. |
Ladislav 12-Mar-2013 [1835] | However, I am quite unsure whether Carl implemented it as a "power user feature" or if he had some other reason (looks likely to me) |
BrianH 12-Mar-2013 [1836] | For some reason I thought that R2 allowed indexes to be changes, but R3 didn't, and that was a loss of functionality. After actually testing, it appears it was the other way around, a gain of functionality. I'm for R3's model in this case, enough so that I didn't think it worth adding a ticket. |
Bo 12-Mar-2013 [1837] | If this was a language designed to promote "proper" programming, I could see having constraints on every function to keep them from being used in new ways, and to promote the proper usage of the function. However, in real life, flexibility is key. Let me know if this makes any sense: If I want to rip the fender off my car and fashion it into a medieval helmet, physics allows me to do so (if I had the requisite skill). However, in programming languages, this type of thing would rarely be possible. So what I'm saying is this: Try as much as possible to refrain from placing software developers in a box when it comes to how they might choose to use a function or a feature. |
BrianH 12-Mar-2013 [1838] | Bo, we're agreeing with you in this case. Stop arguing before you convinve us otherwise! :) |
Gregg 12-Mar-2013 [1839] | There is nothing preventing you from hacking FOR into a helmet. What I'm saying is that we should tell developers "Here is a helmet, and here is a fender. You should use each appropriately." and we shouldn't make the fender a poorer fender design in order to accommodate helmet makers. |
Ladislav 12-Mar-2013 [1840] | Try as much as possible to refrain from placing software developers in a box when it comes to how they might choose to use a function or a feature. - yes, makes sense to me, Bo. I alway try to achieve that |
Bo 12-Mar-2013 [1841] | BrianH: Thanks. Sometimes I end up "preaching to the choir." Gregg: I wasn't proposing to compromise the intended functionality of a function. I was simply stating that *artificial* constraints shouldn't be placed on a function for the purpose of limiting its functionality. |
Gregg 12-Mar-2013 [1842] | Agreed Bo. Constraints should exist only to empower us. |
BrianH 12-Mar-2013 [1843] | Ladislav, in answer to your first question about "We should allow one iteration when start = end, but trigger an error otherwise if we have a non-advancing step.", yes. That is the difference between the two models in that ticket. 0 bump should behave consistently, according to a model which makes sense. In one of those models, the bump is given primacy over the start-vs-end factor, and judged *on its own* a bump of 0 is an error (since it doesn't make FOR advance in one or the other direction). So, that error should be triggered categorically before the range is even considered. If, on the other hand, start-vs-end is given primacy, then we have 3 valid answers to the direction argument: forwards, backwards, or once - the bump argument doesn't determine direction, it determines velocity in the direction already chosen. In the start=end case the bump is always ignored, so ignoring it for 0 makes sense. In the start<end or start>end cases, a bump of 0 is basically out of range because those cases are only defined to move in the positive or negative direction, respectively. That means that start<end is only positive, and start>end is only negative. Does that make the difference between the models clear? Of course, because you can BREAK, CONTINUE, or even set the index position in the code, that doesn't actually reduce our flexibility where we really want to do anything interesting. It just makes the basic model make sense. |
Ladislav 12-Mar-2013 [1844x2] | For me, the model preferring START and END to determine the direction makes more sense and looks less constraining. |
The model preferring BUMP looks rather "uninteligent" and "constraining" to me. | |
BrianH 12-Mar-2013 [1846] | Agreed. I mostly put that in for contrast. |
Ladislav 12-Mar-2013 [1847] | I understand that you put the "if START = END" rule there to have the definition simple enough but not simpler than useful |
BrianH 12-Mar-2013 [1848] | Well, if you think bump should have primacy, triggering an error for 0 before you even look at start or end is the only thing that makes sense. And the velocity model for bump is the only justification for its existence at all if start-vs-end has primacy. Really, it can be anything we want as long as it makes sense :) |
Ladislav 12-Mar-2013 [1849] | However, I must agree with Fork that we need a general loop in Rebol no matter what. (see e.g. iteration in the decimal range as an example) Just the dialect he proposed does not look sensible to me when compared to the general loop I am using for a long time.) |
BrianH 12-Mar-2013 [1850] | I think that something as powerful as yours, but maybe a little friendlier for the newbies, and maybe with some REWORD-style thoroughness, might work. I think that we need to go beyond the old style of general loop though - we're competing against languages with list comprehensions, not just C-like languages :) |
Ladislav 12-Mar-2013 [1851] | But CFOR can do list comprehensions easily, I do not see any problem with that |
older newer | first last |