[REBOL] Re: [Fwd: Re: For Each]
From: dness:home at: 21-Jun-2001 9:42
Joel Neely wrote:
> Hi, Ammon,
>
> Having learned REBOL after Perl myself, maybe I can offer a
> few "quick translation" hints...
>
> >
> > I need to 'for each' thru a text-list, what is the correct
> > syntax??
> >
>
> If you'll pardon my being picky, I wanted to mention that one
> of the first "Aha!" experiences I had with REBOL was realizing
> that it uses very little "syntax", in the conventional sense.
> There is syntax for literals of the various data types (e.g.
>
> 1.2
>
> is a DECIMAL! while
>
> 1.2.3
>
> is a TUPLE!), but beyond that everything is just expressions
> with literals (including words), operators, and functions.
>
> The reason I belabor this point is that it makes it easier to
> understand some of the more interesting code you'll find in
> the example library.
>
> >
> > I have this:
> >
> > lst1-len: length? head lst1/data
> > for i 1 lst1-len 1[
> >
> > Which will execute the correct number of times, but how do
> > I get a different value from the list each time like I can
> > in Perl with an array using the index number??
> >
>
> Do it just as you would in Perl (TMTOWTDI!) with the REBOL
> functions that correspond to the Perl statements:
>
> 1a) If you just want the individual values, and don't really
> care about the indexes, you'd write this in Perl as
>
> foreach $item (@array) {
> #... do something with $item ...
> }
>
> The corresponding REBOL function (using your sample) is
>
> foreach item lst1/data [
> ;... do something with ITEM ...
> ]
>
> 1b) If you don't even care about preserving the array in
> Perl, you might write it as
>
> while ($item = shift @array) {
> #... do something with $item
> }
>
> which could be expressed (sort of ;-) with the REBOL function
>
> forall blockvar [
> ;... do something with blockvar/1
> ;... or use first blockvar
> ]
>
> except that REBOL lets you say
>
> blockvar: head blockvar
>
> to "restore" the block.
>
> 2) If you just want to know how to get value based on their
> positions (indexes), you'd use the Perl expression
>
> $array[$i]
>
> to access the element of @array at position $i . In REBOL
> you can use PICK and POKE to get and set values in a block:
>
> pick blockval i
>
> and
>
> poke blockval i newval
>
> but you MUST use indexes that already exist! (Perl will let
> you extend an array by simply storing something in the "next"
> index position, but REBOL requires you to APPEND to a block
> if you really want to increase its length.)
>
> You can also fetch values from a block via position by using
> a path with an embedded get-word in it, as in
>
> blockvar/:indexvar
>
> to get the element at the position identified by INDEXVAR.
>
> Now for the controlling functions.
>
> 3a) If you want to iterate over the index values in Perl,
> you'd say something like
>
> for ($i = 0; $i < @array; ++$i) {
> #... do something with $array[$i] ...
> }
>
> The most direct REBOL analogue is the FOR function, as you
> suspected:
>
> for i 1 length? lst1/data 1 [
> #... use PICK/POKE or LST1/DATA/:I
> ]
>
> But that's overkill if you really just want to
>
> 3b) Don't forget that REBOL positions always start at 1
> (instead of the 0 origin commonly used in other languages).
>
> repeat i length? lst1/data [
> #... use I as the index (as above)
> ]
>
> which will start I counting from 1 and step by 1 through the
> maximum count (LENGTH? LST1/DATA in this example).
>
> There are a few more variations, but those should get you
> through the most common cases.
>
> HTH!
>
> -jn-
I find it very helpful. I would think it useful to collect `notes' about
this kind of transl(iter)ation from perl and other languages. For those of
us who come to REBOL after some substantial experience with other languages
it is a big help.