Sukrot tukeutuvat Survon tiedonhallintaan ja ne voivat tallettaa
ja poimia tietoja kaikilla Survon tuntemilla keinoilla. Näin esim.
toimituskentät ja havainto- ym. Survon tiedostot toimivat tarvittaessa
sukrojen muisteina. Tietojen välittömään hallintaan esim. ehdollisissa
toiminnoissa sukroilla on lisäksi käytössä oma keskusmuistissa oleva
tila, jota sanomme sukromuistiksi. Tästä käytettiin aikaisemmin nimeä
sukropino (tutstack), koska tietoa saatettiin pinota vain aikaisemman
tiedon jatkeeksi. Nyt tästä rajoituksesta on vapauduttu niin, että
mikä tahansa talletettava tieto on sijoitettavissa myös aikaisempien
väliin.
Sukromuistin rakennetta ei kuitenkaan ole muutettu. Se on
yksinkertaisesti merkkijono, joka koostuu merkkeihin @
päättyvistä
sanoista. Sukromuistissa olevat sanat voivat olla sekä lukuja että
ei-numeerisia, tekstityyppisiä tietoja. Niitä vastaaviin
muistipaikkoihin viitataan sukrokielessä merkinnöin W1
,W2
,..., jotka
on mahdollista muuttaa kussakin sukrossa myös selväkielisiksi
W
-alkuisiksi nimiksi.
Sukrot kokoavat tietoa sukromuistiin mm. toimituskentästä ja
kysymyksistä, joita sukro esittää käyttäjälle. Muistiin poimittuja
sanoja voidaan sitten kirjoittaa toimituskenttään ja käyttää
ehdollisten, sukron jatkotoimintaa koskevien päätelmien pohjana.
Sukromuistin sisällä tietoja voi kopioida paikasta toiseen ja muistiin
talletetuilla luvuilla voi rajoitetusti myös laskea.
Kun sukro käynnistetään toimituskentästä komennolla, jossa on
komentosanana sukron nimi (edessä /
) ja perässä joukko pilkuin tai
välilyönnein erotettuja parametreja (esim. /PIEN 19.1,12
), parametrit
sijoittuvat tässä järjestyksessä muistipaikkoihin W1
,W2
,... (eli
W1=19.1
ja W2=12
).
Ajatelkaamme, että sukron PIEN
tarkoituksena on ilmoittaa, kumpi
parametreina annetusta luvusta on pienempi. Siis yo. tapauksessa sen
tulisi kirjoittaa seuraavalle toimituskentän riville lause "Luvuista
19.1 ja 12 pienempi on 12.").
Sukron PIEN
ohjelmakoodi ja toiminta ilmenee seuraavasta:
|
|
Riveillä 17-24 oleva ohjelma on talletettu TUTSAVE
-komennolla
sukroksi PIEN
. Ohjelmaa testataan rivillä 26, jolloin sen antama tulos
syntyy riville 27. Ohjelmassa riveillä 18 ja 19 olevat vertailut
johtavat siihen, että pienempi luvuista W1
ja W2
kopioidaan
sijoituslauseella {W3=W1
} tai {W3=W2}
muistipaikkaan W3
, jolloin
rivillä 23 oleva koodi kirjoittaa vaaditun lauseen. Tässä lauseessa
käytetään tulostuskäskyjä {print W1}
jne. sukromuistin sisältämien
tietojen kirjoittamiseen. Huomaa myös, että tasatilanteessa joudutaan
riville 20, joka kirjoittaa vastaavan tuloksen.
Sukromuistin sisältö voidaan listata toimituskenttään
TUTSTACK
-komennolla, kuten on tehty rivillä 29. Muistin sisältö
merkkijonona ilmestyy seuraavalle riville (30).
Jos sukro käynnistetään ilman parametreja (esim. /KOE
),
sukromuisti alustetaan yhdellä sanalla W1=(empty)
. Tämän tiedon avulla
sukro voi esim. tutkia odottamiensa parametrien puuttumista. Esim.
äskeisen PIEN
-sukron alussa voisi olla testi
- if W1 '<>' (empty) then goto Jatko
*Vertailtavat luvut puuttuvat!{goto L}
+ Jatko: ...
Tässä relaatio '<>'
tarkoittaa merkkijonojen erilaisuutta; siis
jos ensimmäinen parametri ei ole (empty)
, hypätään eteenpäin kohtaan
Jatko
, muuten kirjoitetaan lukujen puuttumista koskeva ilmoitus ja
lopetetaan.
W1
sisällöksi
poikkeuksellisesti W1=(start)
. Näin sukro kykenee tunnistamaan,
milloin sitä käytetään aloitussukrona.
Sukromuisti tyhjennetään kokonaan koodilla {del stack}
ja esim.
muistipaikasta W3
eteenpäin koodilla {del stack W3}
. Muistiin
sijoitettavien sanojen lukumäärää eikä pituutta ei ole periaatteessa
rajoitettu, mutta sukromuistin enimmäispituus on nykyisellään
255 merkkiä. (SURVO 98:ssa 1000 merkkiä.)
Tilan ylityksestä tulee virheilmoitus ja sukron toiminta
keskeytyy. Koska sukromuistia käytetään vain väliaikaisiin
talletuksiin, em. rajoitus ei ole käytännössä vakava.
Joskus on tarpeen tehdä sukromuistin sisällöstä "varakopio". Se
tapahtuu käskyllä {save stack}
. Näin talletettu muistin sisältö
saadaan takaisin nykyisen sisällön jatkeeksi käskyllä {load stack}
.
Seuraava esimerkki havainnollistaa tämänkaltaista sukromuistin hallintaa:
|
|
Sukromuistin koko sisältö on mahdollista tallettaa tiedostoon
käskyllä {save stack ABC}
, missä ABC
tarkoittaa tiedoston nimeä.
Tiedoston oletuspolku on Survon väliaikaisten tiedostojen hakemisto,
joka on määritelty rivillä tempdisk systeemitiedostossa SURVO.APU
.
Jos ko. hakemistoa ei ole annettu, käytetään Survon päähakemiston
alla olevaa TMP
-hakemistoa.
Tiedostoon ABC
talletettu sukromuisti poimitaan takaisin käskyllä
{load stack ABC}
, jolloin muistin aiempi sisältö tuhoutuu. (Huomaa ero
käskyyn {load stack}
.)
Tiedoston nimen saa antaa myös itse sukromuistin välityksellä eli
esim. {save stack W3}
.
Editoriaalista ja kosketuslaskentaa on luonnollista käyttää
sukrojen tukena. Kuten jo edellisestä esimerkistä ilmeni,
sukromuistissa on mahdollista tehdä myös suoraan yksinkertaisia
aritmeettisia laskutoimituksia. Tähän aiheeseen palataan tarkemmin
vasta myöhemmin.
Mainittakoon kuitenkin jo nyt, että käytettävissä on mm. neljä
peruslaskutapaa:
{Wi=Wj+Wk} {Wi=Wj-Wk} {Wi=Wj*Wk} {Wi=Wj/Wk}
Muistipaikkojen asemasta operandeina saattaa esiintyä myös vakioita.
Esim. {W5=W5+1}
tarkoittaa, että muistipaikan W5
nykyistä arvoa
kasvatetaan yhdellä.
Tietoja (sekä lukuja että merkkijonoja) siirretään paikasta toiseen
kopiointikäskyillä {Wi=Wj}
. Niitä voi myös kytkeä peräkkäin käskyllä
{Wi=Wj&Wk}
. Esim. käskyt
{W1=SURVO}{W1=W1& 84C}
saavat aikaan, että paikan W1
sisällöksi tulee "SURVO 84C
".
Sukromuistin muistipaikoille W1
,W2
,... annetaan tarvittaessa
W
-alkuiset selväkieliset nimet selitysriveillä, jotka ovat muotoa
/ def Wnimi1=W1 Wnimi2=W2 Wnimi3=W3
/ def Wnimi4=W4 Wnimi5=W5
Nimien käyttö parantaa ohjelman luettavuutta. Usein ohjelmaa
kehiteltäessä joutuu myös muuttamaan asioiden paikkoja sukromuistissa;
tarvitaan esim. uusia parametreja. Tällaisista muutoksista selvitään
korjaamalla vain def
-selitysrivit eikä ole aihetta kajota itse
ohjelmakoodissa muistipaikkojen indekseihin.
Seuraava sukro muodostaa editoriaalisella laskennalla kahden annetun luvun pienimmän yhteisen jaettavan ja kirjoittaa tuloksen lauseena tyyliin: "Lukujen 144 ja 54 pienin yhteinen jaettava on 432."
|
|
Huomaa, miten sukro synnyttää lausekkeen arvon editoriaalisella
laskennalla, eristää tuloksen lausekkeesta (korvaamalla merkin =
välilyönnillä) ja poimii sen sukromuistiin käskyllä {save word Wpyj}
.
Ohjelmalistaus on hiukan ylikommentoitu. Näytteenä normaalimmasta
kirjoitustavasta otamme edellisen yleistyksenä sukron SYTPYJ
, joka
ilmoittaa kaksirivisenä lauseena sekä suurimman yhteisen tekijän että
pienimmän yhteisen jaettavan:
|
|
Mallisovellus näkyy riveillä 62-64.