设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

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

2014-9-25 11:11| 发布者: joejoe0332| 查看: 2531| 评论: 0|原作者: blur|来自: oschina

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

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


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


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

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


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


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

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


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

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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命令来编译吧!

1
./lispadd 7 8 => 15


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


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


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部