
On 09/02/09 16:17, klaus triendl wrote:
"Larry Evans" <cppljevans@suddenlink.net> schrieb im Newsbeitrag news:h7iq50$pjj$1@ger.gmane.org...
On 09/01/09 03:12, klaus triendl wrote:
I wonder whether a compile-time for-loop is useful enough so that it would get included in the mpl library; it's very similar to what fold does but it can be used for computations with types other than sequence containers.
The loop construct takes a start value, a loop condition and a function calculating the next start value for the next loop recursion and additionally a state together with a binary operation serving as loop body:
[snip] This sounds like while_recur found here:
https://svn.boost.org/trac/boost/attachment/ticket/3044/while_recur.cpp
This was part of a proposed patch to mpl's iter_fold_if to solve a problem another booster had:
http://article.gmane.org/gmane.comp.lib.boost.devel/190874/match=or_seq
However, for some reason (people too busy or maybe there's some bug someone's seen in while_recur), the topic's cooled off since there's no posts since 6/10/2009 :(
while_recur looks very similar to what I've thought of, but it can't do what I want (e.g. can't calculate the cross total from a given number)
The for-loop I imagine has two important characteristics: 1) resembles a runtime for-loop 2) loop expressions are separate from the state to calculate
pseudo runtime code to illustrate what I mean: type state; for(type loopvalue = start; looptest(loopvalue); loopvalue = binarynext(state, loopvalue)) { state = binaryop(state, loopvalue); }
I'm not convinced. You seem to be saying that a for loop can do something that a while loop can't. I thought a for loop was a "specialization" of a while loop; hence, anything a for loop does can be done by a while loop with some initialization. For example, the for loop you mention: type state; for ( type loopvalue = start ; looptest(loopvalue) ; loopvalue = binarynext(state, loopvalue) ) { state = binaryop(state, loopvalue); } is equivalent to: type loopvalue = start; type loopstate = init_state; while(looptest(loopvalue)) { loopstate = binarynext(loopstate, loopvalue) ; loopvalue = binarynext_value(loopstate, loopvalue) } Where loopstate is the for loop state and the init_state and binarynext_value are missing from the for loop. IOW, for while_recur, the state would be while_state = pair(loopvalue,loopstate) with the hopefully obvious definition of while_next and while_test written in terms of the binarynext and binarynext_value. StateValue(start) = pair(_,value); looptestStateValue(pair(state,value) = looptest(value) binaryopStateValue(pair(state,value) = pair(binaryop(state,value) Could you be more explicit about why while_recur can't do something which your for_ can do? -regards, Larry