成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用ECL在C程序中調用Lisp代碼

開發 開發工具 后端
Lisp是極好的。人人都知道。關于Lisp唯一的問題是,我們生活在一個C的世界里。因此,我想在可以移植的C程序中調用一些Lisp代碼……

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

首先,你需要安裝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 <ecl/ecl.h>  
  2. #include <stdlib.h>  
  3. #include <stdio.h>  
  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

責任編輯:林師授 來源: 開源中國社區
相關推薦

2012-04-28 15:28:21

JNI混合編程Java

2017-02-06 18:42:37

Linuxgdb程序

2011-05-19 08:19:50

Lisp

2009-07-14 16:07:59

調用JavaFX代碼Swing程序

2021-04-01 11:28:44

C++ LinuxWindows

2009-08-11 14:26:56

C#動態調用WebSe

2012-04-16 13:47:37

JavaMatlab

2010-03-10 19:18:10

Python scri

2012-03-20 11:37:24

JavaJNI

2016-01-25 15:09:22

JavaScriptC程序

2009-06-10 17:03:36

JSP動態生成

2011-08-22 17:13:00

LuaC++函數

2024-09-20 18:02:42

C#數據庫SQLite

2024-12-20 09:48:47

C#Python代碼

2009-06-16 15:20:48

ApplicationJSP程序

2017-01-05 13:31:33

Lisp加法運算

2011-07-27 16:18:42

Objective-c 協議

2011-05-30 17:31:51

Android 模擬SD卡

2013-03-29 10:13:22

lisp編譯器

2009-04-14 14:53:06

C++Lambda函數多線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久avwww潮水 | 黄色片大全在线观看 | 亚洲不卡在线观看 | 一区二区三区久久久 | 国产精品福利在线 | 国产欧美三区 | 二区不卡| 欧美成人综合 | 色综合一区二区三区 | 亚洲精品久久久久久久久久久 | 久久日韩精品 | 国产一区久久 | 视频一区在线观看 | 久草免费在线视频 | 免费一级欧美在线观看视频 | 欧美久久大片 | 日韩午夜网站 | 亚洲精品视频免费看 | 国产精品高潮呻吟久久 | 日本不卡在线视频 | 精品产国自在拍 | 亚洲三区在线观看 | 成人在线电影在线观看 | 91久久夜色精品国产网站 | 欧美日韩不卡 | 日韩国产一区 | 久久久久久高潮国产精品视 | 涩涩视频在线观看 | 国产午夜精品一区二区三区四区 | 韩日一区二区三区 | 亚洲精品成人免费 | 天天影视亚洲综合网 | 91精品国产综合久久久动漫日韩 | 国产欧美一区二区三区在线看 | 日本三级全黄三级三级三级口周 | 91精品国产91久久久久青草 | 亚洲综合婷婷 | 综合久久久| 午夜成人免费视频 | 在线2区 | 91亚洲精品在线观看 |