sobota, 15 października 2011

while i...when

Witam!
Rzadko się spotyka języki tak zaprojektowane, że implementują funkcyjność bez szkody dla obiektowości. Takim językiem na pewno nie jest OCaml gdyż bardzo upośledza on sam siebie...(F# jest już ładniejszy).
Nemerle zaś bardzo dobrze radzi sobie z obiektowością(używając stałych!). Bardzo ciekawym przypadkiem rozwiązania pewnego problemu na 2 sposoby jest liczenie linii w pliku tekstowym:

class LineCounter
 {
   public static Main () : void
   {
     //  Open a file.
     def sr = System.IO.StreamReader ("SomeFile.txt");   
     mutable line_no = 0;                                
     mutable line = sr.ReadLine ();
     while (line != null) {            
       System.Console.WriteLine (line);
       line_no = line_no + 1;           
       line = sr.ReadLine ();
     };                                  
     System.Console.WriteLine ("Line count: {0}", line_no);
   }
 }
Jest to typowo imperatywne rozwiązanie problemu. Teraz zobaczmy sobie przykład wykorzystania when.

class LineCounterWithoutLoop
 {
   public static Main () : void
   {
     def sr = System.IO.StreamReader ("SomeFile.txt");
     mutable line_no = 0;
 
     def read_lines () : void {            
       def line = sr.ReadLine ();
       when (line != null) {               
         System.Console.WriteLine (line); 
         line_no = line_no + 1;           
         read_lines ()                    
       }
     };
 
     read_lines ();      
 
     System.Console.WriteLine ("Line count: {0}", line_no); 
   }
 }
Jak widać mamy bardzo ładny przykład :)
When działa podobnie jak while jednak bez skoku :) Wykonuje kod dopóki, jednak nie skacze na początek(po wykonaniu kodu) jeżeli warunek jest prawdziwy. To bardzo ciekawy lukier składniowy, sprawiający, że można praktycznie odejść od imperatywizmów i skupić się na rekurencji :)

Brak komentarzy:

Prześlij komentarz

Popularne posty