像树一样打印Scala Case类

像树一样打印Scala Case类,scala,printing,tree,proof,Scala,Printing,Tree,Proof,我希望构建一个工具,当一个表达式被输入其中时,它将生成一个逐步求值证明,并将其呈现为一棵树。对于类型检查树,我也会做同样的事情 以下是表达式及其等效AST的几个示例: 1+1+1=Plus(Plus(Num(1),Num(1)),Num(1)) \x:int.x=λ(x,int,Var(x)) 如果1+x==2,那么90+1 else 99=IfThenElse(等式(加上(Num(1),Var(x)),Num(2)),加上(Num(90),Num(1)),Num(99)) 我想输出一个格式

我希望构建一个工具,当一个表达式被输入其中时,它将生成一个逐步求值证明,并将其呈现为一棵树。对于类型检查树,我也会做同样的事情

以下是表达式及其等效AST的几个示例:

  • 1+1+1=Plus(Plus(Num(1),Num(1)),Num(1))
  • \x:int.x=λ(x,int,Var(x))
  • 如果1+x==2,那么90+1 else 99=IfThenElse(等式(加上(Num(1),Var(x)),Num(2)),加上(Num(90),Num(1)),Num(99))
我想输出一个格式良好的分步执行树。以示例1为例:

Num(1) | {eval res.}    Num(1) | {eval res.}
             ---------------------------------     --------------------
            Plus(Num(1), Num(1)) | {eval res.}    Num(1) | {eval res.}
         --------------------------------------------------------------
             Plus(Plus(Num(1), Num(1)), Num(1)) | {eval res.}
在每个递归步骤中,我想将求值结果嵌入{eval res.}

在未来,我还想增加用户能够进行小步评估的能力。因此,当我们从底部开始,当点击按钮或类似的东西时,加号(Num(1),Num(1)){eval res.}会出现,但不会出现Num(1){eval res.},因为左侧递归还没有从底部出来,它会继续

下面是一些此类证明树的示例:

和类型检查派生:


我想用那样的垂直方式打印一棵树。查看了相关问题后,我没有发现有人试图这样做。

欢迎来到Stack Overflow。所以,这不是一个你可以要求代码的地方,你必须先自己尝试。请在代码中添加一个起点,以便正确快速地回答您的问题。另请参见stackoverflow.com/help/mcveHere是我在网上找到的一个JSFIDLE,它显示了我想要的内容。因此,我可能正在寻找构建一个漂亮的打印机,它将接收AST并将其转换为HTML。我走对了吗?