More progress… in the latest Pharo7 this is now working... (#operation reifies 
the original operation):

| link choice | 

choice := true.
link := MetaLink new metaObject: [ :operation | 
                                              UIManager default alert: 'Linked 
Version'.
                                              choice ifTrue: [operation value ].
                                           ];         
                selector: #value:;
                arguments: #(#operation);
                control: #instead.


(TestMetaLink >> #execute) ast link: link.
TestMetaLink new execute.
link uninstall.

No need for using #level: as #operation for method execution is reifying the 
*original* method that would have been executed without the link.

(this then is, too, what will be used to make finally “turning off” instead 
links work correctly: if the instead link is not active (due to a condition or 
level), it will
instead execute “operation value”, that is, what would have been done without 
the #instead link present.

        Marcus

> On 7 Nov 2018, at 15:47, Marcus Denker <marcus.den...@inria.fr> wrote:
> 
> Hi,
> 
> I added 
> 
>       
> https://pharo.fogbugz.com/f/cases/22642/instead-links-and-meta-level-original-code-not-executed
>  
> <https://pharo.fogbugz.com/f/cases/22642/instead-links-and-meta-level-original-code-not-executed>
> 
> as a workaround, you can use a #before link with an explicit return:
> 
> 
> choice := true.
> link := MetaLink new metaObject: [ :object :selector :arguments :context | 
>                                               UIManager default alert: 
> 'Linked Version'.
>                                               choice ifTrue: [ context sender 
> sender sender sender return: (object perform: selector withArguments: 
> arguments)].
>                                            ];         
>                 selector: #value:value:value:value:;
>                  arguments: #(#object #selector #arguments #context);
>                  control: #before;
>                level: 0.
> 
> (TestMetaLink >> #execute) ast link: link.
> TestMetaLink new execute.
> link uninstall.
> 
> (yes, the  context sender sender sender  shows that #context needs to do the 
> right thing when using  level: 0. or not… another thing to fix)
> 
>       Marcus
> 
>> On 7 Nov 2018, at 15:08, Marcus Denker <marcus.den...@inria.fr 
>> <mailto:marcus.den...@inria.fr>> wrote:
>> 
>> Hello,
>> 
>> I added a fist issue (and fix) for parts of the problem
>> 
>> https://pharo.fogbugz.com/f/cases/22641/Semantic-analysis-needs-to-take-instead-preambles-into-account
>>  
>> <https://pharo.fogbugz.com/f/cases/22641/Semantic-analysis-needs-to-take-instead-preambles-into-account>
>> https://github.com/pharo-project/pharo/pull/1960 
>> <https://github.com/pharo-project/pharo/pull/1960>
>> 
>> But after this, it does not work as the level just turns off calling the 
>> meta level code, but does not execute the
>> original code where the #instead is put.
>> (#instead in general needs more work in this implementation).
>> 
>> I will open another issue for that.
>> 
>>      Marcus
>> 
>>> On 31 Oct 2018, at 18:03, Vitor Medina Cruz <vitormc...@gmail.com 
>>> <mailto:vitormc...@gmail.com>> wrote:
>>> 
>>> Thanks! Is there an issue on fogbuzz where I can be notified of resolution? 
>>> Do you need me to create it?
>>> 
>>> After that how can update the code? Software update is safe or should I 
>>> create a new image?
>>> 
>>> regards,
>>> Vitor
>>> 
>>> On Mon, Oct 29, 2018 at 12:08 PM Marcus Denker <marcus.den...@inria.fr 
>>> <mailto:marcus.den...@inria.fr>> wrote:
>>> 
>>> 
>>>> On 25 Oct 2018, at 01:33, Vitor Medina Cruz <vitormc...@gmail.com 
>>>> <mailto:vitormc...@gmail.com>> wrote:
>>>> 
>>>> Hello,
>>>> 
>>>> I am playing with MetaLink, really cool!, but I am having issues that I am 
>>>> unsure if it's some erro or if I am doing something wrong (I am using 
>>>> Pharo 6.1 32 bits in windows.). Consider:
>>>> 
>>>> TestMetaLink>>execute
>>>>     UIManager default alert: 'Actual Version'.
>>>> 
>>>> And in Playground:
>>>> 
>>>> | link | 
>>>> 
>>>> link := MetaLink new metaObject: [ :object | UIManager default alert: 
>>>> 'Linked Version' ];        
>>>>                 selector: #value:;
>>>>                  arguments: #(#object);
>>>>                  control: #instead.
>>>> 
>>>> 
>>>> (TestMetaLink >> #execute) ast link: link.
>>>> TestMetaLink new execute.
>>>> link uninstall.
>>>> 
>>>> This works as expected, an alert with 'Linked Version' is promped. But 
>>>> then suppose I want to execute the actual node alongside with the linked 
>>>> one considering some condition:
>>>> 
>>>> | link choice | 
>>>> 
>>>> choice := true.
>>>> link := MetaLink new metaObject: [ :object :selector :arguments | 
>>>>                                               UIManager default alert: 
>>>> 'Linked Version'.
>>>>                                               choice ifTrue: [ object 
>>>> perform: selector withArguments: arguments].
>>>>                                            ];         
>>>>                 selector: #value:value:value:;
>>>>                  arguments: #(#object #selector #arguments);
>>>>                  control: #instead;
>>>>                  level: 0.
>>>> 
>>>> 
>>>> (TestMetaLink >> #execute) ast link: link.
>>>> TestMetaLink new execute.
>>>> link uninstall.
>>>> 
>>>> As I understand, level:0 is necessary in order to avoid an infinite loop, 
>>>> but then I get an error:
>>>> 
>>>> KeyNotFound: key #RFArgumentsReificationVar not found in Dictionary
>>>> 
>>>> Am I doing something wrong? Is that an error? 
>>>> 
>>> Hello,
>>> 
>>> Yes, this looks like a bug. I will fix it over the next days.
>>> 
>>>     Marcus
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
> 

Reply via email to