在 ReasonML 中打印用户定义的类型

Printing User-Defined types in ReasonML

有没有一种简单的方法可以在 ReasonML 中打印用户定义的类型或嵌套列表?

上下文:我正在为 I TA 的 CS 入门课程的学生编写检查期望程序,我们今年第一次使用 Reason。当检查 expect 失败时,我想打印出预期输出和实际输出,但我不知道如何在不提前知道参数类型的情况下有效地打印出结果,尤其是嵌套的列表和用户定义的类型。

我目前的解决方法:我已经根据接受的类型编写了不同的检查期望程序(例如 checkExpectListLists,它映射每个嵌套列表并递归打印参数。)

潜在帮助:Sketch.sh 能够评估和打印出函数调用的结果,即使是用户定义的类型。有谁知道他们是怎么做的 this/how 我可以在我自己的支票中使用该功能来打印吗?

谢谢!

要记住的重要一点是,由于类型擦除,没有足够的信息在运行时使用编译代码漂亮地打印任何用户定义的类型。充其量,您可以打印内存表示。通过一些巧妙的技巧,您可以尝试将此内存表示映射到 您的 预定义类型。但是,这听起来可能会给您的学生带来令人抓狂的错误消息。

因此,您需要在评估前保留更多有关学生代码的信息。

一种方法是使用顶层会话,就像 Sketch 所做的那样。由于 Repl 可以访问类型定义,因此它可以使用此信息来漂亮地打印任何用户定义的类型。最简单的设置方法是启动 OCaml Repl 进程,并使用它来评估和打印学生代码。更复杂的可能性,但最终产生更多的控制,将是直接使用 OCaml 的编译器库。然后你必须初始化一个 REPL 会话,添加一些通量重定向。完成后,您可以逐句评估您的学生代码,查看环境中的现有值...

另一种正交方法是解析您的学生代码并向每个类型定义添加漂亮的打印机。这可以使用 ppx 基础设施来完成。例如,您可以编写一个自定义 ppx,为每个类型定义添加一个派生注释。您还可以寻找正在测试的功能并向该功能添加一些检测。