gpt4 book ai didi

scheme - 基于 TCP 的 Racket REPL

转载 作者:行者123 更新时间:2023-12-04 04:32:05 25 4
gpt4 key购买 nike

我用 Racket(以前的 PLT 方案)构建了一个相当复杂的应用程序,并且想添加一个 REPL 用于调试目的。我试图让它通过 TCP 流访问:

(define repl-server
(thread (lambda ()
(let ((listener (tcp-listen 8082 5 #t)))
(do () (#f)
(let-values (((in out) (tcp-accept listener)))
(thread (lambda ()
(let ((port-string (get-port-string in)))
(Try "debug-repl" #f
(begin
(file-stream-buffer-mode out 'line)
(display-and-log "Password: " out)
(flush-output out)
(when (string=? (read-line in) "whatever")
(log "Connect to REPL: " port-string))
(current-input-port in)
(current-output-port out)
(current-error-port out)
(read-eval-print-loop))
(close-input-port in)
(close-output-port out))))))))))))
(Try name result-if-exception form)是一个提供基本异常处理的宏, (log ...) 和 (display-and-log ...) 做它们听起来的样子。

现在,如果我访问 REPL,我什至无法评估常量,因为我不断收到错误 compile: unbound identifier (and no #%app syntax transformer is bound) at: #%top-interaction .我怎样才能使这个 REPL 工作?以及如何访问值 define d 在启动 REPL 服务器之前?

最佳答案

您正在使用 read-eval-print-loop ,这与使用 eval 基本相同,因此遇到同样的问题。见relevant Guide section详细说明。最好完整阅读,但您正在寻找的答案要么是“命名空间”部分描述的内容,要么是“命名空间和模块”部分 - 第一个是如果您想要顶级类型的命名空间,并且第二个是如果你想要一个与代码出现的实际文件相对应的命名空间。(第一个通常更好——例如,如果你使用第二个,那么 repl-server 本身可供 REPL 用户使用,使其一个有问题的功能...)

这是它的样子:

...
(thread (lambda ()
(parameterize ([current-namespace (make-base-namespace)])
...same code...)))
...

对于第二个,定义一个 anchor 并使用 namespace-anchor->namespace正如该页面上的最后一个示例所示。

[顺便说一句,另见 run-server 东西,它有点旧,但仍然有用。]

关于scheme - 基于 TCP 的 Racket REPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5946380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com