Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 在漂亮的打印机中自动缩进_Ocaml_Indentation_Pretty Print - Fatal编程技术网

Ocaml 在漂亮的打印机中自动缩进

Ocaml 在漂亮的打印机中自动缩进,ocaml,indentation,pretty-print,Ocaml,Indentation,Pretty Print,我已经实现了一个漂亮的打印机,它在复杂的语法树上运行得很好。由于语法很复杂,有时给出一个语句或表达式,因此打印构造函数有助于理解其结构。为此,我添加了一个参数constructor\u print。当此变量为false时,通常打印语句或表达式;否则,将以良好的顺序打印所有相关构造函数。下面是代码的一小部分(实际上有很多函数pp.): 例如,3+(-2)被解析为表达式e。当!构造函数\u print为falsepp_e标准输出e返回3+(-2);否则pp_e标准输出e返回 ADD_E_E ( In

我已经实现了一个漂亮的打印机,它在复杂的语法树上运行得很好。由于语法很复杂,有时给出一个
语句
表达式
,因此打印构造函数有助于理解其结构。为此,我添加了一个参数
constructor\u print
。当此变量为false时,通常打印
语句
表达式
;否则,将以良好的顺序打印所有相关构造函数。下面是代码的一小部分(实际上有很多函数
pp.
):

例如,
3+(-2)
被解析为表达式
e
。当<代码>!构造函数\u print为false
pp_e标准输出e
返回
3+(-2)
;否则
pp_e标准输出e
返回

ADD_E_E (
Int 3,
PARENTHESIZED_E UMINUS_E INT 2)
然而,问题是,我想在必要时打印缩进,以使其更具可读性。例如,我希望以前的输出可以是:

ADD_E_E (
  INT 3,
  PARENTHESIZED_E UMINUS_E INT 2)
规则很简单:当有一对(或三重或更多)构造函数(例如
ADD_e_e
)时,它会为其参数打印一行新行,每行有另外2个缩进空间;当存在一元构造函数(例如,
umius\u e
)时,它不会打印新行

几乎所有的行都有这种结构
Printf.fprintf chan(tercs…)。
,因为它们很多,我真的需要以一种巧妙的方式自动缩进

我想到的一种方法是使用ref变量
I
,它表示当前缩进的空格数。我们合并了
i:=!i+2和i:=!i-2
之前和之后
Printf.fprintf chan(tercs…)
。我们还需要修改
tercs
返回的格式:一旦出现
\n
,我们将在
\n
之后添加
i
空格


但是我也听说过
格式
模块提供的
提示
等。有人很了解它们吗?有没有更直接的解决方案可以满足我的要求?

您可以向函数传递一个整数参数,该参数将包含您应该在每行开头写入的空格数。如果要执行递归调用,则应增加该值。

这对学习如何使用格式模块也很有帮助
String.make offset“”
如果当前缩进为
offset
,则在换行后将生成要打印的字符串。
ADD_E_E (
  INT 3,
  PARENTHESIZED_E UMINUS_E INT 2)