【问题标题】:How do i programmatically write to *standard-input* for evaluation at the repl?我如何以编程方式写入 *standard-input* 以在 repl 进行评估?
【发布时间】:2020-08-19 00:53:48
【问题描述】:

我在 repl (clozure common lisp) 中输入以下内容

(defparameter test 1)

repl 回复 test

现在我输入:

(format *standard-input* "(defparameter test 2)")

Repl 输出 (defparameter test 2) 后跟 nil

但 test 的值保持不变,为 1。

这是为什么呢?写变量*standard-input*和repl输入文本不一样吗?

我如何达到预期的评价?


一些上下文:

我正在为使用套接字的通用 lisp 开发制作自定义前端。我需要写入标准输入,因为即使我可以使用 eval 和 read 评估代码,我也无法调试错误代码。

例如,如果不写入标准输入(据我所知),输入 1 来展开堆栈并返回顶层是不可能的。我已经弄清楚了输出部分。

【问题讨论】:

  • "entering 1..." 您不想以编程方式捕获和处理错误吗?
  • 并非如此,这可以通过 handler-bind 等轻松完成。我正在开发的前端是基于浏览器的,它通过 websockets 与终端中正在运行的 repl 进行通信。要评估的代码通过 websocket 连接发送,由 repl 读取和评估,结果通过同一连接发送回。这一切都很好。除非出现错误。现在我想将 debug-io 输出发送到浏览器,它可以工作,但是当我发送说“1”或其他预期输入时,我无法再评估它,你看到了吗?如果我这样做了,它仍然只是一个 1,它不会被处理。

标签: common-lisp read-eval-print-loop


【解决方案1】:

*standard-input* 是一个 input 流,顾名思义。这是您从中读取的流,而不是您写入的流。它也可能是一个输出流,但如果它正在写入,则不会将字符串注入 REPL。

如果您想了解如何让 REPL 和调试器与下游的事物交互,我建议您查看 SLIMESLY。特别是SWANK 可能是一个有趣的理解位,或者是 SLY 的等价物,即 SLYNK(或 slynk,不确定大小写)。这些协议在各种 Lisps 中的实现并不完全是微不足道的,但这些实现已经存在:您不必编写它们。屏幕抓取一个供人类交互的界面几乎总是一种糟糕的方法:只有在没有更好的方法时才合理,在这种情况下有更好的方法,实际上至少有两种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多