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 >>> >>> >>> >>> >>> >>> >>> >> >