World: r3wp
[Rebol School] Rebol School
older newer | first last |
BrianH 2-Jan-2009 [982] | And REDUCE means something different. |
Janko 2-Jan-2009 [983x3] | aha thanks , yes rebol's reduce has a different meaning I know |
if you are using blocks which seems fine as it's even shorter and more agile (and similar to quotations in factor), but how do blocks define which parameter is which , in case of map it must take 1 parameter in case of reduce 2 ? | |
I am not too deeply familiar of what blocks are, I suppose these are [ block of code ] that you can then "do" | |
BrianH 2-Jan-2009 [986] | The blocks take no parameters - the calling functions take additional parameters of the argument word(s). |
Janko 2-Jan-2009 [987] | uh, I don't understand what is what.. I will rather wait and see how it's done in R3 :) |
BrianH 2-Jan-2009 [988x2] | So R3's MAP takes 3 parameters: - The data - The word or block of words that will serve as "parameters" for the block. - The block of code. >> help map USAGE: MAP 'word data body DESCRIPTION: Evaluates a block for each value(s) in a series and returns them as a block. MAP is a native value. ARGUMENTS: word -- Word or block of words to set each time (local) (word! block!) data -- The series to traverse (block!) body -- Block to evaluate each time (block!) |
>> map x [1 2 3] [x * x] == [1 4 9] | |
Janko 2-Jan-2009 [990] | aha, I get it , that is nice |
BrianH 2-Jan-2009 [991] | >> map [x y] [1 2 3 4 5 6] [x * y] == [2 12 30] |
Janko 2-Jan-2009 [992] | cool |
BrianH 2-Jan-2009 [993] | We will see what other HOFs we will add to R3, in REBOL style. FOLD looks promising :) |
Janko 2-Jan-2009 [994] | great, well map and fold are the most used ones by far |
BrianH 2-Jan-2009 [995] | Many already have REBOL equivalents, named differently. REBOL was not designed by functional programming enthusiasts. |
Janko 2-Jan-2009 [996] | I got used to them so if something is can be cleanly solved by one of them and I have to write some temprorary variables and foreach loops feel bad :) |
BrianH 2-Jan-2009 [997] | R3 has major improvements to FOREACH - it will get used a lot more :) |
Janko 2-Jan-2009 [998x4] | yes, that's why I was asking, you have all sorts of interesting thigns like do, reduce (rebol's), I have seen apply in R3 , so I see there should be a lot of interesting stuff possible but don't have a clear picture what is and what isn't yet |
good | |
this seems to work as simple map fpmap: func [ series mod ] [ new: copy [ ] foreach item series [ append new mod item ] new ] | |
fpmap [ 1 2 3 ] func [a][ a * 100] == [100 200 300] | |
BrianH 2-Jan-2009 [1002] | For the simple case of an argument function taking one parameter, sure. |
Janko 2-Jan-2009 [1003x3] | well your R3 map will surelly be more powerfull, but it's nice to know I can make simple HOFs in R2 too |
I mean map that you made examples off | |
fpreduce: func [ series samp mod ] [ foreach item series [ samp: mod samp item ] samp ] fpreduce [ 1 2 3 ] 0 func [s a][ s + a] == 6 | |
BrianH 2-Jan-2009 [1006] | You can make REBOL-style control functions like R3's MAP in R2 too. |
Janko 2-Jan-2009 [1007x2] | really? that would be nice, I imagine I "do" the block , but before I have to somehow set those variables, I mean words |
but that I have no idea how ... probably something with set, but how do I take the words | |
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. |
older newer | first last |