【问题标题】:Reading a line from STDIN in J从 J 中的 STDIN 读取一行
【发布时间】: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' 无法提供任何交互源。

标签: stdin readline j


【解决方案1】:

我认为

这样的工具很容易写

本着“这样的设施很容易用核心语言实现”的精神。

我找不到令人满意的方法来实现您想要的。以下内容可能会有所帮助。

1。制作一个 qt-app 或 lab

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

2。使用general/misc/prompt

制作脚本:

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

但是你将不得不使用 REPL

 load'yourscript'
 main ''

3。使用包装脚本。

--- wrap.sh ---
#!/usr/bin/env bash
j <<EOF
+/ $(read -p 'Grades: ' k; echo $k)
EOF
---
./wrap.sh
Grades: 3 5 9
17

【讨论】:

  • 或指示您的用户使用^D 终止他们的输入,让您的生活更轻松。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多