Hi, I think I found a simple solution: the ability to reference any variable. https://pharo.fogbugz.com/f/cases/19467/Metalinks-support-accessing-variable... This test shows how to use it for a temp: testAccessTemp | varNode instance | varNode := (ReflectivityExamples>>#exampleAssignment) ast body statements second. link := MetaLink new metaObject: self; selector: #tagExec:; arguments: {RBVariableNode named: #temp}. varNode link: link. self assert: varNode hasMetalink. self assert: (tag isNil). instance := ReflectivityExamples new . self assert: (instance exampleAssignment = 3). self assert: (tag = 3). I have not yet tested it for any other example, but it should work for your case, too, which would look like this: MetaLink new metaObject: [ :surface :trachelCanvas | surface clear: trachelCanvas color. ]; selector: #value:value:; arguments: {RBVariableNode named: #surface . RBVariableNode named: #trachelCanvas }. control: #instead.
On 12 Dec 2016, at 09:36, Marcus Denker <marcus.denker@inria.fr> wrote:
Hello,
Not yet. It should be easy to add if we find a good API for itâ¦
I will work on it this week (I have blocked some time for RF related hacking).
e.g I think we have to extend the syntax for reifications to use classes.
something like:
arguments: {RFTempReification named: #trachelCanvas};
The current symbols then would be the same as using
RFReification named: #object
But subclasses can be used directly and parametrized.
Marcus
On 5 Dec 2016, at 20:42, Peter Uhnak <i.uhnak@gmail.com> wrote:
Hi,
what is the best way to access variables from within a metalink?
for example I have a message send `surface clear` and I want to change it to `surface clear: trachelCanvas color`.
I can use #instVarNamed:
``` MetaLink new metaObject: [ :object | (object instVarNamed: #surface) clear: (object instVarNamed: #trachelCanvas) color. ]; selector: #value:; arguments: #(object); control: #instead. ```
but the above isn't exactly nice, plus it wouldn't work with temporary variables.
Thanks, Peter