从命令行与本地 long-运行 Common Lisp 图像交互,可能是守护进程

Interact with a locally long-running Common Lisp image, possibly daemonized, from the command line

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

我知道可以 run a Common Lisp function from a Terminal command prompt, I am also aware of this

我需要做类似的事情,但是使用本地的,已经 long-运行 Common Lisp 图像,能够从 CLI 轮询可用函数或 shell 个脚本。

有没有办法从 CLI 执行此操作,例如从 bash 脚本调用函数,然后接收回任何函数 returns?

我虽然可以,例如,创建一个原始的网络服务,也许使用 woo or Hunchentoot,调用函数并通过 curlwget 获取返回值,但感觉有点绕。

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

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

如果可能的话,lisp 惯用的方法是什么?

如有指点,我将不胜感激。


更新

补充说明

很多年前,我对能够通过 telnet 进入一个长 运行 LISP 图像感到很感兴趣(我相信在这种情况下将名称大写应该没问题)。如果我没记错的话,它可以在 prompt.franz.com 找到。一篇文章,以某种方式连接:telnet for remote access to a running application

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

一些额外的建议,谢谢

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

我已经准备好开始编写本地服务器,可能会使用一个优秀的 Common Lisp 库,例如:

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

我在 Linux、FreeBSD 和 OS X 上测试成功,只需确保先安装 thin wrapper over POSIX syscalls。在众多功能中(请参阅 README),它允许仅展示选定的功能,妥善处理安全性,甚至提供自定义 C 客户端,作为 ASDF 加载操作的一部分构建,并支持许多新功能,例如I/O,代替 netcat

肯定是operating system specific, because you want some inter-process communication,而且是OS提供的。

假设您有一个 POSIX 像 OS,例如Linux.

然后你可以设置一个socket(7) or fifo(7) to which you send s-exprs to be evaluated. Of course you need to adapt the Common Lisp program to add such a REPL

SBCL 有一些网络设施,您可以在 them.

上构建

当然,您首先应该了解 IPC 如何在您的 OS 上工作。如果是 Linux,你可以阅读 Advanced Linux Programming(它以 C 编程为中心,这是在 POSIX 上使用 OS 服务的低级方式,但是你可以将你学到的东西应用到 SBCL 中)。事实上,Common Lisp 标准可能没有官方的 POSIX 接口,因此您需要深入研究特定于实现的细节。

也许您应该了解更多有关 BSD sockets. There are tons of tutorials on them. Then you could use TCP sockets (see tcp(7)) or Unix ones (see unix(7)). Advanced users could use the unsafe telnet command. Or you might make your software use SSL, or perhaps some libssh 的信息,例如使用 ssh 作为他们的客户。

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

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

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

您可能会发现 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 风格软件的简单框架的核心。随意借用代码and/or 联系我解释,建议等