2014-02-09 49 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