使用ECL在C程序中調(diào)用Lisp代碼
作者:blur編譯
Lisp是極好的。人人都知道。關(guān)于Lisp唯一的問題是,我們生活在一個(gè)C的世界里。因此,我想在可以移植的C程序中調(diào)用一些Lisp代碼……
Lisp是極好的。人人都知道。關(guān)于Lisp唯一的問題是,我們生活在一個(gè)C的世界里。因此,我想在可以移植的C程序中調(diào)用一些Lisp代碼。
讓我們來書寫一個(gè)非常簡單的Lisp程序:
- (in-package :cl-user)(defun add (x y)
- (+ x y))
沒錯(cuò),我知道這個(gè)程序看上去很蠢。但是我們僅僅只是想讓一切東西正常運(yùn)行起來。
接下來,我們將要使用ECL的compile-file創(chuàng)建一個(gè)build文件。該build文件會編譯產(chǎn)生一個(gè)object文件。
- (compile-file "add.lisp" :system-p t)
它將會生成add.o對象文件。我們也可以通過如下方式創(chuàng)建一個(gè)靜態(tài)庫:
- (c:build-static-library "add"
- :lisp-files '("add.o")
- :init-name "init_add")
- (quit)
這一步會產(chǎn)生一個(gè)名為libadd.a的靜態(tài)庫。我們便可以在C程序中使用該靜態(tài)庫。
接著,我們來寫一個(gè)小小的C程序。這個(gè)C程序?qū)褂梦覀兊募臃↙isp庫。
- #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;
- }
***,添加一個(gè)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
請按照你自己的設(shè)置,修改該Makefile最開始的幾個(gè)變量。
現(xiàn)在,敲下make命令來編譯吧!
- ./lispadd 7 8 => 15
這個(gè)例子可以在Github上下載。
如果你想深入了解能用ECL做什么,請閱讀這篇手冊。
英文原文:Calling Lisp from C using ECL
譯文鏈接:http://www.oschina.net/translate/calling-lisp-from-c-using-ecl
責(zé)任編輯:林師授
來源:
開源中國社區(qū)