在为编程语言构建REPL控制台应用程序时出现以下问题。从本质上讲,语言依赖于您能够编写多行文本。但是,ENTER
键也可用于评估表达式。
> 1 + 1<enter>
int int1 = 2
> <cursor>
为了允许多行输入,我使用的算法计算括号,括号,括号和引号的数量,因此如果它们中的任何一个是不平衡的,它会插入换行符:
> if (int1 < 3) {<enter>
| println "ok"<enter>
| }<enter>
ok
> <cursor>
这种方法的主要问题是,只要我在一行上按Enter键,就不能再编辑该行了。在BACKSPACE
符号处反复按}
将首先将其删除,然后停留在该位置,而不删除换行符并允许我删除println
行。这使得程序非常容易出错并且编辑非常繁琐。
另一个问题是我甚至无法在某些控制台(如Mac终端)中使用光标。控制台将在该事件中显示ANSI控制代码。
有没有办法解决这两个问题,可能是通过向我的REPL前端引入自定义游标处理? JVM带给我多少访问封闭控制台?我可以强制控制台将所有按键重定向到程序吗?而且,我是否必须针对不同的IDE控制台/终端/操作系统使用不同的技术?
答案 0 :(得分:0)
问题不在于JVM&#34;,而是JavaRepl的简单代码。控制台输入(参见source)只是从标准输入读取行:
private static Mapper<Sequence<String>, String> readFromConsole() {
return new Mapper<Sequence<String>, String>() {
private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
public String call(Sequence<String> lines) throws Exception {
return reader.readLine();
}
};
}
BufferedReader
真的没有做太多。它的文档也没有帮助。关于TutorialsPoint的说明有帮助;
java.io.BufferedReader.readline()方法读取一行文本。一条线被认为是换行(&#39; \ n&#39;),回车(&#39; \ r&#39;)或回车后紧接着换行符中的任何一条终止
要根据需要改进JavaRepl,必须将其修改为(至少)允许处理由左箭头和键盘删除发送的转义序列 - 与#34;退格&#34; (实际上删除)。它是可行的(但可能不是JavaRepl的开发人员想要的:与旧版本的Java的兼容性可能是一个考虑因素)。即使是&#34;更新的&#34;记录了来自Java6的Console
类,但没有暗示它只是对BufferedReader
进行适度的重写以帮助提供密码提示。
有关读取转义序列的信息,请参阅
要进行多行编辑,需要另一个步骤来更改其界面以允许检索前一行并编辑它们。我认为这超出了JavaRepl设计的范围(但你可能会向开发人员提出建议)。