Bahasa pemrograman berbasis kartu pos

gambar
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


 "A ""complete"" Pharo syntax" 

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 " = (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 ]. "  x,y -> x+y " sum value: 10 value: 25. "  ,  - 35" 

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 " = 2r100 " 

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 point
  • 3.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 .

Source: https://habr.com/ru/post/id446578/


All Articles