[Ecls-list] Binding C/C++ Functions From Calling C/C++ Code

Juan Jose Garcia-Ripoll juanjose.garciaripoll at googlemail.com
Mon Feb 23 09:26:28 UTC 2009


On Thu, Feb 19, 2009 at 6:58 AM, Nikhilesh S <s.nikhilesh at gmail.com> wrote:
> I wanted to ask whether there's any function in the ECL C library to
> bind a C function from a program to a Lisp function. [...]
> cl_bind(&add, "c-add", /*min params*/ 1, /*max params*/ 1);

Hi, and first of all sorry about the late answer. ECL cannot bind
arbitrary C functions to lisp symbols. The reason is pretty obvious:
Lisp functions take and return lisp objects and have pretty well
defined and limited calling conventions. C/C++ functions do not.

There are several approaches to what you want to do.

1) Write a Lisp wrapper that follows our calling conventions. Something like

cl_object lisp_add(cl_object a, cl_object b) {
   cl_fixnum fa = fix(a);
   cl_fixnum fb = fix(b);
   return1(MAKE_FIXNUM(fa+fb));
}

2) Write the previous code but in Lisp and compile it

(defun add (a b)
  (ffi:c-inline (a b) (:int :int) :int "#0+#1" :one-liner t))

3) Use a foreign function interface to link your C function with lisp.
This basically automates the previous two steps. It is explained in
the manual.

Juanjo

-- 
Instituto de Física Fundamental, CSIC
c/ Serrano, 113b, Madrid 28009 (Spain)
http://juanjose.garciaripoll.googlepages.com




More information about the ecl-devel mailing list