Aloitin hiljattain tutustumiseni .NET maailmaan, kun löysin Zonnon ohjelmointikielen. Täytyy sanoa, että jollakin oudolla tavalla pidän tästä ohjelmointikielestä.
Syntaksiltaan se on hyvin paljon Modula-2:n kaltainen. Säikeisiin se käyttää active object pohjaista toteutusta, josta se käyttää nimitystä activity. Nämä aktiviteetit voivat kommunikoida keskenään käyttäen ennalta määriteltyä protokollaa.
Jos on tekemisen puutetta, niin tutustukaa: http://www.zonnon.ethz.ch/
Alla esimerkkinä syntaksista simppeli Windows Forms esimerkki:
module Main; import System, System.Windows.Forms as Forms, System.Drawing.Point as Point; type {public, ref} MainForm = object implements Forms.Form var {public} button : Forms.Button; label : Forms.Label; activity Hello; begin System.Threading.Thread.Sleep(integer(5000)); label.Text := "Hello from activity!"; end Hello; procedure {public} onClick(sender: object; args: System.EventArgs); begin Forms.MessageBox.Show("Ouch!", "Test"); end onClick; begin Text := "Zonnon test application"; Width := 640; Height := 480; label := new Forms.Label; label.Text := "Hello world!"; label.Location := new Point(200, 200); Controls.Add(label); button := new Forms.Button; button.Text := "Hit Me!"; button.Dock := Forms.DockStyle.Bottom; button.add_Click(onClick); Controls.Add(button); CenterToScreen; end MainForm; var mainForm: MainForm; begin mainForm := new MainForm; new mainForm.Hello; Forms.Application.Run(mainForm); end Main.
Täytyy sanoa, että olet sisentänyt ja välittänyt koodin melko epäselvästi. Erityisesti MainForm-tyypin raja on vaikea bongata, tai siis tuosta ei pikaisella silmäyksellä ei hahmota, mitkä asiat kuuluvat kyseiseen tyyppiin. Mielestäni olisi paljon parempi sisentää koko sisältö.
module Main; import System, System.Windows.Forms as Forms, System.Drawing.Point as Point; type {public, ref} MainForm = object implements Forms.Form var {public} button: Forms.Button; label: Forms.Label; activity Hello; begin System.Threading.Thread.Sleep(integer(5000)); label.Text := "Hello from activity!"; end Hello; procedure {public} onClick(sender: object; args: System.EventArgs); begin Forms.MessageBox.Show("Ouch!", "Test"); end onClick; begin ... CenterToScreen; end MainForm; var mainForm: MainForm; begin mainForm := new MainForm; new mainForm.Hello; Forms.Application.Run(mainForm); end Main.
Itse kieli ei erityisemmin vakuuta: Mihin tarvitaan taas syntaksiltaan hieman muista poikkeava kieli sen sijaan, että vain laajennettaisiin aiempia uusilla ominaisuuksilla (activity)? Tässäkin on yksittäisiä pieniä eroja, joista ei nähdäkseni ole mitään etua esimerkiksi siihen, miten Pascalissa on asia hoidettu.
Mielestäni juuri tuo end sanan jälkeinen nimen toistaminen tekee siitä helpon hahmottaa ilman ylimääräisiä sisennyksiä.
Pascaliin verrattuna koko moduulin (module) konsepti on uusi ja pohjautuu Modula-2:sta. Kielestä löytyy tuki säikeille ohjelmointikielitasolla (active object = activity). String tyyppi merkkijonoille ja varmasti lisäksi suuri joukko eroja ja uudistuksia Pascaliin verrattuna.
Suosittelen tarkempaa perehtymistä (nykyaikaiseen) Pascaliin: String-tyyppi siinä on ollut iät ja ajat, ja moduulit (unit
) haetaan käyttöön uses
-lauseella. Jos katsotaan jotain yleisesti käytettyä Object Pascalin murretta, niin tuskinpa tuossa olioiden puoleltakaan kummoisia ihmeitä löytyy.
Nimen toistaminen ei ole riittävä väline helppoon hahmottamiseen. Jos koodia on satoja rivejä, kumman huomaa helpommin: sisennyksen loppumisen vai yksittäisen MainForm-sanan? Jos yhä pidät perustelustasi kiinni, niin vilkaistaanpa Basicia, jossa näppärästi näkee kunkin rakenteen lopusta, mikä rakenne on kyseessä. Koodaisitko mielelläsi ensimmäisellä seuraavista tyyleistä?
Sub Aliohjelma() If a Then Teko(x) While b Do Juttu(y) End While End If If d Then Muuta(w) End If End Sub
Sub Aliohjelma() If a Then Teko(x) While b Do Juttu(y) End While End If If d Then Muuta(w) End If End Sub
Jokseenkin kaikilla kielillä voi koodata tuolla haluamallasi tavalla kommenttien avulla, eli rakenteen loppuessa toistetaan se nimi. Esimerkiksi c/c++/java:
int foo() { return 2; } // end foo
Metabolix: Totta kai sisennys helpottaa lukemista. Basic esimerkkisi oli aika kärjistetty, kokonaan ilman sisennyksiä.
Oma esimerkkini oli muuten sisennetty, mutta MainForm -tyypin jäsenenille olisi voinut lisätä aloituskohdaksi yhden tabulaarin. Yllä olevassa viestissä tarkoitin, että tässä en nähnyt sitä tarpeelliseksi: tuohon esimerkki moduliinhan on käytännössä toteutettu vain yksi luokka MainForm, johon on määritelty yksi activity ja metodi.
Oma tapani ohjelmoida Zonnonilla on jakaa ohjelma moduuleihin ja toteuttaa moduulissa aina yksi luokka tai muu kokonaisuus.
Olet oikeassa, että en ole tutustunut nykyaikaiseen Pascaliin. Omat kokemukseni Pascalista ovat peruskoulun ala-asteelta. Silloin ainakin Pascalin unit toimi aika eri tavalla, kuin Zonnonin module. Zonnonin module toimii itseasiassa aika samalla tavalla, kuin Infernon Limbon module.
Aihe on jo aika vanha, joten et voi enää vastata siihen.