Lisp是极好的。人人都知道。关于Lisp唯一的问题是,我们生活在一个C的世界里。因此,我想在可以移植的C程序中调用一些Lisp代码。
首先,你需要安装ECL(安装指南)。
让我们来书写一个非常简单的Lisp程序: 1 2 | (in-package :cl-user)(defun add (x y)
(+ x y))
|
没错,我知道这个程序看上去很蠢。但是我们仅仅只是想让一切东西正常运行起来。
接下来,我们将要使用ECL的compile-file创建一个build文件。该build文件会编译产生一个object文件。 1 | (compile-file "add.lisp" : system -p t)
|
它将会生成add.o对象文件。我们也可以通过如下方式创建一个静态库: 1 2 3 4 | (c:build- static -library "add"
:lisp-files '( "add.o" )
:init-name "init_add" )
(quit)
|
这一步会产生一个名为libadd.a的静态库。我们便可以在C程序中使用该静态库。
接着,我们来写一个小小的C程序。这个C程序将会使用我们的加法Lisp库。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <ecl/ecl.h>
#include <stdlib.h>
#include <stdio.h>
extern void init_add(cl_object cblock);
int lisp_add( int x, int y)
{
cl_object sum = cl_funcall(3, c_string_to_object( "add" ), ecl_make_int(x), ecl_make_int(y));
return ecl_to_int(sum);
}
int main( int argc, char *argv[])
{
if (argc<2) {
printf ( "I need 2 arguments to add\n" );
return 1;
}
int x = atoi (argv[1]);
int y = atoi (argv[2]);
cl_boot(argc, argv);
read_VV(OBJNULL, init_add);
int sum = lisp_add(x, y);
printf ( "%d\n" , sum);
cl_shutdown();
return 0;
}
|
最后,添加一个Makefile: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | CC=cc
C_SOURCE=lispadd.c
LISP_BUILD=build.lisp
INCLUDE= /usr/local/include
LIBRARIES=-L /usr/local/lib -L.
OUTPUT=lispadd
CFLAGS=-I$(INCLUDE) $(LIBRARIES) -ladd -lecl
all: lispadd
libadd.a:
ecl -load $(LISP_BUILD)
lispadd: libadd.a
$(CC) $(C_SOURCE) $(CFLAGS) -o $(OUTPUT)
clean:
rm -f libadd.a
rm -f add.o
rm -f lispadd
rm -f add.fas
|
请按照你自己的设置,修改该Makefile最开始的几个变量。
现在,敲下make命令来编译吧!
这个例子可以在Github上下载。
如果你想深入了解能用ECL做什么,请阅读这篇手册。 |