【发布时间】:2010-09-27 14:33:21
【问题描述】:
我可以从用 c 或 c++ 编写的库中调用 lisp 中的函数吗?如何扩展 lisp? 当你想做一些系统调用或类似的事情时,这很有用。
【问题讨论】:
-
我可以用卡丁车引擎扩展我的保时捷吗? :-)
我可以从用 c 或 c++ 编写的库中调用 lisp 中的函数吗?如何扩展 lisp? 当你想做一些系统调用或类似的事情时,这很有用。
【问题讨论】:
【讨论】:
CFFI!
【讨论】:
从 lisp 调用非 lisp 代码是不常见的,而且很少需要。 CLX(CL 的 X11 客户端实现)不链接到 Xlib 实现,而是直接“说”X11。在任何系统上,您的 CL 实现都可能已经具有出色的操作系统挂钩,从而使这变得不必要。
也就是说,答案取决于 lisp 的实现:
在ECL 中,您实际上可以在C 下托管一个CL 环境,只需调用cl_eval() 并执行代码即可。这可以让您用 C(或 C++)编写应用程序(或应用程序主机)并“调用”lisp 代码。
在CCL 中,有一个与 C 兼容的调用接口,可让您执行以下操作:
(with-cstrs ((x "Hello World"))
(#_puts x))
在大多数其他 CL 实现中(如 SBCL;是的,这也适用于 ECL 和 CCL),您可以使用 UFFI(或 CFFI),它只是让您调用 C 函数,这是其他人在谈论的。如果这就是您想做的全部,那么 CFFI 是一个很好、安全的起点。
【讨论】: