[Openmcl-devel] CCL <-> C++ interface generator in alpha, reviewers wanted
Jason E. Aten
j.e.aten at gmail.com
Mon Apr 4 14:51:35 PDT 2011
If anyone is interested in C++ interfaces from CCL, please read on.
I've finished modernizing (a nice word for hacking the heck out of) the CFFI
module SWIG to wrap my large-ish C++ codebase so that I can call it and test
it from CCL. I can't submit my changes back to SWIG without writing a bunch
of runtime tests for William the maintainer; those tests have yet to be
written. And I'd rather eat my own dogfood for a while to iron out any
latent bugs. Nonetheless, everything compiles and the resulting plugins
load cleanly without manual code changes, which was my goal. So while it
isn't publicly available, I would like to have it reviewed for obvious
blunders (quite likely since I'm new to CL).
That is, I'd appreciate having a more experienced Lisper's perspective on
the design while the metal is still hot and maleable.
If you are interested in trying the new cffi.cxx or reviewing the
auto-generated Lisp interface, please contact me off list. Even cursory
feedback would be appreciated. I'll paste a micro example below.
Thank you.
Jason
---
A micro example of calling into arity-overloaded C++ methods from lisp:
;;;;;;;;;;;;;;;; file: micro_test.cl (adapt the path in the :cd command as
appropriate) ;;;;;;;;;;;;;;;;;;;;;
(eval-when (:execute :load-toplevel :compile-toplevel)
(require :cffi))
(cl:defpackage :micro
(:shadowing-import-from :cffi :defcallback)
(:use :cl :ccl :cffi))
(in-package :micro)
(:cd "/home/jaten/dj/micro")
(ccl:open-shared-library "/home/jaten/dj/micro/micro.so")
(load (compile-file "micro.lisp")); :print nil :verbose nil)
(load (compile-file "micro-clos.lisp"))
(setf m (make-instance 'MicroTestCppClass))
;;
;; Demonstrate calls to methods that are overloaded with different arity in
C++.
;; Since Common Lisp doesn't support method overloading (apparently,
;; please correct me if I've misunderstood the comments at the bottom of
;; page 194 of Practical Common Lisp), I had to give
;; each of these guys a differnt name/symbol...
;;
(method_MicroTestCppClass_cpp_overloaded_method0 m)
;;; output:
; 8
;
(method_MicroTestCppClass_cpp_overloaded_method1 m 10)
;;; output:
; In MicroTestCppClass::cpp_overloaded_method : returning your argument plus
9
; 19
;;;;;;;;;;;;;;;; file: micro.h ;;;;;;;;;;;;;;;;;;;;;
#ifndef MICRO_H
#define MICRO_H
#include <stdio.h>
class MicroTestCppClass {
public:
int cpp_overloaded_method();
int cpp_overloaded_method(int an_int_argument);
};
#endif // MICRO_H
;;;;;;;;;;;;;;;; file: micro.i ;;;;;;;;;;;;;;;;;;;;;
%module micro
%{
#include "micro.h"
%}
%feature("export");
%include "micro.h"
;;;;;;;;;;;;;;;; file: micro.cpp ;;;;;;;;;;;;;;;;;;;;;
#include <stdio.h>
#include "micro.h"
int MicroTestCppClass::cpp_overloaded_method() {
printf("\n In MicroTestCppClass::cpp_overloaded_method : returning 8\n");
return 8;
}
int MicroTestCppClass::cpp_overloaded_method(int an_int_argument) {
printf("\n In MicroTestCppClass::cpp_overloaded_method : returning your
argument plus 9\n");
return an_int_argument + 9;
}
;;;;;;;;;;;;;;;; file: Makefile ;;;;;;;;;;;;;;;;;;;;;
all: micro
micro:
swig -cffi -c++ micro.i
g++ -c micro_wrap.cxx -fpic -o micro_wrap.o
g++ -c micro.cpp -fpic -o micro.o
g++ -shared micro.o micro_wrap.o -o micro.so
test:
ccl < micro_test.cl
clean:
rm -f *.o micro_wrap.cxx micro-clos.lisp micro.lisp micro.so *.lx64fsl
*~
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20110404/53cf4620/attachment.htm>
More information about the Openmcl-devel
mailing list