GNU Smalltalk - GNU Smalltalk
![]() | Tento článek obsahuje a seznam doporučení, související čtení nebo externí odkazy, ale jeho zdroje zůstávají nejasné, protože mu chybí vložené citace.červen 2013) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
![]() | |
Původní autoři | Steve Byrne, Paolo Bonzini |
---|---|
První vydání | 12. ledna 2003 |
Stabilní uvolnění | 3.2.5 / 11. dubna 2013 |
Úložiště | ![]() |
Operační systém | Unix (Linux, Cygwin, Mac OS X / Darwin ) |
Typ | Programovací jazyk |
Licence | GPL + LGPL |
webová stránka | https://www.gnu.org/software/smalltalk/ |
GNU Smalltalk je implementace Pokec programovací jazyk podle Projekt GNU.
Implementace, na rozdíl od jiných prostředí Smalltalk, používá pro vstup programu textové soubory a interpretuje obsah jako kód Smalltalk. Tímto způsobem se GNU Smalltalk chová spíše jako tlumočník než jako prostředí tradičním způsobem Smalltalk.
GNU Smalltalk obsahuje vazby pro mnoho bezplatných softwarových knihoven včetně SQLite, libSDL, cairo, gettext, a Expat.
Příklady
Tyto příklady fungují pouze na GNU Smalltalk 3.0 a novějších verzích. Klasický Ahoj světe příklad:
'Ahoj světe!' displayNl
Některé základní kódy Smalltalk:
„Všechno, včetně literálu, je objekt, takže toto funguje:“-199 břišní svaly "199"'gst je chladný' velikost "11"'Úhledný' indexOf: $ c "4"'Pěkný Den Isn''t To?' jako spodní kufr aktivum asSortedCollection jako řetězec „′? Acdeinsty“
Sbírky
Konstrukce a používání pole:
A := #(1 'Ahoj' 3.14 1 2 (4 5))A na: 3 "3.14"A zvrátit „((4 5) 2 1 3,14 'ahoj' 1)"A aktivum "Set (1 'ahoj' 3,14 2 (4 5))"
Konstrukce a používání a hash:
hash := Slovník z: { 'voda' -> 'mokrý'. 'oheň' -> 'horký' }.hash na: 'oheň' "Výtisky: horké"hash keysAndValuesDo: [ :k :proti | ('% 1 je% 2' % { k. proti }) displayNl ]„Tiskne: voda je mokrá oheň je horký “hash removeKey: 'voda' „Odstraní„ vodu “->„ mokré ““
Bloky a iterátory
Předávání parametrů bloku za a uzavření:
„zapamatuj si blok.“Pamatuj si := [ :název | („Dobrý den,% 1!“ % { název }) displayNl ].„Když je správný čas - zavolej uzávěrku!“Pamatuj si hodnota: 'svět'"=> 'Ahoj, svět!'"
Vrácení uzávěrů z metody:
Celé číslo rozšířit [ jako Příloha [ | hodnota | hodnota := já. ^{ [ :X | hodnota := X ]. [ hodnota ] } ] ] bloky := 10 jako Příloha. seřizovač := bloky za prvé. kariérista := bloky druhý. kariérista hodnota "=> 10" seřizovač hodnota: 21 "=> 21" kariérista hodnota "=> 21"
Odeslání informací zpět volajícímu pomocí bloku:
Celé číslo rozšířit [ ifEven: evenBlock ifOdd: oddBlock [ ^já dokonce ifTrue: [ evenBlock hodnota: já ] ifFalse: [ oddBlock hodnota: já ] ] ]
Vyvolejte výše uvedenou metodu a předejte jí blok:
10 ifEven: [ :n | n / 2 ] ifOdd: [ :n | n * 3 + 1 ] "=> 5"
Iterace nad výčty a poli pomocí bloků:
pole := #(1 'Ahoj' 3.14)pole dělat: [ :položka | položka displayNl ]"=> 1""=> ahoj""=> 3.14"(3 na: 6) dělat: [ :položka | položka displayNl ]"=> 3""=> 4""=> 5""=> 6"
Metoda, jako je vstříknout: do: může přijmout parametr i blok. Iteruje každého člena seznamu a provádí nějakou funkci při zachování agregátu. To je analogické s složit funkce v funkční programovací jazyky. Například:
#(1 3 5) vstříknout: 10 do: [ :součet :živel | součet + živel ] "=> 19"
Při prvním průchodu blok přijme 10 (argument pro vložení) jako součet a 1 (první prvek pole) jako prvek, toto vrátí 11. 11 se poté stane součtem při dalším průchodu, který se přidá k 3 k dostat 14. 14 se pak přidá k 5, aby se konečně vrátilo 19.
Bloky fungují s mnoha vestavěnými metodami:
(Soubor název: 'file.txt') withWriteStreamDo: [ :soubor | soubor nextPutAll: "Napsal nějaký text."; nl ]„Soubor se zde automaticky uzavře“(Soubor název: 'file.txt') linesDo: [ :každý | každý displayNl ]"=> Napsal nějaký text."
Pomocí výčtu a bloku k umocnění čísel 1 až 10:
(1 na: 10) sbírat: [ :X | X na druhou ] "=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"
Třídy
Následující kód definuje třídu s názvem Person. Odvozením od Magnitude automaticky definuje všechny metody porovnání kromě jedné (<
). S přidáním tohoto, asSortedCollection
lze třídit podle věku. Všimněte si, že můžeme přepsat způsob, jakým je objekt vytištěn / zobrazen (výchozí je sdílení reprezentace programátorského tisku a uživatelského zobrazení) přepsáním printOn:
.
Velikost podtřída: Osoba [ | jméno věk | Osoba třída >> název: název stáří: stáří [ ^já Nový název: název; stáří: stáří; vy sám ] < osoba [ ^já stáří < osoba stáří ] název [ ^název ] název: hodnota [ název := hodnota ] stáří [ ^stáří ] stáří: hodnota [ stáří := hodnota ] printOn: proud [ proud nextPutAll: ('%1 (%2)' % { název. stáří }) ]]skupina := { Osoba název: 'Dan' stáří: 23. Osoba název: 'Označit' stáří: 63. Osoba název: 'Treska' stáří: 16.}.skupina asSortedCollection zvrátit
Výše uvedené vytiskne tři jména v opačném pořadí podle věku:
OrderedCollection (Mark (63) Dan (23) Cod (16))
Výjimky
Výjimka je vyvolána pomocí Stůj
volání:
já Stůj
K výjimce lze přidat volitelnou zprávu; tam je také chyba:
což vyvolává jiný druh výjimky:
já Stůj: „Toto je zpráva“já chyba: „Toto je zpráva“
Jedná se vlastně o obaly pro vlastní metodu zvyšování výjimek, signál
:
Chyba signálChyba signál: "Neoprávněné argumenty!"
Výjimky zpracovává on: do:
bloky.
[ něco na dělat ] na: Výjimka dělat: [ :např | Rukojeť výjimka v např ]
Samozřejmě můžete zachytit pouze určité výjimky (a jejich podtřídy):
[ něco na dělat ] na: Varování dělat: [ :např | Rukojeť výjimka v např ]
Je možné použít objekt výjimky, který je zpřístupněn klauzuli obslužné rutiny, k ukončení nebo obnovení prvního bloku; ukončení je výchozí, ale může být také výslovně uvedeno:
[ Chyba signál: 'foo' ] na: Chyba dělat: [ :např | např vrátit se: 5 ](Varování signál: 'co teď?') printNl "=> nula"[ (Varování signál: 'co teď?') printNl ] na: Varování dělat: [ :např | např životopis: 5 ] "=> 5"