
Sumber
Ralph Johnson, salah satu anggota The Gang of Four, pernah menunjukkan bagaimana sintaksis bahasa Smalltalk-80 dapat ditampung di kartu pos. Sekarang, hampir 30 tahun setelah Smalltalk versi pertama, dialek Smalltalk yang paling cepat berkembang adalah Pharo, yang akan kita lihat nanti.
Deklarasi Metode
exampleWithNumber: x
Metode dinyatakan sebagai :
dan anggota kelas. Metode dengan banyak parameter dinyatakan seperti ini
rangeFrom: start to: end
Nama metode adalah rangeFrom:to:
dan nama parameternya adalah start
dan end
.
Deklarasi pragma
<syntaxOn: #postcard>
Pragma digunakan untuk membubuhi keterangan metode. Anotasi ini dapat digunakan oleh kompiler atau metode lain sebagai metadata.
Komentar
Komentar ditunjukkan oleh tanda kutip. Tanda kutip di dalam komentar ditandai dengan tanda kutip ganda.
Mendeklarasikan variabel lokal
| y |
Variabel lokal digunakan dalam perhitungan di dalam metode. Deklarasi tipe variabel tidak diperlukan karena Smalltalk adalah bahasa yang diketik secara dinamis.
Beberapa variabel dideklarasikan dalam satu daftar.
| yx totalSum |
Objek dan Pesan
true & false not & (nil isNil)
Segala sesuatu di Smalltalk adalah objek, dan objek dapat menerima pesan. Perintah pelaksanaan (yaitu, mengirim pesan) dari kiri ke kanan, tetapi pesan tanpa parameter dikirim terutama sesuai dengan aturan prioritas, sehingga urutan perhitungan di sini akan menjadi
(true & (false not)) & (nil isNil)
Hanya ada empat aturan prioritas di Smalltalk: pesan pertama dikirim dalam tanda kurung, kemudian unary (tanpa parameter tambahan selain objek penerima itu sendiri, misalnya false not
), lalu biner (dengan satu parameter tambahan, misalnya 1 + 2
), lalu pesan dengan beberapa parameter (mis. 15 between: 1 and: 2
). Prioritas eksekusi ditunjukkan oleh skema sederhana.
tanda kurung > unary > binary > pesan dengan beberapa parameter
Aturan-aturan ini juga berlaku untuk operasi matematika, jadi hasil dari ekspresi
1 + 15 / 4
akan menjadi 4
. Omong-omong, nil
juga merupakan objek dan dapat menerima dan menanggapi pesan.
Eksekusi Bersyarat dan Blok Kode
true & false not & (nil isNil) ifFalse: [ self perform: #add: with: x ].
Eksekusi bersyarat dilaksanakan dengan mengirim ifTrue
, pesan ifFalse
ke objek ifFalse
. Argumen pesan ini adalah blok kode, ditunjukkan oleh tanda kurung siku, yang dieksekusi jika kondisi yang ditentukan terpenuhi.
Blok Smalltalk juga digunakan sebagai fungsi anonim:
sum := [ :x :y | x+y ]. sum value: 10 value: 25.
Mengirim pesan ke diri sendiri
self perform: #add: with: x
Kata kunci self
digunakan sebagai referensi ke objek yang berisi metode saat mengirim pesan ke objek itu sendiri. Di sini kami mengirim perform: dengan: pesan dengan argumen #add
dan x
. Simbol #
menunjukkan string literal, yang digunakan di sini sebagai pengidentifikasi metode.
Tugas variabel
y := thisContext stack size + super size.
Menetapkan variabel ditunjukkan oleh operator :=
. Kata kunci super digunakan untuk merujuk ke objek superclass.
Semua objek Smalltalk mewarisi dari kelas Object
atau superclass mereka, yang, pada gilirannya, mewarisi dari superclass atau dari kelas Object
.
Array statis
byteArray := #[2 2r100 8r20 16rFF].
byteArray
adalah variabel instance kelas yang dideklarasikan saat kelas dideklarasikan. Array byteArray terdiri dari bilangan bulat yang ditulis dalam sistem angka yang berbeda dalam formulir
<>r<>
Ukuran array statis ditetapkan dan ditetapkan pada waktu kompilasi. Pengindeksan array dimulai pada 1
byteArray at: 2
Sejak awal, Smalltalk bukan hanya bahasa, tetapi juga lingkungan pengembangan terintegrasi dengan mesin virtualnya sendiri: Kelas dan metode Smalltalk tidak disimpan dalam file teks yang terpisah, tetapi segera disimpan dalam gambar mesin virtual dan dideklarasikan melalui antarmuka lingkungan pengembangan. Sebagai contoh, kelas Counter
dideklarasikan di bagian kelas sebagai
Object subclass: #Counter instanceVariableNames: 'count initialValue' classVariableNames: '' package: 'MyCounter'
dan metodenya dideklarasikan di bagian metode pada kelas Counter
.
Array dinamis
{ -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) }
Array dinamis dibuat saat runtime.
Array dapat berisi data dari tipe yang berbeda: elemen pertama array adalah angka -42, elemen kedua array adalah array dengan elemen tipe berbeda:
$a
- karakter "a"#a #'I''m'
- string literal "a" dan "I'm"'a'
- string "a"1.0 1.23e2
- angka floating point3.14s2
- pecahan desimal dengan skala 2
Siklus
{ -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } do: [ :each | | var | var := Transcript show: each class name; show: each printString ].
Loop di Smalltalk diimplementasikan dengan mengirimkan pesan ke array dengan blok yang akan dieksekusi pada setiap elemen array ini, yang sangat mirip dengan pendekatan fungsional. Pada setiap iterasi, elemen array dilewatkan sebagai argumen ke blok yang melakukan beberapa perhitungan di atasnya. Di blok dalam contoh, var variabel lokal dideklarasikan, yang ditugaskan hasil mengirim pesan acara terakhir ke objek Transcript
global.
Fitur menarik dari Smalltalk adalah kemampuan untuk membuat pesan: ekspresi
Transcript show: 'A'; show: 'B'.
secara berurutan menampilkan garis A
dan B
di jendela konsol Transcript
. Ini setara dengan kode
Transcript show: 'A'. Transcript show: 'B'.
tetapi menghindari pengulangan nama objek penerima pesan Transkrip. Hasil cascading adalah respons objek terhadap pesan terakhir.
Nilai pengembalian dari metode
^ x < y
Pengembalian ditandai dengan ^
. Dalam hal ini, nilai logis dikembalikan - hasil perbandingan x < y
.