2014-05-17 26 views
1

我從John Whitington的最初開始遵循書籍OCaml。在第91-92頁他討論瞭如何打印和讀取OCaml的值。他聲稱,代碼如何在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();; 

應該讓我拿一些輸入整數值和字符串值,並返回我對的列表。但是我無法在我的計算機上執行代碼,也無法在嘗試Ocaml網站上成功執行代碼。請問有什麼不對?

我試圖在Windows IDE OCaml的頂層,在UTOP在Ubuntu,以及嘗試OCaml的在網站上。在第一個例子中,程序繼續運行,沒有任何東西出現。在第二個它需要價值,但永遠不會結束。在第三種情況下,它需要值,但是當我給出一個字符串值時給我一個錯誤消息。

+0

當你說它取值但永不結束時,你是否嘗試給出'0'作爲整數?這看起來像是什麼應該結束輸入。 –

+0

讓我試着在烏托邦再次實現它。但是,在Try Ocaml網站中,它以0結尾,但它不能帶任何字符串值。 –

回答

3

let name=read_line in替換爲let name = read_line() in並且它應該在命令行工作(儘管不在頂層,這將與stdin混淆)。

輸入應該是這個樣子

1 
one 
2 
two 
0 
+0

我試過你的代碼,但它並沒有要求我輸入任何內容。該功能經歷了。也許我應該用烏托邦再試一次。 –

+0

它不會直接問,但只是開始閱讀。你將不得不打印一份聲明以使請求更好。 – nlucaroni

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的翻譯。

+0

謝謝!讓我試試看。 –

+0

嗨!我跑了,但沒有出現。它只說「changwei @ Sparkie-Vi​​rtual-Machine:〜$ ocamlbuild input_dict.byte - 完成,3個目標(3個緩存)在00:00:00。 」 –

+0

我明白了錯。現在它正在工作!謝謝! –