我从John Whitington开始关注 OCaml一书。在第91-92页中,他讨论了如何从OCaml打印和读取值。他声称代码
let rec read_dict()=
let i=read_int () in
if i=0 then
[]
else
let name=read_line in
(i, name):: read_dict ();;
read_dict();;
应该让我拿一些输入整数值和字符串值,然后给我一个带对的列表。但我无法在我的计算机上执行代码,也无法在 Try Ocaml 网站中成功执行。请问有什么问题?
我尝试在OCAMl中使用Windows IDE,在Ubuntu上的 utop 以及网站上的 Try OCaml 。在第一个例子中,程序继续运行,没有任何东西出现。在第二个它需要价值但永远不会结束。在第三个实例中,它接受值,但是当我给出像One这样的字符串值时,会给出一条错误消息。
答案 0 :(得分:3)
将let name=read_line in
替换为let name = read_line () in
,它应该在命令行工作(尽管不在顶层,这会弄乱stdin
)。
输入应该类似于
1
one
2
two
0
答案 1 :(得分:3)
让我们一步一步来试试吧。首先创建一个名为input_dict.ml
的文件,然后在您喜欢的文本编辑器中打开它。
然后输入以下代码:
open Printf
let rec read_dict () =
let i = read_int () in
if i = 0 then [] else
let name = read_line () in
(i, name) :: read_dict ()
(* The entry point. Read a dictionary and print it out. *)
let _main : unit =
let dict = read_dict () in
printf "dict = { ";
List.iter (fun (i,n) -> printf "%d => %s; " i n) dict;
printf " }\n"
我已经添加了一些打印结果,只是你可以肯定它正常工作。
现在保存文件,继续执行shell,确保您在文件目录中并使用命令ocamlbuild input_dict.byte --
编译并运行程序。 (这两个尾随的破折号指示ocamlbuild
在编译后运行程序)。最后,这将是这样的:
$ ocamlbuild input_dict.byte --
42
Hello
56
World
0
dict = { 42 => Hello; 56 => World; }
请注意,您不应该以交互模式运行此程序,因为您的输入将被OCaml解释器“吃掉”。