Common lisp 可嵌入公共Lisp(ECL):使用扩展函数加载共享库

Common lisp 可嵌入公共Lisp(ECL):使用扩展函数加载共享库,common-lisp,ecl,Common Lisp,Ecl,是否可以在ECL中加载共享库,导入一些接收和返回cl_对象的C函数(就好像它们是用ECL_def_C_function()定义的)并在REPL中调用它们(而不编译*.lisp文件) 例如: // file 'extensions.c' compiled to 'extensions.so' cl_object do_something (cl_object arg) { cl_object result = ...; return re

是否可以在ECL中加载共享库,导入一些接收和返回
cl_对象的C函数(就好像它们是用
ECL_def_C_function()
定义的)并在REPL中调用它们(而不编译*.lisp文件)

例如:

// 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\u对象
,而不是一个常规指针
(void*)

看起来不像在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
    );
}
加载extlib.lisp

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

clang `ecl-config --cflags` extlib.c -shared -fPIC -o extlib.so `ecl-config --libs`
ecl -compile load-extlib.lisp -o load-extlib.fas
加载并测试它:

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

("blah" . "blah")