Boost logo

Boost :

Subject: Re: [boost] compile-time for-loop
From: Larry Evans (cppljevans_at_[hidden])
Date: 2009-09-02 22:42:44

On 09/02/09 16:17, klaus triendl wrote:
> "Larry Evans" <cppljevans_at_[hidden]> schrieb im Newsbeitrag
> news:h7iq50$pjj$
>> 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:
>> This was part of a proposed patch to mpl's iter_fold_if to solve
>> a problem another booster had:
>> 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;

    ( type loopvalue = start
    ; looptest(loopvalue)
    ; loopvalue = binarynext(state, loopvalue)
    state = binaryop(state, loopvalue);

is equivalent to:

  type loopvalue = start;
  type loopstate = init_state;
   { 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?


Boost list run by bdawes at, gregod at, cpdaniel at, john at