D - How break and return is handled in foreach?
- Ben Y. (9/9) Oct 24 2003 Hi, Walter and Sean.
- Patrick Down (12/21) Oct 24 2003 Look at the foreach documentation here
Hi, Walter and Sean. It looks like the foreach aggregate is using a lamda like function to do the loop, this is very much like std::for_each in C++. But std::for_each cannot handle break, return because the loop body is a functor. Neither can regular functional language construct like foldl. But how does foreach in D handle this? It's easy for arrays. But when an apply method is called, how does a break exit from the apply method? Is it a special exception? Ben.
Oct 24 2003
In article <bnbj91$24ki$1 digitaldaemon.com>, Ben Y. says...Hi, Walter and Sean. It looks like the foreach aggregate is using a lamda like function to do the loop, this is very much like std::for_each in C++. But std::for_each cannot handle break, return because the loop body is a functor. Neither can regular functional language construct like foldl. But how does foreach in D handle this? It's easy for arrays. But when an apply method is called, how does a break exit from the apply method? Is it a special exception? Ben.Look at the foreach documentation here http://www.digitalmars.com/d/statement.html#foreach The delegate generated for the foreach body will return a non zero value when it encounters a break. I'm not sure what happens with a return. <quote> The body of the apply function iterates over the elements it aggregates, passing them each to the dg function. If the dg returns 0, then apply goes on to the next element. If the dg returns a nonzero value, apply must cease iterating and return that value. Otherwise, after done iterating across all the elements, apply will return 0. </quote>
Oct 24 2003
"Patrick Down" <Patrick_member pathlink.com> wrote in message news:bnbtrs$2iud$1 digitaldaemon.com...Look at the foreach documentation here http://www.digitalmars.com/d/statement.html#foreach The delegate generated for the foreach body will return a non zero value when it encounters a break. I'm not sure what happens with areturn.<quote> The body of the apply function iterates over the elements it aggregates, passing them each to the dg function. If the dg returns 0, then apply goeson tothe next element. If the dg returns a nonzero value, apply must ceaseiteratingand return that value. Otherwise, after done iterating across all theelements,apply will return 0. </quote>Try various kinds of break, continue, return, and goto's out of a foreach body. You'll see that each is replaced with a return value, and there's a switch statement on these values automagically generated by the compiler to replace the foreach statement.
Oct 24 2003
Try various kinds of break, continue, return, and goto's out of a foreach body. You'll see that each is replaced with a return value, and there's a switch statement on these values automagically generated by the compiler to replace the foreach statement.I can understand that "return;" can be handled with a special return value. But what about "return someStruct;"? How does the return value get passed from the delegate to the apply function then to the calling function?
Oct 24 2003
"Ben Y." <Ben_member pathlink.com> wrote in message news:bnc3ec$2qcd$1 digitaldaemon.com...toTry various kinds of break, continue, return, and goto's out of a foreach body. You'll see that each is replaced with a return value, and there's a switch statement on these values automagically generated by the compilervalue. Butreplace the foreach statement.I can understand that "return;" can be handled with a special returnwhat about "return someStruct;"? How does the return value get passed fromthedelegate to the apply function then to the calling function?The easiest way to see how this works is to write a simple test program, compile it, and obj2asm it. It works generally like nested local variable access.
Oct 26 2003