World: r3wp
[!REBOL3-OLD1]
older newer | first last |
BrianH 13-Feb-2009 [11235] | Use FORALL for the R3 version of GATHER - FORALL is faster than FOREACH in R3. |
Henrik 13-Feb-2009 [11236] | ASSEMBLE might be a nice word to reserve. |
Steeve 13-Feb-2009 [11237] | Could be disturbing for beginners, a same thing can be writed using so many various ways with the tons of mezz we have now. |
BrianH 13-Feb-2009 [11238] | Yeah. For an assembler :) We want reserve COMPILE too :D |
Henrik 13-Feb-2009 [11239] | Steeve, you have a point. For a couple of years, I would write mezzanines for things that already existed in R2, but hadn't noticed. |
Steeve 13-Feb-2009 [11240] | ahah, shame on you ;-) |
BrianH 13-Feb-2009 [11241] | I'm converting GATHER to mezzanine/library code standards now. We'll probably put all of these is an advanced series manipulation library module. |
Steeve 13-Feb-2009 [11242] | types-of is ugly Brian :) |
BrianH 13-Feb-2009 [11243x2] | You have no idea. TYPES-OF was the only reflector that had no corresponding hack in R2. I had to do it from scratch. |
Mezzanine-quality version of Henrik's GATHER, R3 version: gather: func [ "Get the values of a given field from all objects in a block." block [block!] word [word!] /into "Insert into a buffer instead (returns position after insert)" output [series!] "The buffer series (modified)" ][ unless output [output: make block length? block] forall block [ all [ object? block/1 in block/1 word output: insert/only output select block/1 word ] ] either into [output] [head output] ] | |
PeterWood 13-Feb-2009 [11245x3] | Has the spec for make function! been changed on purpose in R3? Is for what reason? |
Is => if | |
>> a: make function! [spec] [body] ** Script error: cannot MAKE/TO function! from: function! ** Where: make ** Near: make function! [spec] [body] >> my-func: make function! [[b] [print b] ] == make function! [[b][print b]] | |
BrianH 13-Feb-2009 [11248x2] | Yes. Reason: To simplify and speed up MAKE, and REBOL, and to make code generation easier. |
Use the wrappers if you want to be R2 compatible. | |
Steeve 13-Feb-2009 [11250] | Brian, are you sure that (output: insert/only output ..) is faster than (append/only output) in R3 ? |
BrianH 13-Feb-2009 [11251] | No, it's not, but not by much and it's necessary for the /into option. |
Steeve 13-Feb-2009 [11252] | ah yes, i forget |
BrianH 13-Feb-2009 [11253x2] | Strangely enough the REBOL overhead of the /into option (one UNLESS, one EITHER, and n assignments) is dwarfed by the overhead saved if the /into option is implemented pervasively. |
Plus, I can copy-paste most of the code :) | |
Steeve 13-Feb-2009 [11255] | and you say that foreach is slower than forall in this case ? (overhead with 3 path evaluations block/1 , no ?) |
Henrik 13-Feb-2009 [11256] | BrianH, nice GATHER function. :-) |
BrianH 13-Feb-2009 [11257x2] | FOREACH does a BIND/copy of its code block, but you might have a point in this case because the 3 paths are N*3. |
Final submitted R3 version: gather: func [ "Get the values of a given field from all objects in a block that have it." block [block!] "A block which may contain objects" word [word!] "The field to look for" /into "Insert into a buffer instead (returns position after insert)" output [series!] "The buffer series (modified)" ][ unless output [output: make block length? block] foreach item block [all [ object? :item in item word output: insert/only output select item word ]] either into [output] [head output] ] | |
Henrik 13-Feb-2009 [11259] | So FOREACH is better, anyway? |
Steeve 13-Feb-2009 [11260] | not anyway |
Henrik 13-Feb-2009 [11261] | Argh, I need to read better. You wrote this already. |
BrianH 13-Feb-2009 [11262x2] | It seems like speed is more important than memory in this function. |
Henrik, if you can write up a CureCode wish for this function I can mark it as pending. | |
Henrik 13-Feb-2009 [11264] | For GATHER? Should I just copy your code and credit it to myself? :-) |
Steeve 13-Feb-2009 [11265] | yes, we all do that :) |
BrianH 13-Feb-2009 [11266] | Write up a descriptive request, explaining why you need it, or reference your R3 chat message number. |
Henrik 13-Feb-2009 [11267] | Sounds bureaucratic, but OK :-) |
BrianH 13-Feb-2009 [11268x2] | CureCode is documentation of the new functions. We need the bureaucracy for the users' sake. |
If we don't have a record of why the function was added we won't know where to puut it when we modularize R3. | |
Henrik 13-Feb-2009 [11270] | Posted. |
Steeve 13-Feb-2009 [11271] | Henrik, don't forget to add: "Approved by the politburo" |
Henrik 13-Feb-2009 [11272x2] | :-) |
And 10 lines for signatures. | |
BrianH 13-Feb-2009 [11274] | That's my job (read the ticket comments :) |
Henrik 13-Feb-2009 [11275] | Curecode needs a trigger for rebdev links. |
BrianH 13-Feb-2009 [11276x5] | It will get one, but for now I say something like "R3 chat 1436". |
That is the /into option message, so I remember it :) | |
Here's the R2 version of GATHER: gather: func [ "Get the values of a given field from all objects in a block that have it." block [block!] "A block which may contain objects" word [word!] "The field to look for" /into "Insert into a buffer instead (returns position after insert)" output [series!] "The buffer series (modified)" ][ unless output [output: make block length? block] foreach item block [all [ object? get/any 'item in item word output: insert/only output get/any in item word ]] either into [output] [head output] ] | |
Do you want a /deep option? | |
That will require switching to PARSE for speed. | |
Henrik 13-Feb-2009 [11281x2] | I don't think it's worth it. |
for me it makes the most sense to gather values from a particular level. | |
BrianH 13-Feb-2009 [11283x2] | We can always add another CureCode wish for /deep if we need it. The current function is fast, so that's nice. |
I marked the ticket as pending, with the particular submitted files that contain it. | |
older newer | first last |