如何在clisp中使用FFI:def调用
我已经知道如何使用如何在clisp中使用FFI:def调用,lisp,common-lisp,ffi,clisp,Lisp,Common Lisp,Ffi,Clisp,我已经知道如何使用FFI:def call out将从C代码创建的共享对象使用到Clisp中,但我无法知道如何使用FFI:def call in 我不知道这个过程,实际上我很困惑clisp是否也会创建一些.so文件,一些C函数可以使用这些文件或其他文件 有人能解释一下编写这种回调函数的最简单的工作示例吗?: 要使用Lisp函数sort而不是C库函数qsort对双浮点数组进行排序,可以使用以下接口代码sort1.C。主要问题是传递一个大小可变的数组 extern void lispsort_beg
FFI:def call out
将从C代码创建的共享对象使用到Clisp中,但我无法知道如何使用FFI:def call in
我不知道这个过程,实际上我很困惑clisp是否也会创建一些.so文件,一些C函数可以使用这些文件或其他文件
有人能解释一下编写这种回调函数的最简单的工作示例吗?:
要使用Lisp函数sort
而不是C库函数qsort
对双浮点数组进行排序,可以使用以下接口代码sort1.C
。主要问题是传递一个大小可变的数组
extern void lispsort_begin (int);
void* lispsort_function;
void lispsort_double (int n, double * array) {
double * sorted_array;
int i;
lispsort_begin(n); /* store #'sort2 in lispsort_function */
sorted_array = ((double * (*) (double *)) lispsort_function) (array);
for (i = 0; i < n; i++) array[i] = sorted_array[i];
free(sorted_array);
}
要对此进行测试,请使用以下测试文件sorttest.lisp
:
(DEFPACKAGE "FFI-TEST" (:use “COMMON-LISP” “FFI”))
(IN-PACKAGE "FFI-TEST")
(EVAL-WHEN (compile) (setq FFI:*OUTPUT-C-FUNCTIONS* t))
(FFI:DEF-CALL-IN lispsort_begin (:ARGUMENTS (n int))
(:RETURN-TYPE nil)
(:LANGUAGE :stdc))
(FFI:DEF-C-VAR lispsort_function (:type c-pointer))
(defun lispsort_begin (n)
(setf (cast lispsort_function
`(c-function
(:ARGUMENTS (v (c-ptr (c-array double-float ,n))))
(:RETURN-TYPE (c-ptr (c-array double-float ,n))
:malloc-free)))
#'sort2))
(defun sort2 (v)
(declare (type vector v))
(sort v #'<))
(EVAL-WHEN (compile) (setq FFI:*OUTPUT-C-FUNCTIONS* t))
(FFI:DEF-CALL-OUT sort10
(:name "lispsort_double")
(:LANGUAGE :stdc)
(:ARGUMENTS (n int)
(array (c-ptr (c-array double-float 10)) :in-out)))
现在试试
$ clisp-link create sort sort2.c sorttest.c
$ cc -O -c sort1.c
$ cd sort
$ ln -s ../sort1.o sort1.o
将sort1.o
添加到NEW\u LIBS
和link.sh中的NEW\u文件
。创建一个包含表单的文件package.lisp
(MAKE-PACKAGE "FFI-TEST" :use '(“COMMON-LISP” “FFI”))
并在link.sh
中将package.lisp
添加到中的\u PRELOAD
。进行:
$ cd ..
$ base/lisp.run -M base/lispinit.mem -c sort2.lisp sorttest.lisp
$ clisp-link add base base+sort sort
$ base+sort/lisp.run -M base+sort/lispinit.mem -i sort2 sorttest
> (sort10 10 '#(0.501d0 0.528d0 0.615d0 0.550d0 0.711d0
0.523d0 0.585d0 0.670d0 0.271d0 0.063d0))
#(0.063d0 0.271d0 0.501d0 0.523d0 0.528d0 0.55d0 0.585d0 0.615d0 0.67d0 0.711d0)
$ rm -r base+sort
这里的base/lisp.run和listinit.mem是什么…我找到了这个示例,但在这里我被卡住了clisp--help
将在第二行打印它们的位置。