Hi,

I think I found a simple solution: the ability to reference any variable.
https://pharo.fogbugz.com/f/cases/19467/Metalinks-support-accessing-variables-for-arguments

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.den...@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.uh...@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
>> 
> 


Reply via email to