World: r3wp
[Core] Discuss core issues
older newer | first last |
Dockimbel 30-Mar-2009 [13292] | It seems that there's no specific semantic rule in R2 for a get-word! as first item of a path! value. So, it's just treated as word!. >> a: [b 123] == [b 123] >> :a/b == 123 >> a/b == 123 |
Gabriele 31-Mar-2009 [13293x2] | Geomol: the best exaple is: also copy port close port |
but it's so useful in so many cases... | |
Geomol 31-Mar-2009 [13295x3] | If you do: my-port: also copy part close port then why not just do: my-port: copy port close port |
part -> port | |
I'm wondering, if your need for ALSO is because you structure your programs differently than I do? | |
Henrik 31-Mar-2009 [13298x2] | I think it was to get rid of 'my-port. ALSO is useful when returning, so you don't need to assign another word for results that would otherwise be temporary. I use ALSO in a couple of places here. |
process-port: func [port] [ also copy port close port ] versus: process-port: func [port /local p] [ p: copy port close port return p ] | |
Geomol 31-Mar-2009 [13300] | What happens, where you call process-port? Don't you have a variable there? |
Henrik 31-Mar-2009 [13301x2] | That depends on the structure of the program, I guess. |
In R2, it's still fairly elegant: >> source also also: func [ {Returns the first value, but also evaluates the second.} value1 [any-type!] value2 [any-type!] ][ get/any 'value1 ] | |
Geomol 31-Mar-2009 [13303x2] | So you have this process-port function, and you need ALSO to not have an extra variable. I would just write: ... copy port close port without calling some function to do it. |
I don't see ALSO as elegant, if there is no need for it. It's bloat in my eyes. (I may change my mind sometime, when I see good use of it. I haven't seen that yet.) | |
Henrik 31-Mar-2009 [13305x2] | As said, it's about the return value: 1. maybe you need the function in 50 places 2. maybe you need the return value from the function |
It does really untie a small knot there and I've bumped into that quite often. It was discussed heavily a year ago in the r3-alpha world and Carl wanted it in. I remember the discussion was mostly what to name it. :-) | |
Geomol 31-Mar-2009 [13307] | Yes, I read that discussion again yesterday. I remember, that I also didn't see the great use of it back then. :-) |
Henrik 31-Mar-2009 [13308] | I guess you've not bumped into that knot. |
Geomol 31-Mar-2009 [13309] | Maybe if I see a bit larger program, that use ALSO!? |
Henrik 31-Mar-2009 [13310] | anway, I would be sad to see it go, so I want it to stay. |
Geomol 31-Mar-2009 [13311x2] | I learned a program structure more than 20 years ago called "program 95%". It's a structure, you use 95% of the time when programming COBOL (and probably also in most other langauges). Maybe the need for ALSO is related to how we structure our programs? |
The structure is basically: init get-input loop [handle input get-input until end] cleanup | |
Henrik 31-Mar-2009 [13313x2] | I'm not sure it is. For the port example above, there's no way to return without ALSO or assigning a temporary variable. If you are using it inside another function, like process-port, it will only reduce overhead, not create more. |
and you really want functions like that to be simple. | |
Geomol 31-Mar-2009 [13315] | What is the overhead for calling a function compared to not call it? And by having the close down in a function mean, it may not be on the same level as the open, which may be seen as bad programming style. |
Henrik 31-Mar-2009 [13316] | as said, if you use the function in 50 places... |
Geomol 31-Mar-2009 [13317] | So you have port: open ..... my-port: process-port port many places, where I suggest: port: open ... my-port: copy port close port |
Henrik 31-Mar-2009 [13318] | no, you may exactly _not_ have 'my-port. you may be doing a test on the port which does not require an extra word. |
Geomol 31-Mar-2009 [13319x2] | I would never do the first, because there is no close to be seen for every open. |
So you don't really need to copy the port? It's just for a test, like: port: open .... while [port] [ .... ] close port | |
Henrik 31-Mar-2009 [13321x2] | sorry, the content. |
I give up. :-) gotta get back to coding. | |
Geomol 31-Mar-2009 [13323] | :-) I need to see bigger examples to understand you guys. |
Henrik 31-Mar-2009 [13324] | ask Carl on Chat. I think that's best. It was his idea anyway. |
Oldes 31-Mar-2009 [13325] | Geomol: I wonder why you have a problem with 'also now. It was discussed on 10-Aug-2007 on r3-alpha in new-functions group - and you were one of the people who were in this discussion |
Geomol 31-Mar-2009 [13326] | Yes, I then said, I didn't see the need for it, but I suggested a good name. Now 1.5 years later, I still don't use it. I'm asking, if people use it, because if I see good use of it, I hope to use it myself. |
Oldes 31-Mar-2009 [13327] | I'm not using it.. I'm not coding in R3 yet. Also when I test 'also now, it looks that there is no speed gain. |
Izkata 31-Mar-2009 [13328x2] | Huh.. I didn't know there was an 'also - I defined my own function long ago that does what it does |
I've used it in a couple places, almost always having to do with ports - it is much nicer than spanning 3 lines for the same thing | |
Geomol 31-Mar-2009 [13330] | Do you have any code, I can see? To see how you use it. |
[unknown: 5] 31-Mar-2009 [13331x2] | John, consider if you have a local variable in a function. Then calling also can clear that local variable. This is what I use 'ALSO for the most and why it is way cool. |
It is way cool when the item your returning is the very item you want to clear. | |
Geomol 31-Mar-2009 [13333] | And why do you want to clear it? To save resources? But what then with the version, you return? |
[unknown: 5] 31-Mar-2009 [13334] | Yes to save resources. For example, what if I just read an MP3 file into a word? I want to free that word so that it no longer is allocated to that data. |
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 | |
older newer | first last |