Linux 中的 PolyML 彩色输出到终端

PolyML colored output to terminal in Linux

理想情况下,这行 PolyML 代码应提供所需的结果:

print "3[31m RED 3[0m NORMAL \n";

但是\033原来只是感叹号,并不是颜色编码的特殊符号。 我使用以下“迂回”方法,但它不允许以交互方式执行任何操作:我只是获取程序的输出并为其着色。

echo "\\033[31m RED \\033[0m NORMAL \\n" | xargs echo -e

这个问题有哪些可能的解决方案?是否可以在标准 PolyML 工具中解决它?

添加:我检查了 Ocaml 如何用

做同样的事情
Printf.printf "3[31m RED 3[0m NORMAL \n";;

-- 情况一样:没有得到颜色

p.s。这个问题不是重复的,因为它是关于 echo -e 和 print 在 ML 语言中的区别

感谢这个问题:

正确答案是在 Ocaml 和 PolyML 中都使用代码 \027 而不是 \033:

print "7[31m RED 7[0m NORMAL \n";

3是一个字符转义序列,在bash和许多其他语言中被解释为八进制数33对应的ASCII码字符。

然而,在 OCaml 中,此转义序列被解释为十进制。我们可以将数字从八进制 (33) 转换为十进制 (27) 并继续使用此语法,或者使用正确的八进制转义序列语法 (\o027)。或者我们甚至可以使用十六进制 (\x1b) 如果我们想更大胆一些。

所有这些都将在 OCaml 中工作,也可能在 PolyML 中工作(当然,如果您将 Printf.printf 替换为 print):

Printf.printf "7[31m RED 7[0m NORMAL \n";;
Printf.printf "\o033[31m RED \o033[0m NORMAL \n";;
Printf.printf "\x1b[31m RED \x1b[0m NORMAL \n";;

来源:The OCaml manual Chapter 9.1: Lexical conventions