日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用ECL在C程序中調(diào)用Lisp代碼

Lisp是極好的。人人都知道。關(guān)于Lisp唯一的問題是,我們生活在一個(gè)C的世界里。因此,我想在可以移植的C程序中調(diào)用一些Lisp代碼。

成都創(chuàng)新互聯(lián)基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺(tái)為眾多戶提供內(nèi)江機(jī)房主機(jī)托管 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。

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

讓我們來書寫一個(gè)非常簡(jiǎn)單的Lisp程序:

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

沒錯(cuò),我知道這個(gè)程序看上去很蠢。但是我們僅僅只是想讓一切東西正常運(yùn)行起來。

接下來,我們將要使用ECL的compile-file創(chuàng)建一個(gè)build文件。該build文件會(huì)編譯產(chǎn)生一個(gè)object文件。

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

它將會(huì)生成add.o對(duì)象文件。我們也可以通過如下方式創(chuàng)建一個(gè)靜態(tài)庫(kù):

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

這一步會(huì)產(chǎn)生一個(gè)名為libadd.a的靜態(tài)庫(kù)。我們便可以在C程序中使用該靜態(tài)庫(kù)。

接著,我們來寫一個(gè)小小的C程序。這個(gè)C程序?qū)?huì)使用我們的加法Lisp庫(kù)。

 
 
  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;  

***,添加一個(gè)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 

請(qǐng)按照你自己的設(shè)置,修改該Makefile最開始的幾個(gè)變量。

現(xiàn)在,敲下make命令來編譯吧!

 
 
  1. ./lispadd 7 8 => 15 

這個(gè)例子可以在Github上下載。

如果你想深入了解能用ECL做什么,請(qǐng)閱讀這篇手冊(cè)。

英文原文:Calling Lisp from C using ECL

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


本文名稱:使用ECL在C程序中調(diào)用Lisp代碼
網(wǎng)址分享:http://www.dlmjj.cn/article/dpioggs.html