我想编写一个 OCaml 模块,该模块具有一个compile
函数,该函数将接受一个包含 OCaml 程序的字符串,并将编译结果输出为正确或错误,在错误情况下,输出有关第一个错误的行和字符的信息。我不在乎错误是什么(至少现在是这样)。
一个基本的模块类型是:
module type Compile =
sig
type result = Correct | Error of (int*int)
val compile : string -> result
end
至少有两种根本不同的方式来实现它:
- 快速破解方式——将字符串与程序一起写入文件,使用 Unix 进程
ocamlc
在命令行上调用并解析 stderr; - 正确的方法——使用 OCaml 工具来分析代码。
关于(1),我无法掌握 stderr 的内容。我开始使用
Unix.open_process_in
,它将标准输出重定向到一个 in_channel ,然后我可以读取它。由于ocamlc
go to stderr (而不是 stdout) 输出的编译错误,我尝试使用
let ic = Unix.open_process_in "ocamlc test.ml 2>&1"
以便 stderr 的内容在命令行被重定向到 stdout。我希望ic
这样可以包含编译错误。不幸的是,情况并非如此,ic
仅包含End_of_file
.
然后我转到Unix.create_process
命令,因为它允许我为 out、in、err 选择新通道。但是我在选择这些频道时遇到了麻烦。输出通道应该是什么,以便我可以在我的程序中读取它?
关于(2),您认为(合理)简单的方法是什么?
非常感谢您的帮助!