使用ECL在C程序中调用Lisp代码
2023-03-09 22:24:17 时间
Lisp是极好的。人人都知道。关于Lisp唯一的问题是,我们生活在一个C的世界里。因此,我想在可以移植的C程序中调用一些Lisp代码。
让我们来书写一个非常简单的Lisp程序:
- (in-package :cl-user)(defun add (x y)
- (+ x y))
没错,我知道这个程序看上去很蠢。但是我们仅仅只是想让一切东西正常运行起来。
接下来,我们将要使用ECL的compile-file创建一个build文件。该build文件会编译产生一个object文件。
- (compile-file "add.lisp" :system-p t)
它将会生成add.o对象文件。我们也可以通过如下方式创建一个静态库:
- (c:build-static-library "add"
- :lisp-files '("add.o")
- :init-name "init_add")
- (quit)
这一步会产生一个名为libadd.a的静态库。我们便可以在C程序中使用该静态库。
接着,我们来写一个小小的C程序。这个C程序将会使用我们的加法Lisp库。
- #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:
- 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命令来编译吧!
- ./lispadd 7 8 => 15
这个例子可以在Github上下载。
如果你想深入了解能用ECL做什么,请阅读这篇手册。
英文原文:Calling Lisp from C using ECL
译文链接:http://www.oschina.net/translate/calling-lisp-from-c-using-ecl
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的