Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从命令行与本地长期运行的公共Lisp映像交互(可能是守护进程)_Lisp_Common Lisp_Command Line Interface_Swank - Fatal编程技术网

从命令行与本地长期运行的公共Lisp映像交互(可能是守护进程)

从命令行与本地长期运行的公共Lisp映像交互(可能是守护进程),lisp,common-lisp,command-line-interface,swank,Lisp,Common Lisp,Command Line Interface,Swank,如何从命令行与本地长期运行的公共Lisp映像(可能是守护进程)交互 我知道这是可能的,我也知道 我需要做类似的事情,但是使用本地的、已经长期运行的公共Lisp映像,能够从CLI或shell脚本轮询可用函数 是否有一种从CLI执行此操作的方法,例如从bash脚本调用函数,并接收函数返回的任何内容 例如,我认为可以创建一个基本的web服务,可能使用or调用函数,并通过curl或wget获取返回值,但它感觉有点复杂 当然,这是Emacs SLIME的许多特性之一,但我需要只从CLI调用函数,而不调用E

如何从命令行与本地长期运行的公共Lisp映像(可能是守护进程)交互

我知道这是可能的,我也知道

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

是否有一种从CLI执行此操作的方法,例如从bash脚本调用函数,并接收函数返回的任何内容

例如,我认为可以创建一个基本的web服务,可能使用or调用函数,并通过
curl
wget
获取返回值,但它感觉有点复杂

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

除了黏液之外,是否有一种方法可以到达一个时髦的后端

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

如果有任何建议,我将不胜感激


更新 附加说明 许多年前,我对能够远程登录到一个长时间运行的LISP映像(我相信在本例中,名称的大写应该可以)很感兴趣。如果我没记错的话,它可以在prompt.franz.com上找到。一篇文章,以某种方式连接:

Telnet当然是非常不安全的,但是无论出于什么原因,能够以这种方式访问Lisp应用程序的有用性怎么强调都不过分,至少对一些人来说是如此

一些额外的提示,谢谢 我要感谢Basile Starynkevitch详细而透彻的回答,特别是在理论方面。我正在寻找一个更实用的方向,特别是与CommonLisp相关的方向。不过,他的回答很有启发性

我已经准备好开始编写一个本地服务器,可能使用一个很好的公共Lisp库,比如:

但是,多亏了斯坦尼斯拉夫·康德拉蒂耶夫,我没必要这么做。他指出了一个已经存在的解决方案,很好地回答了我的问题

我在Linux、FreeBSD和OSX上成功地测试了它,只需确保安装第一个。在众多功能中(请参见自述),它允许展示选定的功能,安全性得到了正确处理,甚至还提供了一个自定义C客户机,作为ASDF加载操作的一部分进行构建,并支持许多新功能,例如I/O,以代替
netcat

它当然是特定的,因为您需要一些,而且它们是由操作系统提供的

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

然后您可以设置一个or,向其发送s-EXPR以进行评估。当然,您需要修改公共Lisp程序来添加这样的代码

SBCL有一些网络设施,你可以利用它们

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

也许你应该多了解一些。有很多关于它们的教程。然后可以使用TCP套接字(请参阅)或Unix套接字(请参阅)。高级用户可以使用不安全的
telnet
命令。或者,您可以让您的软件使用SSL,或者使用
ssh
作为客户端

您可以决定并记录用户应用程序和您的程序之间的协议是:从用户应用程序代码向您的服务器发送一些sexpr(在有文档记录的套接字上),该服务器通过双换行符或表单提要终止,并让您的服务器对其进行评估,然后返回结果或一些错误消息。我以前也做过类似的事情,这没什么大不了的。小心缓冲

我猜你认为你有负责任和有能力的用户(所以不要在互联网上打开这样一个远程回复!)。如果您关心恶意或愚蠢地使用远程REPL,那么它将变得越来越复杂


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

您可能会发现scriptl很有用:。但是,它依赖于IOLIB,这依赖于一些非标准的C或C++库,所以构建它不是很直接。 如果您熟悉swank协议,那么您确实可以与swank服务器进行通信,而swank协议似乎没有充分的文档记录(例如,请参见此处:)。但是,这会暴露网络上的TCP套接字,这可能是不安全的。有一次我也试过,但我对IPC的速度不满意


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

谢谢,我已经添加了操作系统的详细信息。您是否愿意添加一些关于如何从Lisp端添加进程间通信的详细信息,是否有一个好的库(即,至少部分记录)?感谢IPC的说明。我知道插座,但我希望找到一条更容易的路。在Linux上,使用套接字或FIFO可能是最简单的,方法是添加有文档记录的约定,即用户应发送两个以换行符结尾的s-expr进行评估。当然,您需要管理缓冲。为什么要问?背景是什么?为什么要避免使用
emacs
?感谢您的评论。我有长跑