2012-04-16 12 views
11

में अनंत मुख्य पाश, सीएलआई अनुप्रयोग के लिए एक सामान्य पैटर्न अनंत लूप में चलाना है, जब तक कि उपयोगकर्ता कुछ छोड़ने के आदेश को टाइप न करे। की तरह, सी भाषा में:एफ #

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 'में' नींद (0)' या 'SwitchToThread()' चाहते हैं या यह एक उच्च CPU उपयोग लूप होगा। : -] – ildjarn

+0

बच्चे को जला दो! हालांकि अच्छा बिंदु। :) – gradbot

+0

+1, मुझे यह पसंद आया! बहुत ही शांत। – yamen