我可以编写一个DLL文件来导出要使用Common Lisp的函数吗?
答案 0 :(得分:3)
每个Common Lisp实现都有不同的方法来扩展它来自各种外语。您打算使用哪种实施方式?
GNU CLISP implementation允许定义用C编写的external modules向Lisp公开对象,符号和函数。 documentation for writing an external module已完成,但您可能会发现很难将其集成到构建过程的其余部分,除非您已经使用 make 或shell脚本来自动部分构建过程
或者,您可以回答问题并询问如何从Common Lisp访问C库。同样,大多数实现都有一个外部函数接口或FFI,它们允许它们接触各种其他语言。 CLISP有an FFI,但您也可以使用像CFFI这样的包来实现Common Lisp实现之间的可移植性。 CLISP文档describes the trades in these two approaches。
如果您打算在您的C程序中嵌入Common Lisp,ECL可能是另一个不错的选择。
答案 1 :(得分:1)
(..我不是100%肯定你的意思,但我会把一些东西扔出去看看会发生什么......)
大多数Lisps可以做C< - >通过FFI方式的Lisp类型的东西,并且存在用于执行FFI的兼容性层/库,如已经提到的CFFI。
因此,您几乎总是可以使用Lisp调用C函数并拥有C call Lisp functions,并且大多数都是通过将.dll / .so文件加载到已运行的Lisp进程来实现的。请注意,这往往是像Python(PyGTK等)这样的其他环境。这通常就是你想要的,所以你可能想要忽略我在下面说的大部分内容。
我能想到的唯一的Lisp使得人们能够“反过来”做事,即加载一个.dll / .so,它是“是”Lisp或由Lisp生成的已经运行的C进程,是ECL。
在很多情况下,真的无论你把入口点或“ main()函数”放在哪里使用C术语都没关系,所以如果你愿意的话除了ECL之外还要使用其他一些Lisp,但他们认为你“不能因为......”这是重新考虑的事情,因为,是的,你可以在很多情况下只是稍微改变一下。
然而,使用其他IPC机制几乎总是更好的主意,并且尽可能避免任何类型的FFI。