我可以用 c++ 扩展 lisp 吗?
我可以从用 c 或 c++ 编写的库中调用 lisp 函数吗? 我怎样才能扩展 lisp? 当您想要执行一些系统调用或类似的操作时,这非常有用。
Can I call a function from lisp from a library written in c or c++? How can I extend lisp?
This is useful when you want to do some system calls or stuff like that.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
从 lisp 调用非 lisp 代码的情况很少见,而且很少有必要。 CLX(CL 的 X11 客户端实现)不链接到 Xlib 实现,而是直接“讲”X11。 在任何系统上,您的 CL 实现可能已经具有出色的操作系统挂钩,因此无需这样做。
也就是说,答案取决于 lisp 实现:
在 ECL 中,您实际上可以在 C 下托管一个 CL 环境,并且只需简单地使用要执行的代码调用
cl_eval()
。 这可以让您用 C(或 C++)编写应用程序(或应用程序主机)并“调用”lisp 代码。在 CCL 中,有一个与 C 兼容的调用接口,可以让您执行如下操作
:其他 CL 实现(如 SBCL;是的,这也适用于 ECL 和 CCL),您可以使用 UFFI(或 CFFI),它只是让您调用 C 函数,这就是其他人正在谈论的。 如果这就是您想做的全部事情,那么 CFFI 是一个良好、安全的起点。
It is unusual to call non-lisp code from lisp, and rarely necessary. CLX (the X11 client implementation for CL) doesn't link to the Xlib implementation but "speaks" X11 directly. On any system, your CL implementation is likely to already have excellent operating system hooks rendering this unnecessary.
That said, the answer depends on the lisp implementation:
In ECL you can actually host a CL environment under C and simply call
cl_eval()
with the code to execute. This can let you write your application (or application host) in C (or C++) and "call to" lisp code.In CCL, there is a C-compatible calling interface which lets you do something like this:
In most other CL implementations (like SBCL; and yes this works in ECL and CCL as well) you can use UFFI (or CFFI) which simply lets you call C functions, which is what other people are talking about. If this is all you want to do, then CFFI is a good, safe place to start.
请参阅 UFFI 和 CFFI 和更灵活的 Clozure FFI
See UFFI and CFFI and the slicker Clozure FFI
CFFI!
CFFI!