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
[13335]
If you want to load more MP3s, it would be a good idea to reuse the 
same memory area. An example:

>> f: func [/local blk] [blk: []]   
>> a: f
== []
>> insert a 42
== []
>> a
== [42]
>> source f
f: func [/local blk][blk: [42]]
>> clear a
== []
>> source f
f: func [/local blk][blk: []]


You see, A and BLK inside F points to the same memory. Next time 
you call F, you can put some more stuff in BLK (read another MP3).

If you want to be able to completely remove BLK, I would do that 
using an object. Build the MP3 player as an object, instead of just 
a function. Makes sense?
[unknown: 5]
31-Mar-2009
[13336x3]
Sure, John, but what if you don't want to load more mp3s?
Of if between loading mp3s you have other functions that are operating 
and you want to ensure that your keeping memory use at optimal levels?
I see no alternative to having the functionality of ALSO in those 
cases.
Geomol
31-Mar-2009
[13339]
You still have to set the MP3 data returned from your function to 
none to release the memory (making the garbage collector to work). 
I would handle this situation either by making a refinement to my 
function or (probably better) creating the whole thing as an object.
[unknown: 5]
31-Mar-2009
[13340x2]
that is what we do with ALSO, we set the return item to none.
also mp3data mp3data: none
Geomol
31-Mar-2009
[13342x2]
f: func [/clear /local blk] [
	either clear [
		blk: none
	] [
		blk: []
		comment "do something with blk"
		 return blk
	]
]
But your memory isn't cleared by using ALSO! You still get something 
back from your function. You have to clear this later in your code.
[unknown: 5]
31-Mar-2009
[13344x3]
no you don't have to.  The garbage collector will take care of that.
The also function should be used as the last line of your function.
I gotta run for a bit but will be back in about an hour or sooner.
Geomol
31-Mar-2009
[13347x3]
Yes, I understand that. What I don't understand, is how you call 
these functions, and what does on with the data, you get returned 
from your function. Do you have code examples online, I can look 
at?
what *goes* on ...
Using ALSO returns some data. If your code look like this:

mp3-data: load-mp3-function


and that load-mp3-function ends with an ALSO, setting the local var 
to none, you still have a full copy in mp3-data. Actually you end 
up having 2 copies for some time, until the garbage collector frees 
the local version. Later in your code, you need to set mp3-data to 
none to free to memory (which the garbage collector does). Now, is 
this how you use ALSO and why you need it?
Izkata
31-Mar-2009
[13350x5]
Most of mine are for conciseness - for example, when no data needs 
to be returned:

Client: first wait Listen
Data: also (copy Client) (close Client)
but, like before, say that happened in a function
Process: func [Client][
   ..do stuff..
   return also (copy Client) (close Client)
]

Client: first wait Listen
Logfile/add Process Client
I'll look for some actual code I'm using soon
Pread: func [URL /local Port][
   Port: open/binary URL
   Port/timeout: 3 * 60
   return also (copy Port) (close Port)
]
Geomol
31-Mar-2009
[13355x2]
What happens, if the connection fails?
Does my version work the same as yours beside the timeout?

newPread: func [URL] [read/binary URL]

And can the timeout be set somewhere in the system object?
[unknown: 5]
31-Mar-2009
[13357]
f: has [file][file: read %somefile also copy/part file 30 file: none]
Geomol
31-Mar-2009
[13358x2]
My guess is, that your version using ALSO use the double memory, 
that mine does (because of the copy).
Paul:

f: does [copy/part read %somefile 30]
[unknown: 5]
31-Mar-2009
[13360]
John, yes true but what if you want to do several things with the 
local in the function?  Are you going to copy it every time?
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...."