【问题标题】:Communicate from Lisp to other runtimes从 Lisp 与其他运行时通信
【发布时间】:2013-10-05 10:43:02
【问题描述】:

短版:

有没有办法让其他程序调用 Lisp 程序的 Lisp 函数?

长版:

我正在考虑一个图形数据库项目:) 不要立即开始,到目前为止我只是在探索。我已经尝试了几个图形数据库,我对它们最大的抱怨是它们都是用 Java 编写的(有些是用 C++ 编写的,这也不会削减它......)。 Java 没有很好的对外交流方式。它只能嵌入到另一个 Java 程序中。 C++ 很难嵌入/我怀疑嵌入是否已经计划好了。

所以,我显然想用 CL 编写它,但我也在考虑其他选择。因此,如果您认为 CL 根本不会这样做,但您有理由相信其他语言会这样做,那么这是一个有趣的答案!我对“其他语言”的要求是它必须以某种方式支持并行计算。显然,高性能。并且,如前所述,可扩展性。

【问题讨论】:

  • 如果你不关心效率,json-rpc 是一个可能的解决方案。我经常使用 json-rpc 来桥接用不同语言编写的不同程序。
  • @SaltyEgg 效率是主要关注点 :) 在构建数据库时,您真的不想牺牲任何可用资源。
  • 那你应该使用CFFI,据我所知。
  • @SaltyEgg 是的,这就是我要做的。我只是不知道有一种方法可以与 C 程序对话。我仍然不太了解如何从 C 中嵌入 Lisp 程序,但既然功能在那里,我会发现(嗯,我猜 :))

标签: lisp common-lisp graph-databases ffi


【解决方案1】:

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

  • 适用于所有实现的最简单方法是只维护到 REPL 的双向流。因此,您可以向 REPL 发送命令并接收 REPL 的响应。这样做的一个缺点当然是所有内容都将转换为字符串。
  • 您可以镜像 SLIME 与 SWANK 通信的方式。在这种情况下,您可以直接在 Lisp 端使用 SWANK 并通过 SLIME 使用的相同协议进行通信,或者编写您自己的此类库版本。
  • 最后,Lisp 实现在设计时考虑了可嵌入性。我在这里特别想到Embeddabble Common Lisp (ECL),它有一个C API。例如,this section in the manual 解释了如何调用函数,方法是使用 ecl_make_symbol 获取函数的符号,然后使用 cl_funcallcl_apply 调用它。

作为 Common Lisp 的替代品,其他 Lisp 语言可能值得考虑。各种 Scheme 实现都被设计为可嵌入的,this is for example the documentation of Racket's C API。与 JVM 相比,您似乎更喜欢运行时世界的本机代码端,但除此之外,Clojure 也很有趣,因为它可以嵌入到 Java 中。

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

【讨论】:

  • 是的,我很久以前尝试过 ECL 的一些非常简单的事情,但我想我记得读过它并不是一个非常有效的实现,尽管我可能已经发明了它。很高兴在这个帐户上出错。 Clojure 会遇​​到任何 JVM 语言都会遇到的所有问题——没有可扩展性。 REPL 是我希望它成为 Lisp 的主要原因之一 - 调试和热补丁,但它无法处理繁重的负载,例如传递大量记录。球拍似乎是一个有趣的选择!
  • 我不会说 ECL 非常慢,尽管 SBCL 通常更快:lispm.dyndns.org/lisp/benchmarks.html 你也可以在 sbcl-devel 邮件列表中询问如何从其他程序与 SBCL 交谈跨度>
  • 我刚刚看到,虽然反过来(从 Java 调用 C)是其更突出的特性,但 JNI 也提供了从 C 调用 Java 的 API。
  • @VsevolodDyomkin 我已经在 SBCL 邮件列表中询问过,这就是我得到的:common-lisp.net/project/cffi/manual/html_node/defcallback.html,这似乎非常符合要求。
猜你喜欢
  • 1970-01-01
  • 2011-03-21
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 2018-04-09
  • 2020-08-15
相关资源
最近更新 更多