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
[1024]
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
[1058x2]
For that matter, the to-block is also unnecessary. Try this:

map: func ['vars list exec][foreach :vars list reduce [:append [] 
to-paren exec]]
That handles the 'do capture too :)
Steeve
2-Jan-2009
[1060x3]
argh...
right
i forget the :vars trick, damn...
Janko
2-Jan-2009
[1063]
at the end you two will have just map: func [ ] [ ] and it will work 
:)
Steeve
2-Jan-2009
[1064]
shame on me
BrianH
2-Jan-2009
[1065x2]
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"
] [
    foreach :word data reduce [:append [] to-paren body]
]
Try it :)
Janko
2-Jan-2009
[1067]
I can just say wow to both
Steeve
2-Jan-2009
[1068]
that's good
BrianH
2-Jan-2009
[1069]
Add a [throw] attribute and it will be good enough for a mezzanine 
:)
Steeve
2-Jan-2009
[1070]
as i said before Janko, just some instructions, ;-)
Janko
2-Jan-2009
[1071]
very cool, this would deserve another blogpost
BrianH
2-Jan-2009
[1072]
I'll post it to DevBase in the R2 section.
Steeve
2-Jan-2009
[1073]
the trick about the no need of an intial copy [] when we use foreach 
is so cool