2012-04-16 12 views
11

CLIアプリケーションの通常のパターンは、ユーザーがいくつかのquitコマンドを入力するまで、無限ループで実行することです。同様に、C言語で:F#で、このようなコンソールアプリケーションのためのパターンであるものFの無限メインループ

while(1){ 
scanf("%c", &op); 
    ... 
    else if(op == "q") 
     break; 
    } 

(テールrecursrionを使用しようとしましたが、失敗しましたか)?

答えて

10

ブラウザでタイプする、これ含みうるエラー:

let rec main() = 
    let c = System.Console.ReadKey() 
    if c.Key = System.ConsoleKey.Q then() // TODO: cleanup and exit 
    else 
    // TODO: do something in main 
    main() 
+4

テール再帰がオンでない場合、これはスタックオーバーフローしますか? – Maslow

3
また

while true do 
    (* ..code.. *) 

しかし、私が推測するには、末尾再帰は、より多くの空想が(彼らは両方の--optimizeの下で同じものをコンパイルします)です。

5

このような機能が有用であることができます。

let rec forever f = 
    f() 
    forever f 

使用法:

forever <| fun() -> 
    //function body 

あなたのコードの多くの直訳、しかし、次のようになります。

while true do 
    //body 
+0

素敵な構文ですが、終了条件を欲しいときはあまり実用的ではありません。 –

9

ここでは何もませんシングルキープレスに応答するブロッキングバージョン。

open System 

let rec main() = 
    // run code here 

    // you may want to sleep to prevent 100% CPU usage 
    // Threading.Thread.Sleep(1); 

    if Console.KeyAvailable then 
     match Console.ReadKey().Key with 
     | ConsoleKey.Q ->() 
     | _ -> main() 
    else 
     main() 

main() 
+0

'else'で' Sleep(0) 'や' SwitchToThread() 'が必要な場合や、CPU使用率が高いループの場合があります。 : - ] – ildjarn

+0

赤ちゃんを焼く!しかし、良い点。 :) – gradbot

+0

+1、私はこの1つが気に入りました!とてもかっこいい。 – yamen