从Common Lisp调用Lua

时间:2018-01-20 06:07:57

标签: lua compilation lisp common-lisp ffi

在常见的lisp程序中运行lua代码是否存在任何现有项目或简单方法?我在Lua项目中看到了一些Lisp,但据我所知,他们都没有实现完全普通的lisp,所以不提供可接受的桥梁。

我认为在CL中写一个完整的Lua解释器或通过CFFI访问Lua并不难,但到目前为止我还没有找到任何代码库来执行此操作。他们不存在或者什么?如果没有,那么现有的代码库是一个很好的起点,例如,使用C代码嵌入lua是否方便CFFI?

编辑:为避免混淆,请注意CFFI我指的是调用外部函数的this lisp项目,而不是python函数。

1 个答案:

答案 0 :(得分:5)

如果您将lua 实现(实际的lua-5*.tar.gz)视为在C中编码的,您希望从Common Lisp调用,您的问题变成了如何从Common Lisp调用C外部函数(即询问您的Common Lisp 实现foreign function interface)。答案当然是具体的实施。对于SBCL,请阅读其§8 Foreign Function Interface章节。对于CLisp,请阅读§32.3. The Foreign Function Call FacilityCommon Lisp CFFI可能会有所帮助。您可能希望将Lua API与您的Common Lisp实现接口(但我猜您不需要;您可能希望在不同的进程中运行lualatex程序。)

如果您将 Lua 视为编程语言规范(其语法和语义,在某些report中用英语编写),您也可以自己编写Lisa中的Lua解释器。由于Lua很简单,这可能很容易(但是它真的值得吗?可能你需要重新实现许多Lua原语)。

根据您的意见,您可能对LuaTeX或LuaLaTeX感兴趣。那么你真的想要开始运行不同的 process。一些Lisp实现为此提供了一些方法,例如SBCL提供run-program,您可能需要更多inter-process communication(在Linux上,可能是unix(7)套接字或fifo(7),或pipe(7) ...)。许多Lisp实现提供了一些使用它们的方法。查看他们的文档。

如果你需要了解更多如何让几个进程在Linux上协同工作 - 例如lualatex - ,阅读一些Linux编程书籍,也许是旧的ALP(可免费下载),然后是intro(2)& syscalls(2)poll(2)多路复用系统调用是相关的,可在event loop中使用。许多Lisp实现提供了执行此类system calls的方法;对于SBCL,请查看sb-posix

(要求明确的软件资源在SO上是偏离主题的)