【发布时间】:2018-06-04 13:50:34
【问题描述】:
TL;DR 如何在不消耗所有标准输入的情况下从 J 中的标准输入读取一行字符?我正在寻找一种可移植的方法。
我一直在尝试制作一个交互式 J 程序来读取用户的一行输入。在我的研究过程中,我遇到了this page,上面写着(emph. added):
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 的 shell 或 spawn 命令来调用读取一行的可执行文件。但是,shell 需要从动词本身传递输入,我不能让 spawn 在我的 J 安装上工作,尽管我怀疑它会产生正确的行为。
【问题讨论】:
-
This 可能会有所帮助。
-
@Eelvex
load 'misc'似乎对我没有任何作用,即使在install 'all'之后也是如此。此外,动词prompt=: 3 : '1!:1]1 [ ((2) 1!:2~ ])y'无法提供任何交互源。