2017-06-12 78 views
1

是否可以在ECL中加載共享庫,導入一些接收並返回cl_object的C函數(就好像它們是用ecl_def_c_function()定義的)並在REPL中調用它們(沒有編譯* .lisp文件)?嵌入式通用Lisp(ECL):具有擴展功能的加載共享庫

例如:

// file 'extensions.c' compiled to 'extensions.so' 

cl_object 
    do_something 
     (cl_object arg) 
{ 
    cl_object 
     result = ...; 

    return result; 
} 

; in ECL REPL 
(uffi:load-foreign-library #p".../extensions.so") 
... ; importing stuff 
(format t "got: ~a~%" (do-something "text")) 

因爲我發現沒有告訴ECL(通過UFFI)是C函數處理cl_object,不是一個普通指針(void*)的方式。

回答

0

看起來你不能像Python那樣簡單。 我迄今發現的唯一解決辦法:

extlib.c

#include <stdio.h> 
#include <ecl/ecl.h> 

static 
cl_object 
    make_pair 
     (cl_object arg) 
{ 
    return cl_cons(arg, arg); 
} 

void 
    init_extlib 
     (void) 
{ 
    ecl_def_c_function(
     ecl_read_from_cstring("make-pair"), 
     make_pair, 
     1 
    ); 
} 

編譯:

clang `ecl-config --cflags` extlib.c -shared -fPIC -o extlib.so `ecl-config --libs` 

負載extlib.lisp

(uffi:load-foreign-library "~/extlib.so") 
(uffi:def-function ("init_extlib" init-extlib) 
        () 
        :returning :void) 
(init-extlib) 

的COM誇大事實:

ecl -compile load-extlib.lisp -o load-extlib.fas 

負載&測試:

ecl -load load-extlib.fas 
> (make-pair "blah") 

("blah" . "blah")