CLI アプリケーションの通常のパターンは、ユーザーが終了コマンドを入力するまで、無限ループで実行されることです。同様に、C 言語では次のようになります。
while(1){
scanf("%c", &op);
...
else if(op == "q")
break;
}
F# でこのようなコンソール アプリケーションのパターンはどのようなものになるでしょうか (末尾再帰を使用しようとしましたが、失敗しました)。
CLI アプリケーションの通常のパターンは、ユーザーが終了コマンドを入力するまで、無限ループで実行されることです。同様に、C 言語では次のようになります。
while(1){
scanf("%c", &op);
...
else if(op == "q")
break;
}
F# でこのようなコンソール アプリケーションのパターンはどのようなものになるでしょうか (末尾再帰を使用しようとしましたが、失敗しました)。
ブラウザで入力すると、エラーが含まれる場合があります。
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()
これは、1 つのキーを押すだけで応答するブロックなしのバージョンです。
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()
このような関数は便利です:
let rec forever f =
f()
forever f
使用法:
forever <| fun () ->
//function body
ただし、コードをより文字通りに翻訳すると、次のようになります。
while true do
//body
また
while true do
(* ..code.. *)
しかし、末尾再帰の方がより凝っていると思います (どちらも の下で同じものにコンパイルされます--optimize
)。