2016-11-19 9 views
2

私はLwtでターミナルアプリケーションを作成しようとしています。 私のアプリが動いている間、基本的にはLwt_io.read_lineで端末を見る必要があります。Ocaml lwt never ending loop

私のプログラムの実行中に何らかのループを達成するには、以下の(擬似コード)より良い方法がありますか?

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

これが正しい方法であるかどうかはわかりません。 my_applicationのすべてのスレッドが終了するたびに、Lwt_main.runが再び呼び出されます&もう一度&

Lwtでこれを処理する方法は他にもありますか?

答えて

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()) 

これはコンパイルして実行することができる:ここで小さい例で適用される

  1. echo_loop():粗面で

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

    、これは上記のコードで何が起こるかであります引数はLwt_main.runです。これにより、すぐにLwt_io.(read_line stdin)の評価が開始されますが、コードの残りの部分(の式で始まる)は、read_lineが完了すると実行されるクロージャーに入れられます。 echo_loop()は、続いてこの進行中の閉鎖の操作のこの組み合わせまで評価される。

  2. Lwt_main.runすべての処理が完了するまで、プロセスは強制的に待機します。ただし、read_lineが完了すると、行がexitではない場合、クロージャはwrite_line操作をトリガし、その後に別のクロージャが続きます。echo_loop()を再帰的に呼び出し、別のread_lineを開始し、これが無限に続くことがあります。
+1

私はこのことを考えないとばかげているように感じます...広範な応答をありがとう! – Seneca