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

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

成都创新互联基于分布式IDC数据中心构建的平台为众多户提供内江机房主机托管 四川大带宽租用 成都机柜租用 成都服务器租用。

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

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

 
 
  1. (in-package :cl-user)(defun add (x y)  
  2.   (+ x y)) 

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

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

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

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

 
 
  1. (c:build-static-library "add"   
  2.             :lisp-files '("add.o")  
  3.             :init-name "init_add")  
  4. (quit) 

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

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

 
 
  1. #include   
  2. #include   
  3. #include   
  4. extern void init_add(cl_object cblock);  
  5.    
  6. // Make sure this doesn't get called before 'cl_boot'  
  7. int lisp_add(int x, int y)  
  8. {  
  9.   cl_object sum = cl_funcall(3, c_string_to_object("add"), ecl_make_int(x), ecl_make_int(y));  
  10.   return ecl_to_int(sum);  
  11. }  
  12.    
  13. int main(int argc, char *argv[])  
  14. {  
  15.   if (argc<2) {  
  16.     printf("I need 2 arguments to add\n");  
  17.     return 1;  
  18.   }  
  19.   int x = atoi(argv[1]);  
  20.   int y = atoi(argv[2]);  
  21.   cl_boot(argc, argv);  
  22.   read_VV(OBJNULL, init_add);  
  23.   int sum = lisp_add(x, y);  
  24.   printf("%d\n", sum);  
  25.   cl_shutdown();  
  26.   return 0;  

***,添加一个Makefile:

 
 
  1. CC=cc  
  2. C_SOURCE=lispadd.c  
  3. LISP_BUILD=build.lisp  
  4. INCLUDE=/usr/local/include  
  5. LIBRARIES=-L/usr/local/lib -L.  
  6. OUTPUT=lispadd  
  7. CFLAGS=-I$(INCLUDE) $(LIBRARIES) -ladd -lecl  
  8.    
  9. all: lispadd  
  10.    
  11. libadd.a:  
  12.     ecl -load $(LISP_BUILD)  
  13.    
  14. lispadd: libadd.a  
  15.     $(CC) $(C_SOURCE) $(CFLAGS) -o $(OUTPUT)  
  16.    
  17. clean:  
  18.     rm -f libadd.a  
  19.     rm -f add.o  
  20.     rm -f lispadd  
  21.     rm -f add.fas 

请按照你自己的设置,修改该Makefile最开始的几个变量。

现在,敲下make命令来编译吧!

 
 
  1. ./lispadd 7 8 => 15 

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

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

英文原文:Calling Lisp from C using ECL

译文链接:http://www.oschina.net/translate/calling-lisp-from-c-using-ecl

文章标题:使用ECL在C程序中调用Lisp代码
网站链接:http://www.shufengxianlan.com/qtweb/news26/488226.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联