Clojure Lein (read-line) 标准输入问题

7

普通的Clojure REPL可以正常工作,(read-line)收集输入并回显。但是使用lein repl时,从未回显任何输入字符,也从未允许我返回任何stdin读取命令。

我确定这与重新绑定in有关,但想知道是否有解决方法/修复方法?

谢谢。

3个回答

5
由于ant中的一个错误,它阻止了从启动的子进程使用stdin流。但是telnet技巧应该可以工作,因为lein repl启动了一个socket repl服务器,在这里它运行良好。

谢谢,我会尝试一下,虽然这个问题实际上是在slime中出现的,但我的帖子将其缩小到了repl/swank,但对我来说telnet行不通。有趣的是,这个问题在cake中不存在。Cake的(read-line)不会挂起,而是返回空字符串。你是说我可以启动lein swank,然后当它到达(read-line)并阻塞时,我可以通过telnet连接,并使用它进行任何stdin操作,这些操作将反映在repl/swank中? - Ilya Sterin
那很奇怪,我不明白 telnet 怎么会失败。但我刚刚推送了一个 bug 修复到 lein repl,现在 read-line 在 repl 中对我而言有效。如果您使用最新的 1.4.0-SNAPSHOT 也是如此,请告诉我;如果不是,请打开一个问题或开始一个邮件列表线程。 - user61051

2

通过telnet连接到REPL。

$ lein repl
REPL started; server listening on localhost:63849.
user=> 
[1]+  Stopped                 lein repl
$ telnet localhost 63849
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
user=> (read-line)
hello
"hello"
user=>

1
这里不起作用,telnet localhost port没有出现任何repl提示符。我尝试过最新版本和开发构建版本。我正在使用OSX,使用jse 1.6,虽然这并不重要,但只是想看看我们是否有相同的配置。 - Ilya Sterin
这里是带有jdk 1.6的Ubuntu。请检查您的/etc/hosts文件。本地主机是否绑定到127.0.0.1?您是否正确地将lein进程放入后台?也许尝试在不同的终端窗口上启动lein和telnet?如果失败,我建议您尝试使用cake(http://www.assembla.com/wiki/show/clojure/Getting_Started_with_Cake)。 - Pedro Silva

1
现在这个对我有用: 将你的 read-line 调用用宏 with-read-line-support 包装起来,该宏在 ns swank.core 中 [自 swank-clojure 1.4+ 开始可用]:
(use 'swank.core)
(with-read-line-support 
  (println "a line from Emacs:" (read-line)))

感谢Tavis Judd提供的修复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接