9

如何从命令行与本地长期运行的 Common Lisp 图像交互,可能是守护进程?

我知道可以从终端命令提示符运行 Common Lisp 函数,我也知道这一点

我需要做类似的事情,但使用本地的、已经长期运行的Common Lisp 映像,能够从 CLI 或 shell 脚本轮询可用函数。

有没有办法从 CLI 中做到这一点,例如从 bash 脚本调用函数,并接收函数返回的任何内容?

例如,我可以创建一个原始的 Web 服务,可能使用wooHunchentoot调用函数并通过curlor获取返回值wget,但感觉有点复杂。

当然,这是 Emacs 的 SLIME 的众多特性之一,但我需要仅从 CLI 调用函数,而不调用 Emacs。

有没有办法在 SLIME 之外达到一个时髦的后端?

如果可能的话,这样做的 lisp 惯用方式是什么?

我将不胜感激任何指示。


更新

附加说明

许多年前,我对能够远程登录到长期运行的 LISP 映像很感兴趣(我相信在这种情况下,将名称大写应该没问题)。如果我没记错的话,它可以在 prompt.franz.com 上找到。一篇文章,以某种方式连接:用于远程访问正在运行的应用程序的 telnet

Telnet 当然是相当不安全的,但是无论出于何种原因,能够以这种方式访问​​ Lisp 应用程序的用处都不能被夸大,至少对某些人来说是这样。

一些额外的指针,谢谢

我要感谢 Basile Starynkevitch 详尽而透彻的回答,尤其是在理论方面。我一直在寻找一个更实用的方向,特别是与 Common Lisp 相关。尽管如此,他的回答还是很有启发性的。

我已经准备好开始编写本地服务器了,或许可以使用其中一个优秀的 Common Lisp 库,例如:

但是,多亏了 Stanislav Kondratyev,我不必这样做。他指出了一个已经存在的解决方案,它很好地回答了我的问题,ScriptL:Shell scripting made Lisp-like

我在 Linux、FreeBSD 和 OS X 上成功地测试了它,只要确保首先在 POSIX 系统调用上安装瘦包装器。在众多功能中(参见 README),它允许仅展示选定的功能,安全性得到妥善处理,甚至提供自定义 C 客户端,作为 ASDF 加载操作的一部分构建,并支持许多新功能,例如I/O,代替netcat.

4

2 回答 2

8

您可能会发现 scriptl 很有用:http: //quickdocs.org/scriptl/。但是,它依赖于 iolib,它依赖于一些非标准的 C 或 C++ 库,因此构建它并不是很简单。

如果您熟悉 swank 协议,确实可以与 swank 服务器通信,该协议似乎没有充分记录(参见例如:https ://github.com/astine/swank-client/blob/master/swank-description .markdown)。但是,这会通过网络公开 TCP 套接字,这可能是不安全的。有一次我也尝试过,但我对 IPC 的速度并不满意。

不久前,我编写了一个相当幼稚的特定于 SBCL 的服务器,它使用本地域套接字进行通信,并使用 C 语言编写了一个客户端。它非常原始,但你可以看看:https ://github.com/quasus/lispserver 。特别是,它支持交互式 IO 和退出代码。服务器和客户端构成了部署 Unix 风格软件的简单框架的核心。随意借用代码和/或联系我以获得解释、建议等。

于 2015-07-13T14:34:41.757 回答
5

它当然是特定于操作系统的,因为您需要一些进程间通信,它们是由操作系统提供的。

假设您有一个类似POSIX的操作系统,例如 Linux。

然后你可以设置一个socket(7)fifo(7)来发送 s-exprs 以进行评估。当然,您需要调整 Common Lisp 程序来添加这样的REPL

SBCL 有一些网络设施,您可以在它们的基础上进行构建。

当然,您应该首先了解 IPC 在您的操作系统上是如何工作的。如果是 Linux,你可以阅读Advanced Linux Programming(它以 C 编程为中心,这是在 POSIX 上使用 OS 服务的低级方式,但你可以将你所学的内容改编为 SBCL)。事实上,Common Lisp 标准可能没有正式的 POSIX 接口,因此您需要深入了解具体的实现细节。

也许您应该了解更多关于BSD 套接字的信息。有很多关于它们的教程。然后您可以使用 TCP 套接字(参见tcp(7))或 Unix 套接字(参见unix(7))。高级用户可以使用 unsafetelnet命令。或者你可以让你的软件使用 SSL,或者一些libssh ,例如ssh 用作他们的客户端。

您可以决定并记录用户应用程序和您的程序之间的协议是:从用户应用程序代码发送 some-sexpr(在记录的套接字上)到您的服务器,该服务器由双换行符或换页符终止,并让您的服务器eval并发送回结果或一些错误消息。我在MELT中做过类似的事情,这没什么大不了的。小心缓冲。

我猜你假设你有负责任和有能力的用户(所以不要向狂野的互联网打开这样一个远程 REPL!)。如果您关心远程 REPL 的恶意或愚蠢使用,它就会变得复杂。

或者,使您的服务器成为一个 Web 应用程序(通过在其中使用一些 HTTP 服务器库),并要求用户使用他们的浏览器或一些 HTTP 客户端程序(curl)或库(libcurl)与之交互。

于 2015-07-13T06:58:56.097 回答