[Ecls-list] how to call a lisp program von C with ECL

Dean O'Connor dean.oconnor at ite.com.au
Thu Nov 3 16:39:18 UTC 2005


Hello Frank,

I was in the same position a few weeks ago and was asking similar questions.
Unfortunately there does not seem to be an abundance of up to date doco 
for how to do this yet.

This file CVS file msvc\c\cinit.c has a basic example.
Also recently some examples of calling Lisp scripts from multiple C 
threads was added to CVS, into subdir examples\threads\import.

Note: The last arg of cl_def_c_function specifies how many args the 
declared function has.

Probably one of my best sources of examples came from the XChatlisp 
plugin that uses ECL.
This C file has good stuff: 
http://cvs.sourceforge.net/viewcvs.py/xchatlisp/eclplugin/plugin.c?rev=1.20&view=markup

If you look in the mail list archives and search for "dean" you will 
find my thread of questions and answers that should help aswell.

This link should show it:
http://sourceforge.net/search/?type_of_search=mlists&forum_id=1307&group_id=30035&atid=0&words=dean&Search=Search

Accessing string args was something that took this mailing list to answer.
Here are some snippets from my C++ app and Lisp scripts that should give 
you examples of how to accomplish it.
Note: I configured my ecl with --enable-threads. Also I am not sure 
about my values for the 2nd arg of ecl_make_foreign_data, but it seems 
to work :)

*** Simple loading of Lisp script in C ***

int main(int argc, char* argv[])
{
        cl_boot(argc, argv);

        printf("Booting CL completed.\n");

        cl_object form_base = c_string_to_object("(load 
\"myscript\")");        // No need for file extension. This will auto 
detect .lsp .lisp or .fasl (compiled) files

        cl_safe_eval(form_base, Cnil, OBJNULL);      // Execute the 
command. ie. load the script.

    return 0;
}

**** Setting foreign strings/int in C ****

        char name[] = "VAR1";
        char value[] = "STRING-VALUE";

        // Note: Here you are setting the actual string pointer as the 
foreign data value.

        cl_object ff_obj = ecl_make_foreign_data(c_string_to_object("(* 
:char)"), strlen(value)+1, value);
        cl_set(c_string_to_object(name), ff_obj);

       int global_int = 10;

       cl_object ff_obj2 = 
ecl_make_foreign_data(c_string_to_object("INT"), 
sizeof(global_int),&global_int);
      cl_set(c_string_to_object("VAR2"), ff_obj2);

**** A C function (added to Lisp world) that returns a foreign string ****

char returned_str[] = "String returned";

static cl_object
new_function()
{
        cl_object ff_obj = ecl_make_foreign_data(c_string_to_object("(* 
:char)"), strlen(returned_str)+1, returned_str);
        return ff_obj;
}

**** Lisp script: Accessing those foreign variables ***

;; Note: Further examples of using convert-from-foreign-string can be 
found in CVS source contrib/win32/win32.lisp

;; To get foreign string values (eg. that value of "VAR1" variable set 
in above C function)

(ffi:convert-from-foreign-string var1 :null-terminated-p t)

;; To get an foreign integer value.

(ffi:deref-pointer var2 :int)

**** Alternate (OLD ?) method for setting foreign strings ***

    // Note: Here you are setting the pointer TO the string pointer as 
the foreign data value.
    // IMO the previous method is better cause you don't need to create 
a pointer-to-pointer like this method.

   char *string_ptr = "hi there";
   cl_object f_obj = 
ecl_make_foreign_data(make_simple_string("CSTRING"), strlen(string_ptr), 
(void*)&string_ptr);

    cl_set(c_string_to_object("VAR3"), f_obj);

;; Note: This method will crash ECL if you try and use it for the first 
method as it expects a pointer-to-pointer.

(ffi:deref-pointer var3 :cstring)


Hope that helps, Good luck.

Cheers
Dean.

fBechmann at t-online.de wrote:

> Hi everybody:
>
> what I want to do: call a lisp program (either precompiled or plain 
> lisp file, given by its name) from within a C program, pasing some 
> string args by the way, and reading  the output of the program from 
> its stdout (and stderr). It's good enough for my purposes to perform 
> that call synchronously.
>
> Any pointer would be appreciated. Does anyone also has suggestions 
> where I could find a more explanatory of the C interface, other than 
> in the developer's guide (and by reading the sources of course).
>
> Thx in advance, Frank
>
>
> -------------------------------------------------------
> SF.Net email is sponsored by:
> Tame your development challenges with Apache's Geronimo App Server. 
> Download
> it for free - -and be entered to win a 42" plasma tv or your very own
> Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
> _______________________________________________
> Ecls-list mailing list
> Ecls-list at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ecls-list





More information about the ecl-devel mailing list