使用ECL在C程序中调用Lisp代码

Lisp是极好的。人人都知道。关于Lisp唯一的问题是,我们生活在一个C的世界里。因此,我想在可以移植的C程序中调用一些Lisp代码。

首先,你需要安装ECL安装指南)。

让我们来书写一个非常简单的Lisp程序:

(in-package :cl-user)(defun add (x y)  


  (+ x y)) 

没错,我知道这个程序看上去很蠢。但是我们仅仅只是想让一切东西正常运行起来。

接下来,我们将要使用ECL的compile-file创建一个build文件。该build文件会编译产生一个object文件。

(compile-file "add.lisp" :system-p t) 

它将会生成add.o对象文件。我们也可以通过如下方式创建一个静态库:

(c:build-static-library "add"   



            :lisp-files '("add.o")  




            :init-name "init_add")  



(quit) 

这一步会产生一个名为libadd.a的静态库。我们便可以在C程序中使用该静态库。

接着,我们来写一个小小的C程序。这个C程序将会使用我们的加法Lisp库。

#include <ecl/ecl.h>  


#include <stdlib.h>  


#include <stdio.h>  



extern void init_add(cl_object cblock);  



   



// Make sure this doesn't get called before 'cl_boot'  




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:

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命令来编译吧!

./lispadd 7 8 => 15 

这个例子可以在Github上下载。

如果你想深入了解能用ECL做什么,请阅读这篇手册

相关推荐