从Lisp与其他运行时通信

从Lisp与其他运行时通信,lisp,common-lisp,graph-databases,ffi,Lisp,Common Lisp,Graph Databases,Ffi,简短版本: 有没有办法允许其他程序调用Lisp程序的Lisp函数 长版本: 我正在考虑一个图形数据库项目:)不是马上开始,我只是到目前为止的探索。我尝试了几个图形数据库,我最大的抱怨是它们都是用java编写的(有些C++,也不打算删掉)。Java没有良好的对外通信方式。它只能嵌入到另一个Java程序中。C++是很难嵌入的,我怀疑嵌入式是不是已经计划好了。 所以,我显然想用CL写,但我也在考虑其他选择。所以,如果你相信CL不会这么做,但你有理由相信其他语言会这么做,那么这是一个有趣的答案!我对“其

简短版本:

有没有办法允许其他程序调用Lisp程序的Lisp函数

长版本:

我正在考虑一个图形数据库项目:)不是马上开始,我只是到目前为止的探索。我尝试了几个图形数据库,我最大的抱怨是它们都是用java编写的(有些C++,也不打算删掉)。Java没有良好的对外通信方式。它只能嵌入到另一个Java程序中。C++是很难嵌入的,我怀疑嵌入式是不是已经计划好了。
所以,我显然想用CL写,但我也在考虑其他选择。所以,如果你相信CL不会这么做,但你有理由相信其他语言会这么做,那么这是一个有趣的答案!我对“其他语言”的要求是,它必须以某种方式支持并行计算。显然,高性能。如前所述,还有可扩展性。

我看到了从其他语言调用Lisp的多种方法:

  • 对于所有实现,最简单的方法是只维护到REPL的双向流。因此,您可以向REPL发送命令并接收REPL的响应。当然,这样做的一个缺点是所有内容都将转换为字符串
  • 你可以模仿黏液与SWANK沟通的方式。在这种情况下,您可以直接在Lisp端使用SWANK并通过SLIME使用的相同协议进行通信,也可以编写自己版本的库
  • 最后,在设计Lisp实现时考虑了可嵌入性。我特别想到这里,它有一个C API。例如,说明如何调用函数,方法是使用
    ecl\u make\u symbol
    获取函数的符号,然后使用
    cl\u funcall
    cl\u apply
    调用函数

作为普通LISP的替代品,其他LISP语言可能值得考虑。各种方案实现设计为可嵌入的。与JVM相比,您似乎更喜欢运行时世界的本机代码端,但除此之外,Clojure在Java中的可嵌入性也很有趣


对于宿主语言来说,没有什么限制,因为大多数语言都应该支持“管道”(即流到其他进程)或使用C FFI来调用Lisp的C API。

是的,我很久以前就尝试过ECL,因为它非常简单,但我记得我读过,它不是一个非常有效的实现,尽管可能是我发明的。我很乐意在这个问题上犯错。Clojure将面临与任何JVM语言相同的问题——没有可扩展性。REPL是我希望它是Lisp调试和热补丁的主要原因之一,但它不能处理繁重的负载,比如传递大量的记录。球拍似乎是个有趣的选择!我不会说ECL非常慢,尽管SBCL通常更快:您也可以在SBCL-devel邮件列表中询问如何从其他程序与SBCL对话我刚刚看到,另一方面(从Java调用C)是它更突出的特性,JNI也提供了一个API来从C@VsevolodDyomkin调用Java。我在SBCL邮件列表上问过,这里是我得到的:这似乎非常符合要求。如果你不关心效率,json rpc是一个可能的解决方案。我经常使用json rpc连接用不同语言编写的不同程序。@SaltyEgg效率是最主要的考虑:)你真的不想在构建数据库时牺牲任何可用资源。那么就我所知,你应该使用CFFI。@SaltyEgg是的,这就是我要做的。我只是不知道有一种方法可以和C程序对话。我还不太清楚如何从C中嵌入Lisp程序,但既然功能已经存在,我会找到答案(嗯,我想:)