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

World: r3wp

[Core] Discuss core issues

Geomol
20-Dec-2008
[11738]
:-) It gets worse, if all parameters should be set to none:

f: func [v /local a b c][
	a: 1 b: 2 c: 3
	print [v a b c]

	set bind head remove find first :f /local 'a none
	print [v a b c]
]

Try:
>> f 42
BrianH
20-Dec-2008
[11739]
Keep in mind that unless you have a known name reference to a function, 
the code inside the function has no idea which function it is inside, 
so a native would need a reference to a function or a word with the 
function assigned to it or it won't work - natives aren't magic.
Geomol
20-Dec-2008
[11740x3]
Hm, I don't need the HEAD, so it can be:
set bind remove find first :f /local 'a none
Brian, do you know, if it's possible from outside a function to specity 
its context? (To be used in the second parameter for BIND.)
*specify*
BrianH
20-Dec-2008
[11743]
You don't need the find either. John, your example with ALSO:

f: func [v /local a b c][
	a: 1 b: 2 c: 3
	print [v a b c]

	also
		print [v a b c]
		set bind remove first :f 'a none
]
Geomol
20-Dec-2008
[11744x3]
nah, doen't work.
*doesn't*
:-) It has to find the /local and remove it.
[unknown: 5]
20-Dec-2008
[11747x2]
use difference
difference first :f [/local]
BrianH
20-Dec-2008
[11749]
In answer to your question, in R2 it is only possible from outside 
a function to retrieve its context. You were doing so in your example. 
It doesn't have any meaning when the function isn't running, but 
you can't get a reference to the function from the inside.
[unknown: 5]
20-Dec-2008
[11750x2]
But Brian, what if an other function is called inside the function 
your trying to release from?
just as an ending line in your function that says:

clear-locals this-function
Geomol
20-Dec-2008
[11752]
I was thinking about making a clear-locals function, but then I need 
to access the context of the function calling clear-locals (from 
clear-locals).
BrianH
20-Dec-2008
[11753x2]
Remember, the /local refinement is also a local variable, so if you 
want to clear *all* the locals you also need to clear the word versions 
of the refinements.
For the most part you don't need to clear *all* of the locals, just 
a select few that still refer to large series or structures.
[unknown: 5]
20-Dec-2008
[11755]
Brian, it is one of those "While were at it" scenarios
BrianH
20-Dec-2008
[11756]
John, you can't just access the context of a calling function or 
even the current function, even from a native. The code block your 
code is in can be assigned to many functions, and isn't bound to 
any context. Words are direct bound individually. If you want to 
clear a context, yo have to specify which one in a parameter.
Steeve
20-Dec-2008
[11757x4]
fun: func [spec body /local me][
	me: construct append copy/deep [
		clear-all: [set bind copy next next first self self none]
	] body	
	me/clear-all: does me/clear-all
	clear find spec /local
	func spec bind body me 
]

f: fun [/local c d ][ c: d: 1 probe self print [c d ] clear-all print 
[c d]]
f
a function with a context for local vars
but not perfect, all vars which are set (including globals) are redefined 
as locals
but there is an idea
BrianH
20-Dec-2008
[11761]
You can't get access to a function's context without having a known 
word that is already bouund to that context. When you do first :f, 
the words retrn are not bound to the function's context. In R2, when 
you do third :f you get words that are bound, but you can only guess 
to what., since words are bound individually. The only safe way to 
do clear-words is to pass both the function and a known word bound 
to the function's context, and even then you have to copy the fuunction's 
argument block and convert any refinements to words before you bind 
the copy.
[unknown: 5]
20-Dec-2008
[11762x4]
exactly
that is why I'm attempting this with third and using clear-locals 
:func :arg
actually :fnc
not got it yet though
BrianH
20-Dec-2008
[11766]
You can't assme that any of the words in the block retuurned by third 
are bound to the function's context, even if  they are spelled the 
same as argument words or refinements.
[unknown: 5]
20-Dec-2008
[11767]
why not?
BrianH
20-Dec-2008
[11768x2]
Sorry, I meant second. Second returns the code block. The first and 
third blocks are definitely *not* bound to the function's context.
I mean the words in those blocks. The blocks themselves can't be 
bound at all - only words can be bound.
[unknown: 5]
20-Dec-2008
[11770]
So brianH are you saying it is impossible in R2 to send a function 
within a func to clear the parent functions locals?
BrianH
20-Dec-2008
[11771x4]
No, just difficult unless you provide 2 parameters:
- A reference to the function or a copy of its parameter list.
- A word known to be bound to the function's context.
Even then, it is not very efficient. You are better off clearing 
select words explicitly.
This is part of why R3's function contexts are different: to make 
this kind of thing unnecessary.
As a side effect, the clear-words function would be impossible in 
R3.
[unknown: 5]
20-Dec-2008
[11775]
What part would be inefficient?
BrianH
20-Dec-2008
[11776]
Getting a the argument list, which you would have to copy, convert 
refinements to words, then bind. The copy and conversion would be 
slower than necessary.
[unknown: 5]
20-Dec-2008
[11777x3]
Yeah I don't know if the overhead is worth it.
R3 in 09?
Hmm..  I should sell T-shirts with that on it.
BrianH
20-Dec-2008
[11780]
Developer releases at least, and maybe before then.
[unknown: 5]
20-Dec-2008
[11781x4]
Everyone would ask "What is R3?" and then we could tell them about 
REBOL.
>> myfunc: func [arg /local lcl lcl2][
[        lcl: "I still have a value"
[        lcl2; 2
[        clear-locals :myfunc lcl
[        print lcl
[        print lcl2
[    ]
>>
>> myfunc 2
none
none
>>
typo in my function
>> myfunc: func [arg /local lcl lcl2][
[        lcl: "I still have a value"
[        lcl2: 2
[        clear-locals :myfunc lcl
[        print lcl
[        print lcl2
[    ]
>>
>> myfunc 2
none
none
Steeve
20-Dec-2008
[11785x2]
clearly guys, a function should never be so huge and obscufated so 
that it will not be any more interesting to use a clear-locals func.
i meant, it's better to do a my-var: none when necessary
[unknown: 5]
20-Dec-2008
[11787]
I disagree.