Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

[REBOL] Rolling your own ideal looper: does Repeat still have a bug? Re:(4)

From: galtbarber:mailandnews at: 28-Aug-2000 16:27

The original question, which may have been posted by Paul Tretter, but I don't remember exactly, was something like this: a: "101" foreach item a [ print index? item ] Now, we all know why that doesn't work. This does, but probably doesn't really address his concern: forall a [ print index? a ] and now you have to remember to reset a a: head a and you have to use "first a" to get the element everywhere in your code. Sometimes I myself have wished I could have my cake and eat it too. I want the index that forall gives and I want the ease of use of the assigned word for each element. I am pretty dang sure lots of other Rebolers out there beside me have come across the same thing. So I wrote something that did that, but I couldn't figure out how to do that simply. Gabriele came up with a wonderful little gem and Ladislav and he made some more little improvements. So, here it is, a kind of foreach with index access: ideal-looper: func [ 'element [word!] 'index [word!] series [series!] code [block!] /local f i ] [ f: func reduce [[throw] element [any-type!] index] code i: 1 while [i <= length? series] [f series/:i i i: i + 1] ]
>Regards, > Gabriele.
And that's why we love Rebol! And the punchline for Paul would be this usage: a: "101" ideal-looper item indx a [ print [item indx] ] the output is: 1 1 0 2 1 3 == false And of course, there is no harm in having calls to "ideal-looper" multiply nested or used inside recursively called functions. And the words used for the element and index are also just known in the "scope" of the code block, and will not stomp on your global wordspace. I still don't really understand Ladislav's addition of Throw and [any-type!]. Would anyone care to divulge? -Galt