GNU Smalltalk

GNU Smalltalk
Oryginalni autorzy Steve Byrne, Paolo Bonzini
Pierwsze wydanie 12 stycznia 2003 ; 20 lat temu ( 12.01.2003 )
Wersja stabilna
3.2.5 / 8 kwietnia 2013 ; 9 lat temu ( 08.04.2013 )
Magazyn
System operacyjny Unix ( Linux , Cygwin , Mac OS X/Darwin )
Typ Język programowania
Licencja GPL + LGPL
Strona internetowa https://www.gnu.org/software/smalltalk/

GNU Smalltalk to implementacja języka programowania Smalltalk przez projekt GNU .

Implementacja, w przeciwieństwie do innych środowisk Smalltalk, wykorzystuje pliki tekstowe do wprowadzania programów i interpretuje zawartość jako kod Smalltalk. W ten sposób GNU Smalltalk działa bardziej jak tłumacz niż środowisko w tradycyjny sposób Smalltalk.

GNU Smalltalk zawiera powiązania dla wielu bibliotek wolnego oprogramowania, w tym SQLite , libSDL , cairo , gettext i Expat .

Przykłady

Te przykłady działają tylko na GNU Smalltalk 3.0 i nowszych wersjach. Klasyczny przykład Hello world :

  'Witaj świecie!'  wyświetlaczNl 

Niektóre podstawowe kody Smalltalk:


                                                 
                                         
                                       
          „Wszystko, łącznie z literałem, jest obiektem, więc to działa:”  -199  abs  „199”  gst  is  cool  size  „11”  Slick  indexOf:  $c  „4”  Miły  dzień  nie jest  t  to?  '  asMałe litery  asSet  asSortedCollection  asString  "′?acdeinsty" 

Kolekcje

Konstruowanie i używanie tablicy :

        

          
       
          a  :=  #(  1  'cześć'  3.14  1  2  (  4  5  ))  a  at:  3  "3.14"  a  reverse  "((4 5) 2 1 3.14 'cześć' 1)"  a  zasób  "Ustaw(1 'cześć' 3,14 2 (4 5))" 

Konstruowanie i używanie skrótu :

        
       

      hash  :=  Słownik  z:  {  'woda'  ->  'mokra'  .  „ogień”  ->  „gorący”  }  .  hash  at:  'fire'  "Wydruki: gorące"  hash  keysAndValuesDo:  [  :  k  :  v  |  (  '%1 to %2'  %  {  k  .  v  })  displayNl  ] 


     „Wydruki: woda jest mokra,  ogień jest gorący”  hash  removeKey:  „woda”  „Usuwa„ woda ” ->„ mokra ”” 

Bloki i iteratory

Przekazywanie parametrów bloku jako zamknięcia :


   


  
 „pamiętaj o bloku”.  zapamiętaj  :=  [  :  imię  |  (  'Witaj, %1!'  %  {  nazwa  })  displayNl  ]  .  „Kiedy nadejdzie właściwy czas - ogłoś zamknięcie!”  zapamiętaj  wartość:  'świat'  "=> 'Witaj, świecie!'" 

Zwracanie zamknięć z metody:

  
           
                
    
    
   Rozszerzenie  liczb całkowitych  [  asClosure  [  |  wartość  |  wartość  :=  ja  .  ^  {[  :  x  |  wartość  :=  x  ]  .  [  wartość  ] } ] ]  bloki  :=  10  asClosure  .  ustawiający  :=  najpierw  blokuje  .  getter  :=  blokuje  drugi  .  pobierająca  wartość         
       
           "=> 10"  wartość  setera :   21  "=> 21"  wartość  gettera  "=> 21" 

Używanie blokady do wysyłania informacji z powrotem do dzwoniącego:

      
                  Integer  extend  [  ifEven:  evenBlock  ifOdd:  oddBlock  [  ^  self  even  ifTrue:  [  evenBlock  value:  self  ]  ifFalse:  [  oddBlock  value:  self  ] ] ] 

Wywołaj powyższą metodę, przekazując jej blok:

            10  ifEven:  [  :  n  |  n  /  2  ]  jeślinieparzysty:  [  :  n  |  n  *  3  +  1  ]  "=> 5" 

Iteracja po wyliczeniach i tablicach przy użyciu bloków:

    
    

     


 tablica  :=  #(  1  'cześć'  3.14  )  tablica  do:  [  :  element  |  pozycja  wyświetlNl  ]  "=> 1"  "=> cześć"  "=> 3,14"  (  3  do:  6  )  wykonaj:  [  :  pozycja  |  pozycja  wyświetlanaNl  ]  "=> 3"  "=> 4"  "=> 5"  "=> 6" 

Metoda taka jak inject:in: może akceptować zarówno parametr, jak i blok. Iteruje po każdym członku listy, wykonując pewne funkcje, zachowując agregat. Jest to analogiczne do foldl w funkcjonalnych językach programowania . Na przykład:

           #(  1  3  5  )  wstrzyknij:  10  do:  [  :  suma  :  element  |  suma  +  element  ]  "=> 19" 

W pierwszym przebiegu blok otrzymuje 10 (argument do wstrzyknięcia) jako sumę i 1 (pierwszy element tablicy) jako element. To zwraca 11. Następnie 11 staje się sumą w następnym przebiegu, która jest dodawana do 3 do get 14. 14 jest następnie dodawane do 5, aby ostatecznie zwrócić 19.

Bloki współpracują z wieloma wbudowanymi metodami:

   
              
          ( Nazwa   pliku  :  'file.txt'  )  withWriteStreamDo:  [  :  plik  |  file  nextPutAll:  'Napisał trochę tekstu.'  ;  nl  ]  "Tutaj plik jest automatycznie zamykany"  ( Nazwa   pliku  :  'file.txt'  )  linieDo:  [  :  każdy  |  each  displayNl  ]  "=> Napisałem trochę tekstu." 

Używając wyliczenia i bloku do kwadratu liczb od 1 do 10:

      (  1  do:  10  )  zbierz:  [  :  x  |  x  kwadrat  ]  "=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]" 

Klasy

Poniższy kod definiuje klasę o nazwie Person. Wywodząc się z Magnitude, automatycznie definiuje wszystkie metody porównania z wyjątkiem jednej ( < ). Po dodaniu tego asSortedCollection może sortować według wieku. Zauważ, że możemy nadpisać sposób, w jaki obiekt jest drukowany/wyświetlany (domyślnie współdzielimy reprezentację wydruku programisty i użytkownika) przez nadpisanie printOn: .

  
                      wielkości  :  Osoba  [  |  imię wiek  |  Klasa  osoby  >>  imię:  imię  wiek:  wiek  [  ^  self  nowe  imię:  imię  ;  wiek:  wiek  ;  siebie  ]  <  aOsoba  [  ^  własny  wiek  <  aOsoba  wiek  ]  imię  [  ^  imię  ]                 nazwa:  wartość  [  nazwa  :=  wartość  ]  wiek  [  ^  wiek  ]  wiek:  wartość  [  wiek  :=  wartość  ]  printOn:  aStream  [  aStream  nextPutAll:  (  '%1 (%2)'  %  {  name  .  wiek  }) ] ]  grupa  : =  { Imię i nazwisko   osoby  :  „Dan”  wiek:  23  . 
            
               osoby  :  „Marek”  wiek:  63 lata   . Imię i nazwisko   osoby  :  „Cod”  wiek:  16 lat   .  }.  grupuj  jakoSortedCollection  w odwrotnej kolejności 

Powyższe drukuje trzy nazwiska w odwrotnej kolejności wiekowej:

OrderedCollection (Marek (63) Dan (23) Dorsz (16) )

Wyjątki

Wyjątek jest zgłaszany z wywołaniem zatrzymania :

  samozatrzymanie  _ 

Do wyjątku można dodać opcjonalną wiadomość; jest też błąd: który wywołuje inny rodzaj wyjątku:

  
   samozatrzymanie  :  „To jest wiadomość”  błąd  własny :   „To jest wiadomość” 

W rzeczywistości są to opakowania dla rzeczywistej metody zgłaszania wyjątków, signal :

 
   Sygnał  błędu  Sygnał błędu  :  „Niedozwolone argumenty!” 

Wyjątki są obsługiwane przez bloki on:do:.

   
          [  coś  do  zrobienia  ]  na:  Wyjątek  zrób:  [  :  ex  |  obsłuż  wyjątek  w  ex  ] 

Oczywiście możesz złapać tylko określone wyjątki (i ich podklasy):

   
          [  coś  do  zrobienia  ]  na:  Ostrzeżenie  zrób:  [  :  ex  |  obsłuż  wyjątek  w  ex  ] 

Możliwe jest użycie obiektu wyjątku, który jest udostępniany klauzuli obsługi, do wyjścia lub wznowienia pierwszego bloku; exiting jest ustawieniem domyślnym, ale można je również wyraźnie wymienić:

   
                                          [ Sygnał   błędu  :  'foo'  ]  on:  Błąd  do:  [  :  ex  |  ex  return:  5  ] ( Sygnał   ostrzegawczy  :  'co teraz?'  )  printNl  "=> nil"  [ (  Sygnał ostrzegawczy  :  'co teraz?'  )  printNl  ]  on:  Ostrzeżenie  do:  [  :  ex  |  z  CV:  5  ]  "=> 5" 

Zobacz też

Linki zewnętrzne