Clojure控制台中的Backspace esc char

时间:2018-10-11 20:03:23

标签: clojure

我正在学习Clojure。

为了练习,我开始重写为儿子解决不平等问题(例如3 + 2?7)编写的Java应用。

在Java中我做了(注意使用反斜杠转义字符)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

public class JavaTest {
    public static void main(String[] args) throws Exception {
        System.out.print("3 + 2 ? 7\b\b\b");
        System.out.flush();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        reader.readLine();
    }
}

并查看预期结果:将光标放在问号位置,当我写一个字符时,它将覆盖问号。 correct output from java

但是当我在Clojure中做同样的事情(我相信是这样)

(print "3 + 2 ? 7\b\b\b")
(flush)

(let [reader (java.io.BufferedReader. *in*)]
      (.readLine reader))

我看到光标被放置在正确的位置数毫秒,然后在行尾移动。当我放置一个字符时,它被放置在我打印的字符串的末尾。 incorrect output from clojure

作为一种解决方法,我可以使用here建议的clojure-lanterna库,但我想在没有任何库的情况下解决这种简单的事情(就像我实际上在Java中所做的那样。)

对此有何想法? 也许有人可以解释该行为的原因。我试图在Clojure来源中找到它,但是没有成功。

谢谢!

2 个答案:

答案 0 :(得分:4)

使用clojure代替clj

clj将普通的Clojure REPL包装在rlwrap中,从而提供了更符合人体工程学的命令行编辑体验;大概在这里它以某种方式弄乱了光标。

答案 1 :(得分:0)

您可以通过调用本机Java方法来实现上述行为:

  (.println System/out "jjjabcdef 99999 777"  )
  (.println System/out "jjjabcdef 99999 \b\b\b 777"  )

=>

jjjabcdef 99999 777
jjjabcdef 999 777