Dear Attila,
forget swig, use verrazzano instead (http://common-lisp.net/project/fetter/); avoid common-lisp-controller; and only send the interesting part of the output next time.
my 0.02,
So the Verrazano project has been resurrected? Does it handle methods that are both overloaded and overridden? Is it possible to subclass a C++ class in Lisp via Verrazano? I started to develop support for both these features in Swig; maybe I should switch to Verrazano.
My subclassing-mechanism would look like the following :
(defun <subclass-name>-new (<constructor-lambda-list>) (create-object-subclassing-cpp (<constructor arguments for the superclass>) (make-<subclass-name>-struct <initializers for the additional attributes of the subclass>) <virtual method1> <lisp callback used for that method> <virtual method2> <lisp callback used for that method> ...))
Here's an example: --------------------------------------------------------------------------- class C1 { protected: double a; public: C1(double a1) { a = a1; } C1(int a1) { a = a1; } virtual void print() { cout << "print: " << a << endl; } };
class C2 : public C1 { private: double b; public: C2(double a1, double b1) : C1(a1) { b = b1; } virtual void print() { cout << "print: " << a << " " << b << endl; } };
(defstruct c3-struct (c3attr1 0 :type double-float) (c3attr2 0 :type double-float))
(defcallback1 c3-print :void ((cobj :pointer)) (with-struct (c3-struct- c3attr1 c3attr2) (cobj->lisp-struct cobj) (format t "~s~%" (list "from lisp" c3attr1 c3attr2))))
(defun c3_new (a1 b1) (create-object-subclassing-cpp (c2 a1 b1) (make-c3-struct :c3attr1 (+ a1 b1) :c3attr2 (- a1 b1)) print c3-print))
(let ((c3obj (c3_new 2d0 3d0))) (c2_swig_subcl_print c3obj) (c1_swig_subcl_print c3obj)) ;; Both of these will call the overriding methods. The polymorphism is ;; handled in C++, not in Lisp. ---------------------------------------------------------------------------
But this will only support single inheritance. Handling the additional attributes of the subclass is a little bit tricky: The function cobj->lisp-struct currently uses the c-object's address to lookup the lisp-struct in a hash-table. This is not as slow as it sounds in SBCL, but maybe there's a better solution. Since the garbage collector may move the Lisp objects around, there's no point in saving any addresses of Lisp objects in C. I also thought of closures in order to get rid of the struct, but closures used as C-callbacks are extremely inefficient (see the discussion on http://groups.google.com/group/sbcl-help-archive/browse_thread/thread/e01e88... ). Then I had another idea: I could save the closures in some global variable, array or hash and use a non-closure as a callback that delegates to the closure, see http://groups.google.com/group/sbcl-help-archive/browse_thread/thread/39c65b... .
Best regards, Bruno Daniel