On Sep 16, 2012, at 7:17 PM, Igor Stasenko wrote:

> Hello, there
> 
> i am happy to say that during last week, i found a cure for my
> callback code, and so finally callbacks are now working without
> crashing the VM. :)
> But before releasing it to public, first, i need to update VMs for
> that, because of additional callback support code in VM.
> 
> Right now, i'd like to discuss about different ways of
> defining/creating callbacks. And i need more input from people,
> because i think
> the way how i implemented it is good for get started, but it looks
> like there could be more convenient forms :)
> 
> So, the existing implementation, for creating a callback, you must
> make a subclass of NBFFICallback, overide #fnSpec method
> and then instantiate it by using:
> 
> callback := MyCallBack on: [:... some block ]
> 
> and then you must pass it somewhere (to some external function), and
> so, when callback get called, your block will handle it.
> 
> In objective-C, however it would be much nicer to have a smalltalk
> objects act as a Obj-C objects (so implementing a methods
> for it will naturally map them as a callbacks ).
> 
> For instance imagine that i wanna make own subclass of NSFoo obj-C class
> and wanna override the #bar method.
> And then i passing it as an obj-c instance around and each time ,Obj-C
> #bar message is sent to it , i got a #bar message sent to my smalltalk
> instance.
> That would be really cool, isnt? Despite it is only applicable to
> obj-c  because of similar object model :)
> 
> I imagine it could be done as following:
> in #bar method you putting a special pragma:
> 
> MyClass>>bar
> <objCMethod: 'int ()'>
>  ^ 5
> 
> that's it, you telling the compiler that given method can be called
> from Objective-C.. and you don't have to manually instantiate
> callbacks etc..
> 
> In fact, same form can be used for non-objC callbacks , you must just
> tell something like:
> 
> callback := (MyClass>>#bar) asCallbackFor: myObject.
> 
> here, you instantiating a callback, which when called, the object
> 'myObject' will receive #bar message. But unlike from Obj-C this
> callback
> won't work for all instances of MyClass, but just for specific one.
> 
> And third form is a variation of original one, instead of subclassing
> the NBFFICallback, actually i can change implementation to use special
> factory class(es) for it, so to create a callback you will do
> something like:
> 
> callbackFactory := NBFFICallback withSignature: #( int (int x, void * bar)).
> 
> callback := callbackFactory on: [:x :bar | .... ].
> 
> So, i'd like to hear your input, which one you like, and which ones
> you prefer to have
> 
> 1. requires creating a subclass of NBFFICallback, overriding it's
> fnSpec method. Takes a block closure as a callback.
> 2. first you must create a factory object by specifying a callback
> signature, then you can instantiate new callbacks by passing a block
> closure to that factory
> 3. to create a callback you must specify it's signature in one of the
> compiled methods, and specify an object which will receive a message
> when callback will be called.

for what it is worth I like the 3rd form. Now I'm not sure on: is the right 
selector.



Reply via email to