2012-04-16 47 views
11

Mẫu thông thường cho ứng dụng CLI là chạy trong vòng lặp vô hạn, cho đến khi người dùng gõ một số lệnh thoát. Giống như, bằng ngôn ngữ C:Vòng lặp vô hạn trong F #

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

Mô hình cho ứng dụng bảng điều khiển như thế nào trong F # (cố gắng sử dụng đệ quy đuôi, nhưng không thành công)?

Trả lời

10

Typing trong trình duyệt, do đó có thể chứa lỗi:

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

điều này sẽ tràn ngăn xếp nếu đệ quy đuôi không bật? – Maslow

3

Cũng

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

Nhưng tôi đoán đuôi-đệ quy là hơn ưa thích (họ sẽ cả biên dịch để điều tương tự dưới --optimize) .

5

một chức năng như vậy có thể hữu ích:

let rec forever f = 
    f() 
    forever f 

Cách sử dụng:

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

Một dịch sát nghĩa hơn của mã của bạn, tuy nhiên, sẽ là:

while true do 
    //body 
+0

Cú pháp đáng yêu nhưng không thực tế lắm khi bạn muốn thoát khỏi điều kiện tôi muốn nói. –

9

Dưới đây là một none chặn phiên bản phản ứng với một lần nhấn phím.

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

Có thể muốn một 'Sleep (0)' hoặc 'SwitchToThread()' trong 'else' hoặc đó sẽ là một vòng lặp sử dụng CPU cao. : -] – ildjarn

+0

Đốt cháy em bé! Điểm tốt mặc dù. :) – gradbot

+0

+1, tôi thích cái này! Rất tuyệt. – yamen

Các vấn đề liên quan