【问题标题】:Input string in J script hangsJ脚本中的输入字符串挂起
【发布时间】:2015-01-04 19:00:09
【问题描述】:

我用#! 用 J for linux 编写脚本!

但脚本挂起。在 Control-D 脚本回显输入的值之后。但是普通的 ENTER 只会将光标放在新行上。

#!/path/jconsole

a =. 1!:1]3
echo a
exit ''

【问题讨论】:

  • 我发现了丑陋的把戏:a=. shell 'read foo; echo -n $foo'

标签: input stdin readline j


【解决方案1】:

当 j 处于脚本模式时,您无法读取单行文本,但您可以通过将 immex 短语设置为 9!:27 然后设置 immex 来安排在 j 下次返回立即执行模式时运行某些内容使用9!:29 位为 1。这是一个例子:

#!/usr/bin/env j

NB. demo showing how to make a simple repl in j.

readln =: [: (1!:01) 1:
donext =: [: (9!:29) 1: [ 9!:27

main =: verb define
  echo ''
  echo 'main loop. type ''bye'' to exit.'
  echo '--------------------------------'
  while. (s:'`bye') ~: s:<input=:readln'' do.
    echo ".input
  end.
  echo '--------------------------------'
  echo 'loop complete. returning to j.'
  NB. or put (  exit'' ) here to exit j.
)

donext 'main _'

【讨论】:

  • 您对阅读单个键而不是“一行”输入有什么建议吗?例如,如果我在 J 中制作基于控制台的俄罗斯方块,我将如何实时读取箭头键?
  • 好吧,你可以包装一个小的 c/pascal/rust/go/whatever *.so 文件来为你完成终端 IO,但是一旦你使用另一种语言,你可能会更好只需编写一个新的 J 前端(在其事件循环中调用 J 引擎的顶级程序)或类似 rlwrap 之类的东西。这是我在 rlwrap 路线上所做的事情:github.com/tangentstorm/tangentlabs/blob/master/pascal/…github.com/tangentstorm/tangentlabs/blob/master/pascal/…
  • 更好的答案:我做了github.com/tangentstorm/j-kvm
  • 你知道,我只是指的是这个答案。 :)
【解决方案2】:

问题是(1!:1)&amp;3 一直读取到“文件结尾”。在 Linux 中,按 ctrl-D 会发送 EOF 信号。

如果这不是你要找的,恐怕除了你的“丑陋伎俩”别无他法

a=. shell 'read foo; echo -n $foo'

as (1!:1)&1 出于某种原因仅在会话期间有效...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多