World: r3wp
[Core] Discuss core issues
older newer | first last |
Graham 21-Apr-2009 [13613] | Then do a call/quit to the update.cmd script. |
eFishAnt 27-Apr-2009 [13614] | Just pulled the bullet from my foot. buffer: copy {} ;works better than buffer: {} I was suspecting, then finally tried (fixed a random-looking problem) Anyone know the efishantsea between these? buffer: copy {} vs clear buffer |
PeterWood 27-Apr-2009 [13615] | I think clear is faster but surprisingly seems to use more memory: >> fastest [buffer: copy {}] [clear buffer] The first code took 0:00:00.012196 The second code took 0:00:00.008569 >> fastest [buffer: copy {}] [clear buffer] The first code took 0:00:00.011403 The second code took 0:00:00.008293 >> stats == 63378943 >> loop 100000 [buffer: copy {} ] == "" >> stats == 66979663 >> recycle >> stats == 63378971 >> loop 100000 [clear buffer] == "" >> stats == 63379907 >> recycle >> stats == 63378971 |
eFishAnt 27-Apr-2009 [13616] | wow, nice analysis, Peter. Almost feel like AltME makes a good benchtop software scope...;-) Where does 'fastest come from? |
Geomol 27-Apr-2009 [13617x3] | Peter, I read you example, as clear use *less* memory than the copy method. >> 66979663 - 63378943 == 3600720 >> 63379907 - 63378971 == 936 |
I would expect clear buffer to be faster and use less memory than buffer: copy {} | |
And it seems to be so. | |
Henrik 27-Apr-2009 [13620] | there would be less GC with clear, too, wouldn't there? |
Geomol 27-Apr-2009 [13621] | yes |
PeterWood 27-Apr-2009 [13622] | Thanks, John. I only looked at the last few digits. I must read more carefully. Now the results are as I'd expect. |
Geomol 27-Apr-2009 [13623] | eFistAnt, Ladislav has some timing functions here: http://www.fm.tul.cz/~ladislav/rebol/timblk.r I just use: time: func [:f /local t][ t: now/time/precise do f now/time/precise - t ] And then time many loops of some code, like: >> time [loop 10000 [buffer: copy {}]] == 0:00:00.245122 |
PeterWood 27-Apr-2009 [13624] | Fastest is a trivial script that I use. I think many people have better ones. >> source fastest fastest: func [ f s /local st en ][ st: now/precise loop 10000 [do f] ed: now/precise print ["The first code took" difference ed st] st: now/precise loop 10000 [do s] ed: now/precise print ["The second code took" difference ed st] ] |
Geomol 27-Apr-2009 [13625] | Making the GC (Garbage Collector) to as little as possible is a good thing! (TM) :-) |
Robert 27-Apr-2009 [13626x2] | This looks strange to me: >> a: [a1 b1 a2 b2 a3 b3 a4 b4] == [a1 b1 a2 b2 a3 b3 a4 b4] >> extract/index a 2 1 == [a1 a2 a3 a4] >> extract/index a 2 2 == [b1 b2 b3 b4] >> extract/index a 2 3 == [a2 a3 a4 none] >> extract/index a 2 4 == [b2 b3 b4 none] >> extract/index a 2 5 == [a3 a4 none none] Why is NONE returned? I would expect just a shorter block. |
I don't see any cause to fill up the returned block with "virtual values". | |
[unknown: 5] 27-Apr-2009 [13628x2] | You can use my replacement for it |
skip+: make function! [ {Returns a series matching the skip sequence} series [series!] "Series to return skip values from." interval [integer!] "Skip interval" start [integer!] "Series index to start skipping from." /local blk ][ blk: copy [] if interval > (length? series) [return none] series: at series start while [not tail? series][ if (index? series) = start [insert tail blk first series start: start + interval] series: next series ] series: head series if empty? blk [return none] blk ] | |
Robert 27-Apr-2009 [13630] | Can I limit the end as well? Something like a SLICE? |
[unknown: 5] 27-Apr-2009 [13631] | not sure what you mean. |
Robert 27-Apr-2009 [13632x2] | I have a long series of fixed width and need to extract starting from a current position backwad/forward the x-th value. |
Your verison runs until the end of the series. I just need to skip the next 10 entries. | |
[unknown: 5] 27-Apr-2009 [13634x2] | just copy that part of the series into a new series. |
copy/part | |
Robert 27-Apr-2009 [13636x2] | I wanted to avoid the copy. |
But OK. | |
[unknown: 5] 27-Apr-2009 [13638] | :) |
Graham 27-Apr-2009 [13639x2] | Is there an easy way to break out of a nested loop? eg. forever [ forever [ if true [ break outside both loops ] ] ] |
use throw and catch I guess | |
PeterWood 27-Apr-2009 [13641x2] | You could try to convert one of your loops to a function and do something like this: >> y: func [] [ [ forever [ [ i: i + 1 [ print i [ if i > 3 [return [break]] [ ] [ ] >> i: 0 == 0 >> forever [do y] 1 2 3 4 |
In other cases where you want ot break out of the inner loop, just return an empty block: >> z: func [] [return []] >> forever [do z] (escape) | |
Steeve 28-Apr-2009 [13643] | Graham, catch and throw |
Graham 28-Apr-2009 [13644] | hehe .. that's what I said |
Steeve 28-Apr-2009 [13645] | ah... yes |
Geomol 1-May-2009 [13646] | Continuing from Puzzle Answers. Isn't this a bit funny or strange? First some failed attempts to make 2 a word of value 1: >> 2: 1 ** Syntax Error: Invalid time -- 2: >> set '2 1 ** Syntax Error: Invalid word-lit -- '2 >> set [2] 1 ** Script Error: Invalid argument: 2 So 2 shouldn't be a word. But then it's possible anyway with this trick: >> set to-word "2" 1 == 1 2 is still a number: >> 2 == 2 But 2 as a word exists: >> get to-word "2" == 1 I think, it's a bit strange. If it's intentional or not, I don't know. |
ICarii 1-May-2009 [13647x2] | the first behaviour (the error) would be the expected behaviour if you assume that base symbols such as number are protected from modification - this protection in R2 at least is not complete. |
consider trying to audit code with blocks made in word form.. another source of insecurity / bugs | |
Dockimbel 1-May-2009 [13649] | The only thing that blocks numbers to become word! values is the lexical scanner. When you type anything in console (or DO a file script), your input is first a string! value that gets LOADed (that's where the lexical scanner raises errors). TO-WORD allows to bypass the LOAD phase and force the conversion of any symbol to word! value. |
Geomol 1-May-2009 [13650] | Maybe it would be a good idea, if constructors like TO-WORD etc. would do a lexical scanning of the result? |
Dockimbel 1-May-2009 [13651] | Anyway, this gives us a probably unique method for strong code obfuscation. :-) |
ICarii 1-May-2009 [13652] | heh indeed! |
Geomol 1-May-2009 [13653] | heh, yeah! It's fun at times, but is it really a good idea? |
ICarii 1-May-2009 [13654] | the set to-word "2 + 2" with spaces is a bit of a worry |
Dockimbel 1-May-2009 [13655x2] | I agree, TO-WORD should enforce word! syntax rules on argument and raise syntax errors accordingly. That would be a more logical behavior. Maybe Carl had some design issues to workaround by allowing this (or maybe it's just an implementation flaw). |
>> set to-word " " "secret" == "secret" >> blk: reduce [to-word " "] == [ ] >> reduce blk == ["secret"] | |
Geomol 1-May-2009 [13657] | Good one! Nothing can be something in REBOL. :-) |
Dockimbel 1-May-2009 [13658] | There is no spoon or "The truth is elsewhere" could make nice REBOL baselines. ;-) |
ICarii 1-May-2009 [13659x2] | R3 however does do a whitespace check thankfully |
whitespace characters appear invalid in words in R3 - although if they are able to be redefined that could be an issue/weakness | |
Sunanda 1-May-2009 [13661] | Geomol <funny or strange> It gets odder ( or less consistent) as '+ does seem to be given special handing...... What I really wanted to do to solve the puzzle was: -- set to-word "2" 5 -- set to-word "+" none The block then becomes (in effect) do [5 none 5] == 5 But DOing the gimmicked block in R2 fell found of '+ being both a native and some hardwired syntax in the interpreter: set to-word "2" 5 set to-word "+" none blk: copy [] blk: reduce [to-word "2" to-word "+" to-word "2"] probe blk == [2 + 2] do blk ** Script Error: Invalid operator: + ** Near: 2 + 2 |
BrianH 1-May-2009 [13662] | In R2 the operators are special-cased by DO. In R3 they handle themselves (quicker that way). |
older newer | first last |