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$1_at_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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk