[Kde-bindings] Re: Creating Qt bindings for Common Lisp
Richard Dale
Richard_Dale at tipitina.demon.co.uk
Mon Jun 6 07:47:46 UTC 2005
Hi Mario
On Saturday 04 June 2005 17:15, Mario Tanev wrote:
> Hello,
>
> I was referred to you by Alexander Kellett who gave me some advice on
> writing Qt bindings for Common Lisp, and I would like to ask for some help.
>
> I am ussing UFFI (Universal Foreign Function Interface) with Common Lisp,
> and it can access c-style (i.e. for c++ extern "C") type functions,
> structs, primitives and pointers. I have looked through the Qt.cpp file
> with qtruby and smoke.h and am a little bit confused on how to get things
> started. Since smoke seems undocumented, I am not exactly sure how to
> interface with it.
Have a look at the smoke.h header in kdebindings/smoke and the code generated
in kdebindings/smoke/qt and kde. It is really based on a bunch of lookup
tables, and understanding Smoke involves finding out what the tables are for
and how they interelate.
> For instance I would need the following:
> 1. Accessing a class variable (I suppose the object is a struct when
> externed "C")
> 2. Creating an object of certain class
> 3. Calling a method of a class (I suppose this is done by passing the state
> to the method to determine which instance one is referring to)
> 4. Registering a callback function (written in lisp)
>
> Note, these questions refer to the c++ glue code that I would write,
> anything on the lisp side I can figure out myself.
>
> I am continuing to read Qt.cpp and I might figure out the answers to some
> of these questions, but I would appreciate your help.
The most important thing you need in common lisp is something like
method_missing in ruby or #doesNotUnderstand in Smalltalk, that is a
catch-all method for a method not implemented by an instance. So you trap the
method call in method_missing, and then look up the C++ method in the Smoke
runtime. If there is only one C++ method with the name, then you can call it
straight away. Otherwise, you need to resolve which method to call based on
the number and type of the lisp args passed to it.
You need to have a table which maps C++ pointers onto the corresponding lisp
instances as weak references. Then when a lisp instance is garbage collected
it must be removed from the table. Inside a lisp instance you need a means of
keeping a pointer to a small struct with details of the C++ instance. If that
isn't possible you would need to keep another mapping of lisp instance to C++
instance in the small struct (look for smokeruby_object in qtruby.h).
If you look at the archives of the kdebindings list, we did discuss a bit
about how Smoke works a couple of months ago (ideally subscribe to it). I'll
cc this mail to there anyway.
Regards
-- Richard
More information about the Kde-bindings
mailing list