Embeddable Common Lisp (ECL):加载具有扩展功能的共享库
Embeddable Common Lisp (ECL): load shared library with extension functions
是否可以在 ECL 中加载共享库,导入一些接收和 return cl_object
的 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_object
,而不是常规指针 (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
);
}
编译它:
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)
编译它:
ecl -compile load-extlib.lisp -o load-extlib.fas
加载并测试它:
ecl -load load-extlib.fas
> (make-pair "blah")
("blah" . "blah")
是否可以在 ECL 中加载共享库,导入一些接收和 return cl_object
的 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_object
,而不是常规指针 (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
);
}
编译它:
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)
编译它:
ecl -compile load-extlib.lisp -o load-extlib.fas
加载并测试它:
ecl -load load-extlib.fas
> (make-pair "blah")
("blah" . "blah")