Common lisp 如何以编程方式写入*标准输入*,以便在repl进行评估?

Common lisp 如何以编程方式写入*标准输入*,以便在repl进行评估?,common-lisp,read-eval-print-loop,Common Lisp,Read Eval Print Loop,我在repl-clozure-common-lisp中键入以下内容 (defparameter test 1) repl以test响应 现在我进入: (format *standard-input* "(defparameter test 2)") Repl输出参数测试2,后跟nil 但测试值保持不变,为1 为什么会这样?写入变量*标准输入*是否与在repl处输入文本相同 我如何实现期望的评估 一些背景: 我正在使用套接字为通用lisp开发制作一个自定义前端。我需要写入标准输入,因为即使我可

我在repl-clozure-common-lisp中键入以下内容

(defparameter test 1)
repl以test响应

现在我进入:

(format *standard-input* "(defparameter test 2)")
Repl输出参数测试2,后跟nil

但测试值保持不变,为1

为什么会这样?写入变量*标准输入*是否与在repl处输入文本相同

我如何实现期望的评估

一些背景:

我正在使用套接字为通用lisp开发制作一个自定义前端。我需要写入标准输入,因为即使我可以使用eval和read对代码进行求值,也无法在出现错误时调试代码

例如,据我所知,如果不写入标准输入,输入1以展开堆栈并返回顶层是不可能的。我已经计算出了输出部分。

*标准输入*是一个输入流,顾名思义。这是一个你从中读取的流,而不是一个你向其写入的流。它也可能是一个输出流,但如果它正在写入,它就不会将字符串注入REPL


我建议您看看或者如果您想了解如何让repl和调试器与下游事物交互。特别值得一提的是,这可能是值得理解的有趣的一点,或者是斯莱的等价物,也就是斯莱恩克或斯莱恩克,不确定资本化程度。这些协议在各种Lisp中的实现并不完全是琐碎的,但是这些实现已经存在:您不必编写它们。屏幕抓取一个供人交互的界面几乎总是一种糟糕的方法:只有在没有更好的方法时才合理,在这种情况下,有更好的方法,事实上至少有两种。

输入1…难道你不想以编程的方式捕捉和处理错误吗?不是真的,使用handler bind等可以很容易地做到这一点。我正在开发的前端是基于浏览器的,通过WebSocket与终端中正在运行的repl进行通信。要计算的代码通过websocket连接发送,由repl读取和计算,结果通过相同的连接发送回。一切都很好。除非有错误。现在,我想将调试io输出发送到浏览器,这是可行的,但当我发送1或其他预期输入时,我无法再对其进行评估,看到了吗?如果我这样做,它仍然只是一个1,它不会得到处理。