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

World: r3wp

[Rebol School] Rebol School

BrianH
2-Jan-2009
[1163x2]
I'm going to do a study of all of the REBOL functions that generate 
series (even natives) and determine which would benefit from the 
/into option, then get it added. It might be tricky to modify actions 
though. REDUCE and COMPOSE are getting the /into option.
This is one of my R3 tasks. We'll backport where possible.
NickA
2-Jan-2009
[1165]
BrianH, how many of you are there actually working on R3 code?
BrianH
2-Jan-2009
[1166x2]
It varies, depending on the task. Right now many of us are taking 
a break and Carl is working on the development infrastructure. Other 
times there are a few in some cases, many in others. We'll be able 
to handle more after Carl's RebDev work.
Which is proceeding nicely :)
NickA
2-Jan-2009
[1168]
That's great to hear :)  I wish I could help, but I don't have the 
chops.  Maybe testing, promotion, things like that...
BrianH
2-Jan-2009
[1169]
We need those chops too :)
Steeve
2-Jan-2009
[1170x2]
just a thing Brian, insert (without tail) will revert the result 
and cause overhead by pushing previous added values in the loop...
missing something...
BrianH
2-Jan-2009
[1172]
No, it's a different problem: You have to assign the result of the 
insert  to output as you go along. This leads us to another variable 
captre problem.
Steeve
2-Jan-2009
[1173x2]
ok, i see now
but we should use change to do that job, not insert
BrianH
2-Jan-2009
[1175]
No, it doesn't change in place, and the /into should be able to insert 
in the middle of a provided series if necessary.
Steeve
2-Jan-2009
[1176]
change replace old values in output and expand the output serie if 
needed
BrianH
2-Jan-2009
[1177x2]
Insert will also expand, and we don't want to replace any existing 
values if any.
If you want to replace, clear the series before providing it.
Steeve
2-Jan-2009
[1179]
ok but i'm not convinced by the interest to be able to insert in 
the middle of a serie.
Steeve
3-Jan-2009
[1180]
ok but i''m not convinced by the interest to be able to insert in 
the middle of a serie
BrianH
3-Jan-2009
[1181x6]
This trick only works if it is pervasively implemented and consistent. 
It is a cross-cutting language design issue.
cross-cutting
 = Aspect-Oriented Programming term.
It means that function options of the same name should be implemented 
consistently and to whatever function applicable.
(in this case, that is what it means)
A REBOL example is the /only option.
The /only option means something different each time, but in general 
its usage is consistent:
- Do the sensible thing by default.
- Do the advanced thing when /only is chosen.
Every function with an /only option behaves this way.
Steeve
3-Jan-2009
[1187x2]
where is it already used ?
i mean /into
BrianH
3-Jan-2009
[1189x3]
In functions in R3, starting with COLLECT.
It will be used in many functions, and natives. REDUCE and COLLECT 
/into get rid of chained inserts, for instance. It also reduces series 
copy overhead. It will be a big deal when we hahve rolled it out 
across the board.
hahve -> have
Steeve
3-Jan-2009
[1192]
ok
BrianH
3-Jan-2009
[1193]
I think MOLD and FORM should get /into as well.
Steeve
3-Jan-2009
[1194]
and reduce ?
BrianH
3-Jan-2009
[1195x2]
I mentioned REDUCE and COLLECT already :)
Sorry, the last two mentions of COLLECT I meant COMPOSE :)
Steeve
3-Jan-2009
[1197]
erf
BrianH
3-Jan-2009
[1198]
It's been a long day.
Steeve
3-Jan-2009
[1199]
i have problems with my connexion, see you laters, nite...
BrianH
3-Jan-2009
[1200]
Good night.
[unknown: 5]
3-Jan-2009
[1201]
If you guys get some good  mezzanines please post them on my Mezzanine 
thread.  http://www.tretbase.com/forum/viewtopic.php?f=8&t=30Also, 
if anyone wants to make the current ones posted more efficient please 
do.
Gregg
3-Jan-2009
[1202]
If you're looking for HOFs, and other advanced information, check 
out Ladislav's articles: http://www.fm.tul.cz/~ladislav/rebol/
Sunanda
3-Jan-2009
[1203]
Or
http://www.rebol.org/view-script.r?script=hof.r
Geomol
3-Jan-2009
[1204]
REBOL is so nice, that if you miss some cool feature found in some 
other language, like the MAP function, you can make it in a line 
of code. We should add a wiki with such cool things from other languages, 
and how you do it in REBOL.
Steeve
3-Jan-2009
[1205x4]
As someone stated, what about a mezzanine thread for new proposal 
and discussions... ?
thinking about [fold] (aka reduce) ,

i don't know if it's really intersting to have it as mezzanine, cause 
it's really short:

fold y [1 2 3 4][x: x + y]

x: 0
repeat y [1 2 3 4][x: x + y]
wrong:
>>x: 0
>>foreach y [1 2 3 4][x: x + y]
[foreach] is our HHOF (higher higher order function)
map: func [
    [throw]

    "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"
    /into "Collect into a given series, rather than a new block"
    output [series!] "The series to output to"
] [

    unless into [output: make block! either word? word [length? data] 
    [divide length? data length? word]]

    head foreach :word data compose [output: (:insert)  output (to paren! 
    body)]
]
>> map x [1 2 3 4][x + x]
== [2 4 6 8]
>> map [x y][1 2 3 4][x + y]
== [3 7]
>> map/into [x y][1 2 3 4][x + y][10 11 12]
== [3 7 10 11 12]

But still a problem with the output var collision
Gregg
3-Jan-2009
[1209x2]
There are mezz groups in various places, but it does't look like 
we have a group for it here. Feel free to start one. Maybe add a 
checklist as well, for final versions and prioritizing. In any case, 
FOLD is not necessary, but nice for those that want it. REBOL lives 
in many worlds. One world is for imperative-minded folks, that don't 
know or care about HOFs and such, another is those that do.
fold: func [ ; i.e. Haskell foldl (fold left). Same as 'reduce in 
Python?
        series [series!]
        fn     [any-function!]
        /with  value "starting value; used as accumulator"
    ][
        if not with [value: pick series 1  series: next series]
        foreach item series [value: fn value item]
    ]
    sum: func [block [any-block!]] [fold block :add]

    product: func [block [any-block!]] [fold/with block :multiply 1]
    sum-of-squares: func [block [any-block!]] [
        fold block func [x y] [x * x + y] 0
    ]
Steeve
3-Jan-2009
[1211x2]
still on map, should be faster with /into


    len: to integer! either word? word [length? data] [divide length? 
    data length? word]

    either into [insert/dup output none len][output: make block! len]

    head foreach :word data compose [output: (:change)  output (to paren! 
    body)]
(no need of to integer!)