2016-11-19 85 views
2

我试图写一个终端应用程序与Lwt。 基本上只要我的应用程序正在运行,我需要观看终端输入Lwt_io.read_line。Ocaml lwt永不结束循环

在我的程序运行时,是否有比下面(伪代码)更好的方式来实现某种循环?

while true do 
    let _ = ignore (Lwt_main.run my_application) 
done 

我不确定这是否正确。每当my_application中的所有线程都完成时,Lwt_main.run会再次被调用&再次& ...

是否有其他更好的方法来处理这个问题?

回答

4

您通常会将主循环编写为递归函数,该函数计算为一个线程,然后将该线程传递给Lwt_main.run。这里是一个小例子:

let() = 
    let rec echo_loop() = 
    let%lwt line = Lwt_io.(read_line stdin) in 
    if line = "exit" then 
     Lwt.return_unit 
    else 
     let%lwt() = Lwt_io.(write_line stdout line) in 
     echo_loop() 
    in 

    Lwt_main.run (echo_loop()) 

这可以编译和运行:

ocamlfind opt -linkpkg -package lwt.unix -package lwt.ppx code.ml && ./a.out 

在粗略估计,这是在上面的代码会发生什么:

  1. echo_loop()应用在参数Lwt_main.run中。这立即开始评估Lwt_io.(read_line stdin),但代码的其余部分(从if表达式开始)放入一个闭包中,以便在read_line完成后运行。 echo_loop()然后评估为正在进行的操作和紧接着的操作的组合。
  2. Lwt_main.run强制您的进程等待所有完成。但是,一旦read_line完成,如果行不是exit,则关闭会触发write_line操作,然后是另一个关闭,它将递归调用echo_loop(),这会启动另一个read_line,并且这可以无限期地继续。
+1

我觉得自己像个白痴一样没有想到这个......感谢广泛的回应! – Seneca