[mercury-users] Simulating passed data with Mercury/C#

Fergus Henderson fjh-mailbox-58 at galois.com
Wed Apr 5 11:24:30 AEST 2006


On 18-Mar-2006, Jonathan Morgan <jonmmorgan at gmail.com> wrote:
> I have been looking at graphical bindings for Mercury/IL, and the
> bindings from C to C# do not appear to support passing data to
> callbacks very well.
> 
> The first binding I looked at was Ticklesharp, as it would seem fairly
> simple to add IL support to mtcltk.  However, this relies on passing
> the Mercury closure to call as data to Tcl_CreateCommand.  There is no
> data passed by TickleSharp, so my "generic" handler  would need to
> know both the name of the command that had been invoked and the
> Mercury closure to call.
> 
> Next I looked at Gtk#.  It too does not take user data that is then
> passed to the callback that has been registered.  The response I got
> was that "The Gtk# paradigm for the user_data parameter is to create
> your delegate from an instance method on a class and hold the data
> member in an instance field."  I don't believe that Mercury can do
> that, as Mercury foreign procedures in C# are all in static functions,
> that cannot access instance variables.
> 
> So the question is, is there any way that we can simulate this user
> data so that we can register the same callback with different pieces
> of data associated, and then use that data?  Is it possible to create
> our own class with the call-back method and instance variables, and
> then register the callback from that class, but still call the static
> Mercury-exported functions?

Yes.  This looks like a good time to use inline C# code
(e.g. pragma foreign_decl).  The inline C# code would
declare a class with a field of type Object

	:- pragma foreign_decl("C#", "
		class CallBack {
			Object my_closure;
			public CallBack(Object closure) { my_closure = closure; }
			public void callback(...) { call_mercury_closure(my_closure, ...); }
		}
	").

Then you can use that class in pragma foreign_proc declarations,
e.g. the one that calls Tcl_CreateCommand() or its equivalent.

-- 
Fergus Henderson                    |  "I have always known that the pursuit
                                    |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.
--------------------------------------------------------------------------
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the users mailing list