从J

时间:2017-12-21 20:47:44

标签: stdin readline j

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' readlineshell命令来调用读取行的可执行文件。但是,spawn要求输入从动词本身传递,并且我无法使shell在我的J安装上工作,但我怀疑它会产生正确的行为。

1 个答案:

答案 0 :(得分:4)

我想这个

  

此类设施易于编写

本着&#34的精神;这些设施很容易用核心语言实现,

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

1。制作一个qt-app或AsyncTask

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

2。使用lab

制作剧本:

general/misc/prompt

但是你必须使用REPL

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

3。使用包装器脚本。

 load'yourscript'
 main ''