Page 1 of 1

modifying the foreach variable from within the foreach body

Posted: 16 Jan 2018 17:12
by mdosnov2016
Hello,
is there any way to modify the foreach variable from within the foreach body?
e.g.

Code: Select all

foreach Y = std::fromTo(1, 100) do  <command to change the value of Y>
I need to re-start the loop with different begin and end values, and I cannot
implement this without recursion.
Michael

Re: modifying the foreach variable from within the foreach body

Posted: 16 Jan 2018 18:10
by Paul Cerkez
I don't remember if it exists in VIP or not but how about a "while" loop instead of a foreach?

pseudo code:

Code: Select all

Y = 1 While Y < 100,    <do steps>    < change value of Y (either increment by 1 or set to 100)> End While.
in pseudo VIP:

Code: Select all

... Y=1, MyWhileLoop(Y, Omega), % Omega is the upper limit) ....   MyWhileLoop(Y, Omega):-  %This is your 'while' loop    Y<Omega, !,   <do steps>     MyWhileLoop1(Y, Omega, NewOmega),     ... MyWhileLoop(Y, Omega).   MyWhileLoop1(Y, Omega, NewOmega):-  % this is the looping 'control' (value of Y)      <do condition check for terminating>       !,       NewOmega = Y,       MyWhileLoop(Y, NewOmega ).   MyWhileLoop1(Y, Omega, NewOmega):-       NewY = Y +1,       NewOmege = Omega,       MyWhileLoop(NewY, NewOmega).

Re: modifying the foreach variable from within the foreach body

Posted: 17 Jan 2018 8:33
by mdosnov2016
I know how to do recursion, thank you.
The problem with recursion is that it eats up the whole of my stack.
The problem is not with tail-recursive predicates, but with others
that call each other thousands of times...
b.r. Michael

Re: modifying the foreach variable from within the foreach body

Posted: 17 Jan 2018 12:43
by Paul Cerkez
sorry, missed the implied cannot use recursion.

Deferring to Thomas.

Re: modifying the foreach variable from within the foreach body

Posted: 17 Jan 2018 13:21
by Paul Cerkez
Michael,

dumb question. I'm confused.

Are you trying to restart the same foreach() loop from within the foreach() loop but with new start and stop numbers based on a action/decision within that loop?

<clause>:-
... steps ...
foreach(), %change the iterations of this loop and restart just the loop from within
end foreach.
... more steps ...
<end clause>.

OR,
are you just trying to stop the loop 'early' once a condition is met?

I get both possibilities when reading your initial post.

Re: modifying the foreach variable from within the foreach body

Posted: 17 Jan 2018 15:38
by Thomas Linder Puls
What you are asking for is impossible. "Green" variables are not modifiable.

Furthermore std::fromTo(...) nondeterministically returns a sequence of numbers, it does not look at the current value of Y to find the next value.

Re: modifying the foreach variable from within the foreach body

Posted: 17 Jan 2018 17:08
by Paul Cerkez
Thomas,
The std::fromTo() 'sets' the next value of 'Y' from the sequence each time though, correct?

Re: modifying the foreach variable from within the foreach body

Posted: 18 Jan 2018 9:42
by Thomas Linder Puls
Yes, that is what I mean by "nondeterministically returns a sequence...". I.e. it returns one value at the time nondeterministically.