GNU Smalltalk
Oryginalni autorzy | Steve Byrne, Paolo Bonzini |
---|---|
Pierwsze wydanie | 12 stycznia 2003 |
Wersja stabilna |
3.2.5 / 8 kwietnia 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"