GNU Smalltalk - GNU Smalltalk

GNU Smalltalk
GNU Smalltalk logo.svg
Orijinal yazar (lar)Steve Byrne, Paolo Bonzini
İlk sürüm12 Ocak 2003; 17 yıl önce (2003-01-12)
Kararlı sürüm
3.2.5 / 11 Nisan 2013; 7 yıl önce (2013-04-11)
Depo Bunu Vikiveri'de düzenleyin
İşletim sistemiUnix (Linux, Cygwin, Mac OS X / Darwin )
TürProgramlama dili
LisansGPL + LGPL
İnternet sitesihttps://www.gnu.org/software/smalltalk/

GNU Smalltalk bir uygulamasıdır Smalltalk Programlama dili tarafından GNU Projesi.

Uygulama, diğer Smalltalk ortamlarının aksine, program girişi için metin dosyalarını kullanır ve içeriği Smalltalk kodu olarak yorumlar. Bu şekilde GNU Smalltalk, geleneksel Smalltalk tarzındaki bir ortamdan çok bir yorumlayıcı gibi davranır.

GNU Smalltalk şunları içerir: bağlamalar dahil birçok ücretsiz yazılım kitaplığı için SQLite, libSDL, Kahire, gettext, ve Gurbetçi.

Örnekler

Bu örnekler yalnızca GNU Smalltalk 3.0 ve sonraki sürümlerde çalışır. Klasik Selam Dünya misal:

'Selam Dünya!' displayNl

Bazı temel Smalltalk kodları:

"Birebir de dahil olmak üzere her şey bir nesnedir, dolayısıyla bu işe yarar:"-199 abs                                                "199"'gst dır-dir güzel' boyut                                      "11"'Kaygan' indeksi: $ c                                     "4"'Güzel Gün Isn''t O?' asLowercase varlık asSortedCollection asString  "′? Acdeinsty"

Koleksiyonlar

Oluşturmak ve kullanmak dizi:

a := #(1 'Selam' 3.14 1 2 (4 5))a şurada: 3        "3.14"a tersine çevirmek      "((4 5) 2 1 3.14 'merhaba' 1)"a varlık        "(1 'hi' 3.14 2 (4 5)) olarak ayarlayın"

Bir oluşturmak ve kullanmak karma:

karma := Sözlük from: { 'Su' -> 'ıslak'. 'ateş' -> 'Sıcak' }.karma şurada: 'ateş'     "Baskılar: sıcak"karma keysAndValuesDo: [ :k :v |        ('% 1,% 2' % { k. v }) displayNl ]"Baskılar: su ıslak          ateş sıcaktır"karma removeKey: 'Su'  "'Su' -> 'ıslak''ı siler"

Bloklar ve yineleyiciler

Bir bloğun bir kapatma:

"bir bloğu hatırla."hatırlamak := [ :isim | ("Merhaba% 1!" % { isim }) displayNl ]."Doğru zaman geldiğinde - kapatmayı çağırın!"hatırlamak değer: "dünya""=> 'Merhaba, dünya!'"

Bir yöntemden kapanış döndürme:

 Tamsayı uzatmak [     asClosure [         | değer |         değer := kendini.         ^{ [ :x | değer := x ]. [ değer ] }     ] ]  bloklar := 10 asClosure. ayarlayıcı := bloklar ilk. alıcı := bloklar ikinci. alıcı değer        "=> 10" ayarlayıcı değer: 21    "=> 21" alıcı değer        "=> 21"

Arayana bilgi göndermek için blok kullanma:

 Tamsayı uzatmak [     Öyle bile olsa: EvenBlock ifOdd: OddBlock [         ^kendini hatta             Eğer doğruysa: [ EvenBlock değer: kendini ]             ifFalse: [ OddBlock değer: kendini ]     ] ]

Bir blok geçirerek yukarıdaki yöntemi çağırın:

10 Öyle bile olsa: [ :n | n / 2 ] ifOdd: [ :n | n * 3 + 1 ]    "=> 5"

Blokları kullanarak numaralandırmalar ve diziler üzerinde yineleme:

dizi := #(1 'Selam' 3.14)dizi yapmak: [ :eşya | eşya displayNl ]"=> 1""=> merhaba""=> 3.14"(3 to: 6) yapmak: [ :eşya | eşya displayNl ]"=> 3""=> 4""=> 5""=> 6"

Gibi bir yöntem enjekte: içine: hem bir parametre hem de bir blok kabul edebilir. Bir listenin her bir üyesi üzerinde yinelenir ve bir toplamı korurken bazı işlevler gerçekleştirir. Bu, katlanmak işlev fonksiyonel programlama dilleri. Örneğin:

#(1 3 5) enjekte: 10 içine: [ :toplam :element | toplam + element ] "=> 19"

İlk geçişte, blok toplam olarak 10 (enjekte edilecek bağımsız değişken) ve eleman olarak 1 (dizinin ilk elemanı) alır, Bu, 11 11 değerini döndürür ve sonraki geçişte toplam 3'e eklenir. 14 olsun sonra 5'e 14 eklenir, sonunda 19 döndürülür.

Bloklar birçok yerleşik yöntemle çalışır:

(Dosya isim: 'dosya.txt') withWriteStreamDo: [ :dosya |        dosya nextPutAll: Bir metin yazdı.; nl ]"Dosya burada otomatik olarak kapatılır"(Dosya isim: 'dosya.txt') linesDo: [ :her biri |        her biri displayNl ]"=> Bir metin yazdı."

1'den 10'a kadar olan sayıların karesini almak için bir numaralandırma ve bir blok kullanma:

(1 to: 10) toplamak: [ :x | x kare ] "=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"

Sınıflar

Aşağıdaki kod, Person adlı bir sınıfı tanımlar. Magnitude'dan türetilerek, biri hariç tüm karşılaştırma yöntemlerini otomatik olarak tanımlar (<). Bunun eklenmesiyle, asSortedCollection yaşa göre sıralayabilir. Nesnenin yazdırılma / görüntülenme şeklini geçersiz kılabileceğimizi unutmayın (varsayılan, programcı-baskı ve kullanıcı-ekran gösterimini paylaşmaktır) printOn:.

Büyüklük alt sınıf: Kişi [    | isim yaş |    Kişi sınıf >> isim: isim yaş: yaş [        ^kendini yeni isim: isim; yaş: yaş; kendin   ]    < Bir kişi [ ^kendini yaş < Bir kişi yaş ]    isim [ ^isim ]    isim: değer [ isim := değer ]    yaş [ ^yaş ]    yaş: değer [ yaş := değer ]    printOn: bir akıntı [ bir akıntı nextPutAll: ('%1 (%2)' % { isim. yaş }) ]]grup := {        Kişi isim: 'Dan' yaş: 23.        Kişi isim: 'İşaret' yaş: 63.        Kişi isim: 'Morina' yaş: 16.}.grup asSortedCollection tersine çevirmek

Yukarıdakiler, üç adı ters yaş sırasına göre yazdırır:

Sipariş EdilmişKoleksiyon (Mark (63) Dan (23) Cod (16))

İstisnalar

İle bir istisna ortaya çıkar durmak telefon etmek:

kendini durmak

İstisnaya isteğe bağlı bir mesaj eklenebilir; ayrıca var hata: bu, farklı bir tür istisna yaratır:

kendini durma: 'Bu bir mesajdır'kendini hata: 'Bu bir mesajdır'

Bunlar aslında istisnai durum oluşturma yöntemi için sarmalayıcılardır. sinyal:

Hata sinyalHata sinyal: "Yasadışı argümanlar!"

İstisnalar tarafından ele alınır on: do: bloklar.

[ bir şey -e yapmak ]    üzerinde: İstisna    yapmak: [ :eski | üstesinden gelmek istisna içinde eski ]

Elbette yalnızca belirli istisnaları (ve alt sınıflarını) yakalayabilirsiniz:

[ bir şey -e yapmak ]    üzerinde: Uyarı    yapmak: [ :eski | üstesinden gelmek istisna içinde eski ]

İlk bloktan çıkmak veya devam ettirmek için eylemci cümlesine sunulan istisna nesnesini kullanmak mümkündür; çıkış varsayılandır, ancak açıkça belirtilebilir:

[ Hata sinyal: 'foo' ]    üzerinde: Hata    yapmak: [ :eski | eski dönüş: 5 ](Uyarı sinyal: 'şimdi ne olacak?') printNl                       "=> sıfır"[ (Uyarı sinyal: 'şimdi ne olacak?')        printNl ] üzerinde: Uyarı yapmak: [ :eski | eski devam et: 5 ]    "=> 5"

Ayrıca bakınız

Dış bağlantılar