从J中的STDIN读取一行

问题描述 投票:2回答:1

TL; DR如何在不消耗所有标准输入的情况下从J中的标准输入读取一行字符?我正在寻找一种便携式方法。

我一直在尝试创建一个交互式J程序,它从用户那里读取一行输入。在我的研究期间,我遇到了this page,它说(emph。补充):

J的本机文件操作是面向文件的,而不是面向流的;也就是说,它们一次读取整个文件,并且没有“当前文件指针”,换行符或只返回一条记录的readline动词的概念。这样的工具很容易编写,但通常最好一次处理整个文件,就像普通计算J一次使用整个数组一样。读入您的文件,将其拆分为记录,然后处理记录列表。

但是,我因为编写这样的实用程序而感到茫然。如果J有一个getchar函数,任务将变得微不足道,但据我所知,读取输入的唯一方法是通过外部调用1!:1(3)(或stdin'')消耗所有输入。这不是理想的解决方案,因为我希望能够与用户的输入进行交互。

例如,假设我想复制这个Python 3程序的行为:

print("Enter grade: ")
grade = int(input())
if grade > 90:
    print("Good job!")
else:
    print(":/")

print("Enter some text: ")
text = input()
print("Reversed: " + text[::-1])

这大致可以在J中翻译为:

getgrade := 3 : 0
  grade =. ". y
  if. grade > 90 do.  echo 'Good job!'
  else.               echo ':/'
  end.
)

echo 'Enter grade: '
getgrade readline ''
echo 'Enter some text: '
echo 'Reversed: ' , |. readline ''

当然,假设readline的正确定义。

思考

我想也许我可以使用J的shellspawn命令来调用读取行的可执行文件。但是,shell要求输入从动词本身传递,我不能让spawn在我的J安装上工作,尽管我怀疑它会产生正确的行为。

stdin readline j
1个回答
4
投票

我认为这

这样的设施很容易写

本着“这种设施易于在核心语言中实施”的精神。

我找不到令人满意的方式来实现你想要的东西。以下可能会有所帮助。

1. Make a qt-app or a lab

jqt中有很多表单和提示实用程序。 window driver可以做很多事情。

2. Use general/misc/prompt

制作一个剧本:

load'general/misc/prompt'
main =: 3 : 0
 a =: prompt 'Enter grade: '
 echo 'Grade entered: ',a
)

但是你必须使用REPL

 load'yourscript'
 main ''

3. Use a wrapper script.

--- wrap.sh ---
#!/usr/bin/env bash
j <<EOF
+/ $(read -p 'Grades: ' k; echo $k)
EOF
---
./wrap.sh
Grades: 3 5 9
17
© www.soinside.com 2019 - 2024. All rights reserved.