2014-02-09 98 views
0

我已經寫在OCaml的一些代碼,執行類似於以下OCaml的遞歸打印到頂層

let rec main() = 

     DO STUFF... 

     let print_time() = 
     let time = Unix.localtime (Unix.time()) in 
     let hour = string_of_int (time.Unix.tm_hour) in 
     let minute = string_of_int (time.Unix.tim_min) in 
     print_string ("\n Time -- "^hour^":"^minute) 
     in 

     Lwt.bind(Lwt_unix.sleep 30.) 
     (fun() -> (print_time(); main();) 
    ;; 

    main();; 

此代碼完全運行在頂層動作,但是似乎該時間已經被印刷到緩衝器而不是立即打印到屏幕上。當我向頂層提供另一個命令時,緩衝區中的所有時間立即打印到屏幕上。

我該如何糾正這個問題,以便在每次調用print_time()時將時間打印到頂層,而不是當我給頂層命令時?

示例:如果我運行該程序,然後等待2分鐘,然後在頂級輸入內容之前輸入以下內容。如果我沒有在頂層輸入任何東西,那麼我只收到第一次的消息。

# #use "this_program";; 
    Time -- 12:03 

    # let x = 1;; 
    time -- 12:03 
    time -- 12:04 
    time -- 12:04 
    time -- 12:05 
    time -- 12:05 
    val x : int = 1 
    # 

而且,這種「循環」只能使用一次(main()不會遞歸調用本身)在本地編譯的代碼,我不知道如何糾正。

回答

1

在您致電print_string後,我會嘗試加入flush stdout