r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Rebol School] Rebol School

Steeve
2-Jan-2009
[1009]
in R2:

map: func [vars list exec /local res][res: copy [] do reduce [:foreach 
vars list compose [append res (exec)]] res]
>> map [a b][1 2 3 4][a * b]
== [2 12]
>> map [a][1 2 3 4][a * a]
== [1 4 9 16]
Janko
2-Jan-2009
[1010x2]
hm, vary interesting
vary = very
BrianH
2-Jan-2009
[1012]
That has a couple problems but you are on the right track, Steeve 
:)
Janko
2-Jan-2009
[1013x2]
this is a little higher level rebol that I currently know, but very 
interesting to learn some new things
wow, compose is very interesting function
Steeve
2-Jan-2009
[1015]
and if you always use the same vars (like x, y and z) you can simplify:

 map: func [list exec /local res][res: copy [] do reduce [:foreach 
 intersect [x y z] exec list compose [append res (exec)]] res]
>> map [1 2 3 4][x * x]
== [1 4 9 16]
>> map [1 2 3 4][x * y]
== [2 12]
BrianH
2-Jan-2009
[1016]
Oh, that is "fixing" it in the wrong direction :(
Steeve
2-Jan-2009
[1017]
ahah, i know, you can't anymore use inner parents or brackets ;-)
BrianH
2-Jan-2009
[1018]
Nope, I was talking about 'res capture the first time, but you have 
added keywords in the second.
Steeve
2-Jan-2009
[1019x2]
don't see your point, what do you mean with res ?
oh you say i can't use res as var ?
BrianH
2-Jan-2009
[1021x2]
In your first version, you have a problem if the vars list includes 
the vars 'append or 'res. You need to compose your loop differently.
In your second version, everything after the "and if" part of the 
message was a bad idea for a library function :)
Steeve
2-Jan-2009
[1023x2]
oh i see...
map: func [vars list exec /local res][res: copy [] do reduce [:foreach 
vars list compose [append (res) (exec)]] res]
is that ok now ?
BrianH
2-Jan-2009
[1025]
Still has the problem with 'append.
Steeve
2-Jan-2009
[1026x2]
ahah, you want 'append as var too ?
map: func [vars list exec /local res][res: copy [] do reduce [:foreach 
vars list compose [(:append) (res) (exec)]] res]
BrianH
2-Jan-2009
[1028x2]
Let me look at it for a sec (unless you want to do it - this is the 
School group).
Start with this spec from R3:
map: func [

    {Evaluates a block for each value(s) in a series and returns them 
    as a block.}

    'word [word! block!] "Word or block of words to set each time (local)"
    data [block!] "The series to traverse"
    body [block!] "Block to evaluate each time"
] [...]
Steeve
2-Jan-2009
[1030]
hum seems it's bugous, right...
BrianH
2-Jan-2009
[1031]
It's native in R3, but if we get this right it could be a mezz backport 
in a future R2 release.
Janko
2-Jan-2009
[1032x2]
(this is beyond me but I will hapily watch)
( aha, 'word is how you can recieve word without evaluation ...  
a: func [ 'word val ][ set word val ] -- cool )
BrianH
2-Jan-2009
[1034x2]
OK, the words are set using block set semantics:
>> set [a b] [1]
== [1]
>> a
== 1
>> b
== none
>> map [a b] [1 2 3] [a * b]
** Script error: * does not allow none! for its value2 argument
** Where: map
** Near: map [a b] [1 2 3] [a * b]
Steeve
2-Jan-2009
[1036x2]
i saw...
simpler:

map: func [vars list exec][do reduce [:foreach vars list reduce [:append 
[] :do exec]]]
BrianH
2-Jan-2009
[1038]
Note that all functions of this type have bind/copy overhead of the 
code block (including FOREACH).
Steeve
2-Jan-2009
[1039x2]
>> map [x][1 2 3 4][x * x]
== [1 4 9 16]
>> map [x y][1 2 3 4][x * y]
== [2 12]
yes Brian
BrianH
2-Jan-2009
[1041]
Try to source that last version after running it a few times.
Steeve
2-Jan-2009
[1042x2]
i see nothing...
there no need of copy , it's copied by the reduce
BrianH
2-Jan-2009
[1044x2]
No, by the foreach.
It's inserted as-is by the reduce.
Steeve
2-Jan-2009
[1046]
hum ok
BrianH
2-Jan-2009
[1047]
(The teaching stuff is for Janko :)
Steeve
2-Jan-2009
[1048x3]
i thought it was strange
and finaly, we can use a single var:

map: func ['vars list exec][do reduce [:foreach to-block vars list 
reduce [:append [] :do exec]]]

>> map [x][1 2 3 4][x * x]
== [1 4 9 16]
>> map x [1 2 3 4][x * x]
== [1 4 9 16]
is it ok now Brian ?
BrianH
2-Jan-2009
[1051]
The outer do reduce is unnecessary now, but I see no problems :)
Steeve
2-Jan-2009
[1052x6]
it's only missing checking of allowed types
why it is no necessary ?
oh !
i don't see...
foreach need that trick
foreach allow only single var or a block of vars (he can't use the 
result of an evaluation)
BrianH
2-Jan-2009
[1058]
For that matter, the to-block is also unnecessary. Try this:

map: func ['vars list exec][foreach :vars list reduce [:append [] 
to-paren exec]]