TL; DR如何在不消耗所有stdin的情况下从J中的stdin读取一行字符?我正在寻找一种可移植的方法来实现这一点。
我一直在尝试创建一个交互式 J程序,该程序从用户那里读取一行输入。在我的研究过程中,我遇到了this page,其中说(已添加):
J的本机文件操作是面向文件的而不是面向流的;也就是说,他们一次只读取整个文件,并且没有“当前文件指针”,“换行符”或只返回一条记录的readline动词的概念。 这样的设施很容易编写,但通常最好一次处理整个文件,就像普通计算J一次使用整个数组一样。读入您的文件,将其拆分为记录,然后处理记录列表。
然而,我因为编写这样的实用程序而感到茫然。如果J有一个getchar
函数,任务将变得微不足道,但据我所知,读取输入的唯一方法是通过外部调用1!:1(3)
消耗所有输入(或{{1 }})。这不是理想的解决方案,因为我希望能够与用户的输入进行交互。
例如,让我们说我想要复制这个Python 3程序的行为:
stdin''
这大致可以在J中翻译为:
print("Enter grade: ")
grade = int(input())
if grade > 90:
print("Good job!")
else:
print(":/")
print("Enter some text: ")
text = input()
print("Reversed: " + text[::-1])
当然,假设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 ''
的正确定义。
我想也许我可以使用J' readline
或shell
命令来调用读取行的可执行文件。但是,spawn
要求输入从动词本身传递,并且我无法使shell
在我的J安装上工作,但我怀疑它会产生正确的行为。
答案 0 :(得分:4)
我想这个
此类设施易于编写
本着&#34的精神;这些设施很容易用核心语言实现,。
我找不到令人满意的方式来实现你想要的东西。以下可能会有所帮助。
AsyncTask
jqt中有很多表单和提示实用程序。 window driver可以做很多事情。
lab
制作剧本:
general/misc/prompt
但是你必须使用REPL
load'general/misc/prompt'
main =: 3 : 0
a =: prompt 'Enter grade: '
echo 'Grade entered: ',a
)
load'yourscript'
main ''