MetaLinks with arbitrary number of arguments
Hi, is it possible to create a metalink on arbitrary amount of arguments? Right now the metaObject and selector must have the same number of arguments, e.g. MetaLink new metaObject: [ :object :selector :args | ... ]; selector: #value:value:value; arguments: #(object selector arguments) What I would like to have instead is something like... MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments) And then `allArgs` would either be an array with all the arguments, or maybe a Dictionary. Thanks, Peter
On 15 Mar 2017, at 10:35, Peter Uhnak <i.uhnak@gmail.com> wrote:
Hi,
is it possible to create a metalink on arbitrary amount of arguments?
Right now the metaObject and selector must have the same number of arguments, e.g.
MetaLink new metaObject: [ :object :selector :args | ... ]; selector: #value:value:value; arguments: #(object selector arguments)
What I would like to have instead is something like...
MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments)
And then `allArgs` would either be an array with all the arguments, or maybe a Dictionary.
Right now not⦠but it would be a nice addition. It could either use some magic (if the number of args requested are larger then the number of args of the selector it gives the rest as a dictionary). or, maybe better (less magic), this could be an option to be configured per link: MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments) options: #(argsAsDictionary) (which would allow #argsAsArray, too). Marcus
On Wed, Mar 15, 2017 at 10:49:51AM +0100, denker wrote:
On 15 Mar 2017, at 10:35, Peter Uhnak <i.uhnak@gmail.com> wrote:
Hi,
is it possible to create a metalink on arbitrary amount of arguments?
Right now the metaObject and selector must have the same number of arguments, e.g.
MetaLink new metaObject: [ :object :selector :args | ... ]; selector: #value:value:value; arguments: #(object selector arguments)
What I would like to have instead is something like...
MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments)
And then `allArgs` would either be an array with all the arguments, or maybe a Dictionary.
Right now not⦠but it would be a nice addition.
It could either use some magic (if the number of args requested are larger then the number of args of the selector it gives the rest as a dictionary).
or, maybe better (less magic), this could be an option to be configured per link:
MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments) options: #(argsAsDictionary)
(which would allow #argsAsArray, too).
Marcus
+1 for option, magic only brings suffering. :) Peter
On 15 Mar 2017, at 11:09, Peter Uhnak <i.uhnak@gmail.com> wrote:
On Wed, Mar 15, 2017 at 10:49:51AM +0100, denker wrote:
On 15 Mar 2017, at 10:35, Peter Uhnak <i.uhnak@gmail.com> wrote:
Hi,
is it possible to create a metalink on arbitrary amount of arguments?
Right now the metaObject and selector must have the same number of arguments, e.g.
MetaLink new metaObject: [ :object :selector :args | ... ]; selector: #value:value:value; arguments: #(object selector arguments)
What I would like to have instead is something like...
MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments)
And then `allArgs` would either be an array with all the arguments, or maybe a Dictionary.
Right now not⦠but it would be a nice addition.
It could either use some magic (if the number of args requested are larger then the number of args of the selector it gives the rest as a dictionary).
or, maybe better (less magic), this could be an option to be configured per link:
MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments) options: #(argsAsDictionary)
(which would allow #argsAsArray, too).
Marcus
+1 for option, magic only brings suffering. :)
This should be easy.. I will look into it hopefully this week. Marcus
Hi, Here is a slice that implements the #argsAsArray option: https://pharo.fogbugz.com/f/cases/19857/add-option-argsAsArray from a speed perspective, the question is if a dictionary makes sense⦠as it would need to be created at runtime. Marcus
On 15 Mar 2017, at 11:25, denker <marcus.denker@inria.fr> wrote:
On 15 Mar 2017, at 11:09, Peter Uhnak <i.uhnak@gmail.com> wrote:
On Wed, Mar 15, 2017 at 10:49:51AM +0100, denker wrote:
On 15 Mar 2017, at 10:35, Peter Uhnak <i.uhnak@gmail.com> wrote:
Hi,
is it possible to create a metalink on arbitrary amount of arguments?
Right now the metaObject and selector must have the same number of arguments, e.g.
MetaLink new metaObject: [ :object :selector :args | ... ]; selector: #value:value:value; arguments: #(object selector arguments)
What I would like to have instead is something like...
MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments)
And then `allArgs` would either be an array with all the arguments, or maybe a Dictionary.
Right now not⦠but it would be a nice addition.
It could either use some magic (if the number of args requested are larger then the number of args of the selector it gives the rest as a dictionary).
or, maybe better (less magic), this could be an option to be configured per link:
MetaLink new metaObject: [ :allArgs | ... ]; selector: #value:; arguments: #(object selector arguments) options: #(argsAsDictionary)
(which would allow #argsAsArray, too).
Marcus
+1 for option, magic only brings suffering. :)
This should be easy.. I will look into it hopefully this week.
Marcus
On 20 Mar 2017, at 16:34, denker <marcus.denker@inria.fr> wrote:
Hi,
Here is a slice that implements the #argsAsArray option:
https://pharo.fogbugz.com/f/cases/19857/add-option-argsAsArray
from a speed perspective, the question is if a dictionary makes sense⦠as it would need to be created at runtime.
This test show how to use it: testReifySendArgsAsArray | sendNode instance| sendNode := (ReflectivityExamples>>#exampleMethod) ast body statements first value. link := MetaLink new metaObject: self; selector: #tagExec:; arguments: #(selector context); options: #(argsAsArray). sendNode link: link. self assert: sendNode hasMetalink. self assert: (ReflectivityExamples>>#exampleMethod) class = ReflectiveMethod. self assert: (tag isNil). instance := ReflectivityExamples new . self assert: (instance exampleMethod = 5). self assert: (tag isArray). self assert: (tag first == #+). self assert: (tag second class == Context).
participants (2)
-
denker -
Peter Uhnak