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/e01e8891c5b8b428/6f2adf6a9425a5cc?hl=en#6f2adf6a9425a5cc ). 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/39c65b2f08229118/017b9d81c3af905f?hl=en#017b9d81c3af905f . Best regards, Bruno Daniel _______________________________________________ cffi-devel mailing list cffi-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel