0

精简版:

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

长版:

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

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

4

1 回答 1

1

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

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

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

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

于 2013-10-05T11:18:30.420 回答