Seppo Mustonen: Sukrojen ohjelmointi Survossa

6. Sukrojen aloittaminen ja kytkeminen toisiinsa

Sukrojen käynnistämiseen on useita mahdollisuuksia tilanteesta riippuen. Sukrot voivat myös kutsua toisia sukroja joko aliohjelminaan tai jatkamaan työtä eteenpäin. Turhan laajoja sukroja on syytä välttää; on parempi tehdät suuremmat sovellukset pienistä paloista, jotka käytön aikana kytkeytyvät automaattisesti toisiinsa.

Tavallisin keino sukron aloittamiseen on antaa kauttaviivalla varustettu komento, johon saattaa liittyä joukko parametreja. Parametrit sijoittuvat sukromuistiin aikaisemmin kuvatulla tavalla.

Esim. sukrokomennolla

    /TRIMP 24,END,55,Times(11)
taitetaan teksti rivistä 24 lähtien 55 pican leveyttä vastaavaksi olettaen, että tulostus tulee tapahtumaan 11 pisteen Times-kirjasinlajilla. TRIMP on Survon sukrokirjastoon kuuluva työkalu, joka löytyy Survon S-hakemistosta (tavallisesti C:\E\S).

Sukron nimen eteen saa liittää tarvittaessa täydellisen polkutunnuksen eli edellisen komennon voisi kirjoittaa myös muodossa

    /C:\E\S\TRIMP 24,END,55,Times(11) .

Ellei sukrokomennossa ole täydellistä polkunimeä, sukroa etsitään järjestyksessä seuraavista hakemistoista: (oletetaan tässä, että Survo on asennettu hakemistoon C:\E)

  1. Tämänhetkinen Survon datahakemisto (näkyy kentän ylärivillä)
  2. Käyttäjän oma sukropolku annettuna muodossa sucropath=<polku> systeemitiedostossa SURVO.APU (esim. sucropath=D:\SUCROS\ )
  3. C:\E\W\S\ (SURVO 98)
  4. C:\E\W\TUT\ (SURVO 98)
  5. C:\E\S\ (vakiotyökalut)
  6. C:\E\TUT\ (englanninkieliset opetusohjelmat)

Jos sukroa ei löydy mistään näistä hakemistoista, Survo tiedottaa siitä virheilmoituksella "Sucro <nimi> not found!".
     Edellä mainittu hakemistojen suosituimmuusjärjestys takaa sen, että polkunimi on hyvin harvoin tarpeen.
     Sovelluskohtaiset sukrot kannattaa sijoittaa sovelluksen omaan hakemistoon. Käyttäjäkohtaisille, useissa tilanteissa tarvittaville sukroille oikea paikka on sucropath-polku, jossa kannattaa pitää myös käyttäjän mahdollisia omia versioita vakiotyökaluista.

Sukron aloituskomennon parametrit syrjäyttävät sukromuistin sisällön. Näin tapahtuu silloinkin, kun parametreja ei anneta; sukromuistin sisällöksi tulee W1=(empty) . Aikaisempi muistin sisältö kuitenkin säilyy, jos ainoana parametrina on merkki @ .
     Sukron saa käynnistetyksi myös näppäinyhdistelmällä PREFIX T , jolloin alariville tulevassa kysymyksessä

   Sucro functions: S=Start definition, R=Run ? _
valitaan vaihtoehto R . Tällöin kysymys korvautuu nimeä koskevalla uudella kysymyksellä
   Run a sucro: Name of file ? _
Kun nimi annetaan, valittu sukro aloittaa toimintansa. Sukromuistin sisältöön tämä aloitustapa ei vaikuta ja siitä onkin hyötyä esim. testaustilanteissa, joissa olemassa olevaa sukroa jatketaan uudella tekeillä olevalla.
     Vastaava sukron käynnistys saattaa tapahtua suoraan toisesta sukrosta käskyllä {load <sukron_nimi>}. Tässäkin sukromuistin sisältö säilyy ja uusi sukro jatkaa täsmälleen samasta tilanteesta, mihin edellisellä päästiin. Tällä tavalla suuret tehtäväkokonaisuudet kannattaa jakaa pienempiin osiin.
     Seuraava, hieman erikoinen esimerkki kuvaa sukrojen kytkentää toisiinsa load-käskyjen avulla:
   4  1 SURVO 84C EDITOR Thu May 02 18:41:17 1991         D:\SUOPAS\ 120  80 0
   1 *
   2 *TUTSAVE AA
   3 * aa{load BB}{end}
   4 *
   5 *TUTSAVE BB
   6 * bb{load AA}{end}
   7 *
   8 */AA_
   9 *
  10 *

Tässä sukro AA kirjoittaa tekstin " aa" ja pyytää sukroa BB jatkamaan, joka vuorostaan kirjoittaa tekstin " bb" ja pyytää sukroa AA uudelleen jatkaamaan jne.
     Kun siis sukro AA aktivoidaan riviltä 8, saadaan tulostusta:
   4  1 SURVO 84C EDITOR Thu May 02 18:44:32 1991         D:\SUOPAS\ 120  80 0
   1 *
   2 *TUTSAVE AA
   3 * aa{load BB}{end}
   4 *
   5 *TUTSAVE BB
   6 * bb{load AA}{end}
   7 *
   8 */AA aa bb aa bb aa bb aa bb aa bb aa bb aa bb aa bb aa bb aa bb aa bb
   9 *aa bb aa bb aa bb aa bb aa bb aa bb aa bb aa bb aa_
  10 *

Sukrojen AA ja BB toiminnan vuorottelu jatkuisi ikuisesti, ellei toimintaa keskeytetä napilla . (piste).

Kun sukro ketjutetaan toiseen load-käskyillä, alkuperäiseen sukroon ei enää palata, ellei jokin myöhempi sukro kutsu sitä uudelleen, kuten tapahtui edellisessä esimerkissä.
     Tilanne muuttuu, jos sukro kutsuu toista sukroa muotoa

    {call <sukron_nimi>}
olevalla käskyllä tai aktivoimalla käyttäjän tapaan kenttään kirjoitetun sukron kutsukomennon. Tällöin kutsuttu sukro toimii aliohjelman kaltaisesti; kun se lopettaa toimintansa, kutsuva sukro jatkaa toimintaa edelleen.
     Havainnollistamme tätä tilannetta toisella kaaviollisella (mutta kyllä käytännössä toimivalla) näytteellä:
  18  1 SURVO 84C EDITOR Sat May 04 11:34:37 1991         C:\SUOPAS\ 120  80 0
  12 *
  13 *TUTSAVE CC
  14 *{R}
  15 *Sukro CC alkaa...{call DD}{R}
  16 *Sukro CC lopetti.{end}
  17 *
  18 *TUTSAVE DD
  19 *{R}
  20 *Sukro DD alkaa...{call EE}{R}
  21 *Sukro DD lopetti.{end}
  22 *
  23 *TUTSAVE EE
  24 *{R}
  25 *Sukro EE toimii...{end}
  26 *
  27 */CC
  28 *Sukro CC alkaa...
  29 *Sukro DD alkaa...
  30 *Sukro EE toimii...
  31 *Sukro DD lopetti.
  32 *Sukro CC lopetti._
  33 *

Kyseessä on kolme sukroa CC, DD ja EE, joiden listaukset ovat riveillä 13-25. Kun CC aktivoidaan (rivillä 27), se kutsuu aloituksen jälkeen sukroa DD, joka vuorostaan oman aloituksen jälkeen kutsuu sukroa EE. Kun EE lopettaa, DD jatkaa toimintaansa ja lopettaa, jolloin taas CC jatkaa toimintaansa ja lopettaa.
     Tähän tapaan sisäkkäisiä sukrojen kutsuja sallitaan samanaikaisesti viisi, mikä riittää kaikkiin järkeviin sovelluksiin. Jos sisäkkäisten sukrojen määrä ylittyy viidestä, toiminta keskeytyy virheilmoitukseen "Too many nested sucros!". Mikäli tuntuu siltä, että jossain tilanteessa pitäisi saada sukroja enemmän sisäkkäin, sovellusta ei liene suunniteltu mielekkäästi.
     Esim. Survon suomenkielisessä opetussarjassa, jossa valikkoja esiintyy sisäkkäin jopa viidessä polvessa, asioita ei ole kytketty sisäkkäin call-käskyillä vaan peräkkäin load-käskyillä, jolloin yleensä pysytään sukrojen tasolla 1 (tasonumerohan näkyy vasemmassa yläkulmassa). Se, että opetusohjelmien valikot ovat käyttäjän näkökulmasta sisäkkäin, on hoidettu sukromuistin ensimmäisen paikan välityksellä. Sen sisältö kertoo, mikä on kulloinkin luonnollinen (oletusarvoinen) jatko. Joidenkin opetusohjelmien sisällä käytetään toisia sukroja aliohjelmina mutta vain sisäkkäiseen syvyyteen 3 asti.

Sukrojen ohjelmointi Survossa - Seppo Mustonen 1991
  1. Johdanto
  2. Esimerkki
  3. Sukrokielen koodisanoja
  4. Sukromuisti
  5. Hapuilukoodit, tulostus ja kohdistimen liikuttelu
  6. Sukrojen aloittaminen ja kytkeminen toisiinsa
  7. Ehdolliset toiminnat
  8. Käyttäjän vuorovaikutus
  9. Aritmetiikka ja muistin välitön hallinta
  10. Sukrotiedostot
  11. Sukrojen lajit
  12. Sukrojen laatiminen käytännössä
  13. Virhetilanteet
  14. Näytesovelluksia
Liite: Sukrokielen koodisanat