2012-04-16 21 views
11

Un patrón habitual para la aplicación CLI es ejecutar en bucle infinito, hasta que el usuario escriba algún comando de abandono. Al igual que, en lenguaje C:Bucle principal infinito en F #

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

¿Cuál sería el modelo para tal aplicación de consola en C# (tratado de utilizar recursrion cola, pero no)?

Respuesta

10

a escribir en el navegador, por lo tanto pueden contener errores:

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

¿Esto desbordará la pila si la repetición de cola no está activada? – Maslow

3

también

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

pero supongo cola recursividad es más elaborado (que va a compilar tanto a la misma cosa bajo --optimize) .

5

Tal función puede ser útil:

let rec forever f = 
    f() 
    forever f 

Uso:

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

Una traducción más literal de su código, sin embargo, sería:

while true do 
    //body 
+0

Encantadora sintaxis, pero no muy práctica cuando se quiere una condición de salida, diría yo. –

9

Aquí está un ninguno versión de bloqueo que responde a la pulsación de una sola tecla.

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

Puede querer un 'Sleep (0)' o 'SwitchToThread()' en el 'else' o un alto uso de CPU. : -] – ildjarn

+0

¡Quema el bebé quemado! Buen punto sin embargo. :) – gradbot

+0

+1, me gustó este! Muy genial. – yamen