如何使用文件输入在OCaml中运行程序?

时间:2016-04-28 19:04:16

标签: ocaml ocaml-toplevel

我知道为了在OCaml中加载程序,必须在toplevel中键入#use "source_code_file.ml",其中source_code_file.ml是我们想要使用的文件。

我的程序从stdin读取输入。在命令行中,我有一个带有重定向的txt文件,用作stdin。我可以在顶级做到这一点吗?我想这样做是因为在顶层我可以很容易地看到什么类型的变量以及是否用正确的值初始化了事物。

1 个答案:

答案 0 :(得分:1)

如果您使用的是类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
#

如果您希望通过对函数的调用来交错与顶层的交互以仅消耗其部分输入,则此技术过于简单。我怀疑这会让事情变得太复杂而不值得付出努力。重写代码以使用明确指定的输入通道会更容易(也许总体上更好)。