我知道为了在 OCaml 中加载程序,必须#use "source_code_file.ml"
在顶层输入 source_code_file.ml 是我们要使用的文件。
我的程序从标准输入读取输入。在命令行中,我有一个带有重定向功能的 txt 文件用作标准输入。我可以在顶层做到这一点吗?我想这样做,因为在顶层我可以很容易地看到类型变量有什么,以及是否用正确的值初始化了事物。
我知道为了在 OCaml 中加载程序,必须#use "source_code_file.ml"
在顶层输入 source_code_file.ml 是我们要使用的文件。
我的程序从标准输入读取输入。在命令行中,我有一个带有重定向功能的 txt 文件用作标准输入。我可以在顶层做到这一点吗?我想这样做,因为在顶层我可以很容易地看到类型变量有什么,以及是否用正确的值初始化了事物。
如果您使用的是类 Unix 系统,则可以使用 Unix.dup2 进行几乎任何类型的输入重定向。这是一个with_stdin
接受输入文件名、函数和值的函数。它使用从命名文件重定向的标准输入调用函数。
let with_stdin fname f x =
let oldstdin = Unix.dup Unix.stdin in
let newstdin = Unix.openfile fname [Unix.O_RDONLY] 0 in
Unix.dup2 newstdin Unix.stdin;
Unix.close newstdin;
let res = f x in
Unix.dup2 oldstdin Unix.stdin;
Unix.close oldstdin;
res
如果您的函数不消耗整个输入,则剩余输入会混淆顶层。这是一个消耗其全部输入的示例:
# let rec linecount c =
try ignore (read_line ()); linecount (c + 1)
with End_of_file -> c;;
val linecount : int -> int = <fun>
# with_stdin "/etc/passwd" linecount 0;;
- : int = 86
#
如果您想将与顶层的交互与对您的函数的调用交错以仅使用其部分输入,则此技术太简单了。我怀疑这会使事情变得太复杂以至于不值得付出努力。重写代码以使用明确指定的输入通道会更容易(并且可能总体上更好)。