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的shell
或spawn
命令来调用读取行的可执行文件。但是,shell
要求输入从动词本身传递,我不能让spawn
在我的J安装上工作,尽管我怀疑它会产生正确的行为。
我认为这
这样的设施很容易写
本着“这种设施易于在核心语言中实施”的精神。
我找不到令人满意的方式来实现你想要的东西。以下可能会有所帮助。
lab
jqt中有很多表单和提示实用程序。 window driver可以做很多事情。
general/misc/prompt
制作一个剧本:
load'general/misc/prompt'
main =: 3 : 0
a =: prompt 'Enter grade: '
echo 'Grade entered: ',a
)
但是你必须使用REPL
load'yourscript'
main ''
--- wrap.sh ---
#!/usr/bin/env bash
j <<EOF
+/ $(read -p 'Grades: ' k; echo $k)
EOF
---
./wrap.sh
Grades: 3 5 9
17