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

World: r3wp

[Core] Discuss core issues

Geomol
31-Mar-2009
[13361]
Then do:


f: has [file] [file: copy/part read %somefile 30 comment "do something 
with the file" return file]
[unknown: 5]
31-Mar-2009
[13362x2]
Yeah my example used copy so that might defeat it.
f: has [q][q: [] append q read %blah remove/part q 20 also q q: none]
Geomol
31-Mar-2009
[13364x3]
That doesn't work. your local q holds data after returning from F. 
(maybe an error)
>> f: has [q] [q: [] append q "kdfjkd" also q q: none]
>> a: f
== ["kdfjkd"]
>> a
== ["kdfjkd"]
>> source f

f: func [/local q][q: ["kdfjkd"] append q "kdfjkd" also q q: none]
It seems, q has data in the end.
[unknown: 5]
31-Mar-2009
[13367]
I didn't try it :-)
Geomol
31-Mar-2009
[13368]
My opinion right now is, that ALSO sucks big time! :-)
Maybe someone can convince me otherwise.
[unknown: 5]
31-Mar-2009
[13369]
I couldn't but I see the difference using it.
Geomol
31-Mar-2009
[13370x2]
It seems hard to use, it often result in using twice the memory, 
that people expect. And it might even lead to pad program structure.
pad -> bad
Izkata
31-Mar-2009
[13372]
newPread: func [URL] [read/binary URL]  ;  I only want the large 
timeout in this function, not in other 'read calls


f: has [file] [file: copy/part read %somefile 30 comment "do something 
with the file" return file] ; I'm also going for readability, otherwise 
I would have done something like this with the original code
[unknown: 5]
31-Mar-2009
[13373x2]
John, actually the piece I think I was showing you the first time 
is what I meant.  The series in the second one is actually desired 
behavior.
f: func [/local q][q: "blahblahblahblahblah" also q q: none]
Geomol
31-Mar-2009
[13375x2]
Is this expected behaviour?

>> f: func [/local q][q: "blahblahblahblahblah" also q q: none]
>> a: f
== "blahblahblahblahblah"
>> source f
f: func [/local q][q: "blahblahblahblahblah" also q q: none]
>> insert a "hmm"
== "blahblahblahblahblah"
>> source f
f: func [/local q][q: "hmmblahblahblahblahblah" also q q: none]
>> a: none
== none
>> source f
f: func [/local q][q: "hmmblahblahblahblahblah" also q q: none]
Izkata, you got a point with your Pread. But it's not a secure function, 
because it may crash. Let me see, how I would make such a function...
[unknown: 5]
31-Mar-2009
[13377x2]
Works for me John
>> a: f: has [q][q: "blahblahblahblahblah" also q q: none]
>> a
== "blahblahblahblahblah"
Geomol
31-Mar-2009
[13379]
Now do:
source f
[unknown: 5]
31-Mar-2009
[13380x2]
>> f
== "blahblahblahblahblah"
>> a: f
== "blahblahblahblahblah"
>> source f
f: func [/local q][q: "blahblahblahblahblah" also q q: none]
what is wrong with it?
Geomol
31-Mar-2009
[13382]
So what does your q: none at the end do? It doesn't release any memory.
[unknown: 5]
31-Mar-2009
[13383]
I believe it does.  I believe that q will be freed.
Geomol
31-Mar-2009
[13384]
You can see, it doesn't this way:

>> f: func [/local q][q: "blahblahblahblahblah" also q q: none]
>> a: f
== "blahblahblahblahblah"
>> insert a "more blahblahblahblah"
== "blahblahblahblahblah"
>> source f

f: func [/local q][q: "more blahblahblahblahblahblahblahblahblah" 
also q q: none]

Look at the source of f. Notice the "more blahblah...."
[unknown: 5]
31-Mar-2009
[13385x5]
Oh, I see.
then what about this:
a: f: has [q][q: copy "blahblahblahblahblah" also q q: none]
That last one I forgot is no different then the one I showed you 
earlier.
So I don't know in this case.  Is q actually set to none or would 
it be anyway on the return from the function since it used copy? 
 Dunno.
TomBon
31-Mar-2009
[13390]
unfortunatly the same story...
does anybody knows why a replace on the second and third also
changes the first letter?  ^JKSE = %5E/KSE and  ^IKSE = %5E-KSE
but ^MERV = %5EMERV and therefore okay.

	probe load replace/all  mold "^MERV" #^ "%5E"
	probe load replace/all  mold "^JKSE" #^ "%5E"
	probe load replace/all  mold "^IKSE" #^ "%5E"

any advise is highly appreciated...
tom
Geomol
31-Mar-2009
[13391]
Paul, in your last example with copy, the q memory is released, and 
the string after copy remains. So this actually is a version with 
something gained. Now I have to think, if I would do it this way.
Izkata
31-Mar-2009
[13392x4]
Tom: it's not the replace that's doing it...
>> "^IKSE"
== "^-KSE"
>> "^MERV"
== "^MERV"
>> "^JKSE"
== "^/KSE"
>> "^IKSE"
== "^-KSE"
but I have no actual answer
Well, ^I is a control-i.. and in vim, that inserts a tab.  ^- is 
the tab character in Rebol
I must go to class now
TomBon
31-Mar-2009
[13396]
thx for the info izkata.
Geomol
31-Mar-2009
[13397x2]
Paul, I would probably do:

o: context [q: "blahblah" f: does [insert q "more blah" q]]


And my that have full control over q. It depends on the application, 
I guess.
my -> by
[unknown: 5]
31-Mar-2009
[13399]
I'll stick with ALSO.  ;-)
Geomol
31-Mar-2009
[13400x5]
Izkata, about the timeout. It seems here, that when the open/binary 
returns, the data is immediately available, so the timeout has no 
effect. I'm on OS X, maybe it's different under windows?
Anyway, I can now see, how you use ALSO with ports. By using a function 
approach, you choose to copy the data out to some further external 
computation. And it's up to the user of the function to free the 
data, when finished. I would take an object approach and store the 
data in the object. Then external computation can work on the data 
in the object. I feel, it's confusing using ALSO, but maybe it's 
just me.
An object approach could look like this:

Ports: context [
	Port: none
	Data: none

	Pread: func [URL] [
		either error? try [Port: open/binary URL] [
			print ["Can't open:" URL]
			false
		][
			Data: copy Port
			close Port
			true
		]
	]
]
Using it would then be:

if Ports/Pread http://www.rebol.com[
	... do something with Ports/Data ...
]
Where I see a potential problem with ALSO, is if you in a function 
load a local var with a huge amount of data, say 1GB. And then to 
release that data ends your function with:
also copy local-data local-data: none


At that moment between the two arguments to ALSO, you have 2 GB of 
data allocated. The first 1 GB is freed, when the garbage collector 
comes to it.
[unknown: 5]
31-Mar-2009
[13405]
So is this your assurance to us that we will never see ALSO in your 
code?
Geomol
31-Mar-2009
[13406]
No no, I never say never. ehh ;-)
Izkata
31-Mar-2009
[13407]
Geomol: [Izkata, about the timeout. It seems here, that when the 
open/binary returns, the data is immediately available, so the timeout 
has no effect. I'm on OS X, maybe it's different under windows?]

I'm on Ubuntu  ;)  but yeah, now that I think about it, that's true. 
 Originally it was written differently, and the error appeared to 
be on the copy.  I added it when mininova was timing out on certain 
requests due to high load - it seemed to make a difference then, 
but I don't know if it was coincidence or not.
Graham
31-Mar-2009
[13408]
mininova ? torrenting?
Izkata
31-Mar-2009
[13409x2]
Yeah, the internal function that RSS plugins on Azureus use broke 
at some point, so I'm doing it this way now.  Much nicer, as I can 
collect more information, etc
If you're thinking I'm making a torrrent client in Rebol, not yet 
 ;)