Eräs APL-opas

 

Johdanto

Tämän oppaan tarkoituksena on tarjota tiivis tietopaketti APL-kielestä, sen erityispiirteistä, ominaisuuksista ja säännöistä. APL-kirjallisuutta on kautta aikain suomennettu vähän, mutta sitäkin paremmin: Gustav Tolletin suomentama "se vihreä" APL-kielen opas on edelleen täyttä rautaa. I-APL -käsikirja lienee viimeisin varsinainen käännös, useita luentomonisteita on tehty eri tarpeisiin. Ulkomaista APL-kirjallisuutta on saatavilla sitten sitäkin enemmän.

Tätä ei ole tarkoitettu kaikenkattavaksi APL-oppikirjaksi – sellaisen tekemiseen ei ole resursseja – itseopiskelun ja kertauksen tueksi kylläkin. Olen koonnut yhteen arvokkaina pitämiäni tietohippuja eri lähteistä: käsikirjoista, kirjallisuudesta, konferenssijulkaisuista, seminaaripapereista ja lehdistä. Luettelo tärkeimmistä lähteistä ja muusta suositeltavaksi katsomastani materiaalista on tämän oppaan lopussa.

Lappeenrannan Teknillisen Korkeakoulun APL-kurssin 15-sivuinen luentopruju, Seppo Linnainmaan tekemä, on se opas, josta olen perustietoni ammentanut. Aloin aikoinani siirtää tätä käsinkirjoitettua pikku tiiliskiveä elektroniseksi; kun olin vihdoin saanut pääosat naputelluksi, kasvoi ruokahalu niin että aloin rakentaa samaan muottiin laajempaa kokonaisuutta. Tämmöinen siitä sitten tuli.

Opas koostuu kahdesta pääosasta: APL (standardi-APL) ja APL2. Käsittelytapaan on vaikuttanut vahvasti APL:n kehityskaari, eli ns. historiallisesti pakottavat syyt.

Alkuosassa tutustutaan kielen perusperiaatteisiin ja porhalletaan lyhyesti perusfunktiot läpi. Skalaarifunktiot, joihin esimerkiksi jo kansakoulusta tutut aritmeettiset funktiot kuuluvat, esitetään taulukkoina ja sekafunktiot (ei-skalaarifunktiot) käsitellään ensin vektoriargumenttien (tietojonojen) kanssa. Sitten tutustutaan moniulotteisiin sääntiöihin ja käydään sekafunktiot uudestaan tarkemmin ja muodollisemmin läpi. Itse ohjelmoitavan funktion rakenne, operaattorit, järjestelmämuuttujat ja -funktiot sekä järjestelmäkomennot esitellään pintapuolisesti. Lopussa on vielä pieni idiomilista, hyödylliseksi havaittuja lyhyitä APL-ilmaisuja.

APL2-osassa perehdytään IBM:n de facto -standardin saavuttaneeseen toisen sukupolven APL-kieleen.

Teoriaa on joltisensakin paljon: APL2:n kehitysperiaatteet, uudet käsitteet (mm. sisäkkäisyys) esitellään tiiviisti. Olen tähän yhteyteen tuonut sellaisia tekstejä, joita ei tietääkseni ole suomeksi ennen laajasti esitetty, siitä tuo teoreettisuuden ylenmääräinen kalkinpöly. Lopuksi esitellään uudet funktiot, operaattorit, järjestelmäfunktiot ja -muuttujat ynnä systeemikäskyt sekä muutama APL2-idiomi.

Parhaan hyödyn tästä oppaasta saa, jos voi samanaikaisesti harjoitella jollain APL-tulkilla. Eri valmistajien tulkeilla ovat omat (käsikirjoissa kerrotut) rajoituksensa ja kielilaajennuksensa, joten jotkut esimerkit eivät välttämättä toimi juuri prikulleen kuten tässä oppaassa. Pääperiaatteet kuitenkin ovat samat.

Opas on kirjoitettu hyvässä uskossa sellaisen tarpeeseen, sen painotukset, kieliasu ja mahdolliset virheet ovat omiani. Arvokasta oikoluku- ja huomautusapua ovat Jaanaliisan (vaimon) lisäksi antaneet Juvosen Arto, Pasasen Pauli, Pakarisen Perttu ja Linnan Kimmo. Kiitoksien arvoisesti.

Pitäkää hyvänänne.

Järvenpäässä 19.10.1998

Veli-Matti Jantunen

3.129/18.4.99

 

1. APL

 

Yleistä

A Programming Language (Kenneth E. Iverson: 1957 –).

Alun perin matemaattinen notaatio, ei tavanomaisessa mielessä ohjelmointikieli. APL:n johtavana periaatteena on ilmaista matemaattiset ja tietojenkäsittelylliset perustoiminnot omalla funktiosymbolillaan tai niiden yhdistelmillä; luku- ja merkkijoukkoja operoidaan kokonaisuuksina (siitä kutsumanimi Array Processing Language).

APL:ää voidaan käyttää:

välittömään laskentaan (mahdollistaa tietokoneen laskimenomaisen käytön)
itse tehtyjen funktioiden (ohjelmien) määrittelyyn ja ajoon.

APL-funktiot voivat olla:

monadisia eli yksiargumenttisia (esim. *X tarkoittaa ex:ää)
dyadisia eli kaksiargumenttisia (esim. X*Y tarkoittaa xy:tä)
niladisia eli argumentittomia.

Useimmat funktiosymbolit ovat käytössä sekä monadisina että dyadisina, yksikään perusfunktio (primäärifunktio) ei ole argumentiton. Funktiot ovat keskenään samanarvoisia eli niillä ei ole erillistä funktiohierarkiaa.

APL-lausekkeiden suoritusjärjestys on aina oikealta vasempaan, ellei sulkein toisin osoiteta (ts. funktion oikeana argumenttina on sen oikealla puolella olevan lausekkeen arvo).

APL toimii tulkkiperiaatteella: ohjelmia ei käännetä vaan ne suoritetaan alkuperäiskoodia suoraan tulkitsemalla. Tämä mahdollistaa joustavan ohjelma-ajon tarkkailun ja virhetilanteiden hallinnan tarvittaessa.

 

APL-vakiot

Numeeriset skalaarit:

nollaa pienemmillä luvuilla on etumerkkinä negatiivi (ylämiinus) ¯
reaaliluvun desimaalierotin on piste (3.14159)
skaalattujen lukujen kokonaislukueksponenttiosa erotetaan E:llä (0.5E¯3 = 0.0005)
sama luku voidaan syöttää usealla eri esitystavalla (17.0 ja 1.7E1 tarkoittavat samaa lukua)
luvun osat kirjoitetaan yhteen (ei välilyöntimerkkejä, pilkkuja tms.).

Numeeriset vektorit (lukujonot):

joukko välilyönnein erotettuja lukuskalaareja (3 3.141 0.5E¯3).

Tekstiskalaari:

heittomerkkien välissä oleva yksittäinen merkki ('A').

Tekstivektorit:

heittomerkkien ympäröimä merkkijono ('TEKSTIÄ')
merkkijonon sisältämät heittomerkit kirjoitetaan kahdennettuina ('TIU''UT').

Totuusarvot:

totuusarvoja vastaavat (loogiset) binääriluvut 1 (tosi) ja 0 (epätosi)
voidaan käyttää sekä loogisesti (1Ÿ0) että aritmeettisesti (1+1).

 

Dyadiset aritmeettiset skalaarifunktiot

merkki nimitys määritelmä esimerkki tulos
+ yhteenlasku (add) x+y 2+3 5
- vähennyslasku (subtract) x-y 2-3 ¯1
× kertolasku (multiply) x×y 2×3 6
÷ jakolasku (divide) x/y 2÷¯5 ¯0.4
| jakojäännös (residue) y mod x 1|2.17 0.17
maksimi (maximum) max(x,y) 3—7 7
˜ minimi (minimum) min(x,y) ¯2˜¯1 ¯2
* potenssi (power) xy 9*0.5 3
µ logaritmi (logarithm) logxy 10µ2 0.30103..
! binomikerroin (binomial) x!/(y!×(x-y)!) 2!5 10
HUOM: 0÷0 = 1 0|X = X 0*0 = 1

 

Monadiset aritmeettiset skalaarifunktiot

merkki nimitys määritelmä esimerkki tulos
+ arvo (luku) (value, identity) 0+x +3 3
- vasta-arvo (vastaluku) (negate) 0-x -¯2 2
× etumerkki (signum)   ׯ3 ¯1
÷ käänteisarvo (käänteisluku) (reciprocal) 1/x ÷2 0.5
| itseisarvo (absolute value, magnitude) ½x½ |¯2.1 2.1
yläpyöristys (yläarvo, katto) (ceiling) éxù —¯7.7 ¯7
˜ alapyöristys (ala-arvo, lattia) (floor) ëxû ˜11.9 11
* eksponenttifunktio (exponential) ex *1 2.71828..
µ luonnollinen logaritmi (natural logarithm) ln x µ*5 5
! kertoma (gammafunktio x+1) (factorial) x! !3 6
? satunnaisluku (joukosta [1..x]) (roll)   ?6 2 (esim.)

 

Dyadiset loogiset skalaarifunktiot, relaatiot

merkki nimitys 1 ¦ 1 1 ¦ 0 0 ¦ 1 0 ¦ 0
^ ja (looginen tulo) (and) 1 0 0 0
Ÿ tai (looginen summa) (or) 1 1 1 0
Š poissulkeva ja (ei-ja) (nand) 0 1 1 1
poissulkeva tai (ei-tai) (nor) 0 0 0 1
< pienempi (less than) 0 0 1 0
ˆ pienempi tai yhtä suuri (ei suurempi, looginen implikaatio Þ) (less than or equal) 1 0 1 1
= yhtäsuuri (yhtä kuin) (equal) 1 0 0 1
suurempi tai yhtä suuri (ei pienempi) (greater than or equal) 1 1 0 1
> suurempi (greater than) 0 1 0 0
¬ eri suuri (not equal, xor) 0 1 1 0

 

Monadiset loogiset skalaarifunktiot

merkki nimitys määritelmä esimerkki tulos
~ negaatio (ei) (not) ¬x ~0 1
HUOM: 1 = tosi (true), 0 = epätosi (false)

 

Trigonometriset funktiot (pallo-, ympyräfunktiot) ±

merkintä määritelmä merkintä määritelmä
±X x (pii kertaa) (pi times)    
0±X Ö1-x2    
1±X sin x ¯1±X arcsin x
2±X cos x ¯2±X arccos x
3±X tan x ¯3±X arctan x
4±X Ö1+x2 ¯4±X Ö-1+x2
5±X sinh x ¯5±X arsinh x
6±X cosh x ¯6±X arcosh x
7±X tanh x ¯7±X artanh x
HUOM: Kulman arvo esitetään radiaaneina, esimerkiksi sin 30º: 1±±30÷180 = 0.5

 

Sijoitus (asetus, olkoon)

Sijoitusfunktio (assignment) on dyadinen funktio, jonka vasen argumentti on sen muuttujan nimi, johon oikean argumentin (lausekkeen) arvo sijoitetaan.

Muuttujan nimen (kuten funktionkin) ensimmäisenä kirjaimena on jokin seuraavista merkeistä: A..Z, a..z, ‘,  ja seuraavina merkkeinä voi näiden lisäksi olla joku seuraavista: 0..9,_ . Pienten kirjainten sijaan on alun perin käytetty alleviivattuja kirjaimia, jotka vieläkin ovat joissakin APL-tulkeissa käytössä.

Nimissä ei voi käyttää välilyöntejä.

Muuttujan tietotyyppiä tai kokoa ei määritellä etukäteen, muuttujan arvo voi olla numeerinen, looginen tai merkkimuotoinen skalaari, vektori tai usean tällaisen muodostama taulukko yleisnimitykseltään sääntiö.

Sijoitusfunktion arvo = oikean argumentin arvo. Sijoitus voi esiintyä missä tahansa lausekkeen sisällä.

Jos lauseke päättyy sijoitukseen, eli se on vasemmanpuoleisin funktio, ei lausekkeen arvoa tulosteta ruudulle.

B„2+C„9-A„5
A+B+C

15

ISOONTALON_ANTTI_JA_RANNANJARVI„'RAA''AT HELAPÄÄLEU''UT'
ISOONTALON_ANTTI_JA_RANNANJARVI

RAA'AT HELAPÄÄLEU'UT

HUOM: Syöte esitetään perinteisesti kuuden merkin verran sisennettynä ja tulos vasempaan reunaan tasattuna. Tulostettavaa merkkidataa ei rajoiteta heittomerkeillä.

 

Vektoriargumenttiset skalaarifunktiot

Jos monadisen skalaarifunktion argumentti on vektori, kohdistuu funktio kuhunkin sen alkioon erikseen.

V„1 2 3 4 5
!V

1 2 6 24 120

Jos dyadisen skalaarifunktion molemmat argumentit ovat vektoreita, niissä pitää olla yhtä monta alkiota.

Skalaarifunktion tuloksena on vektori, jossa kukin alkio on saatu soveltamalla kyseistä funktiota argumenttien vastinalkioihin.

Jos toinen argumenteista on skalaari tai yksialkioinen vektori, se käsitetään laajennetuksi toisen argumentin kokoiseksi vektoriksi ennen funktion suoritusta (ns. skalaarilaajennus).

V×2

2 4 6 8 10

'ABRAKADABRA'='A'

1 0 0 1 0 1 0 1 0 0 1

A„8 6 4 2 0
V„1 2 3 4 5
A×V

8 12 12 8 0

 

Luku- ja kirjoituspyyntö Œ 

Merkintä Œ„X ilmaisee, että X:n arvo halutaan tulostaa ruudulle (evaluated output).

Œ„B„5-3

2

Kirjoituspyyntöä Œ ("luukku/ovi/ikkuna/näyttö") ei aina tarvita: jos APL-lauseke ei pääty sijoitusfunktioon, sen arvo tulostetaan ruudulle. Lausekkeiden välitulosten esittämiseen ja selkeyden takia sitä kannattaa käyttää.

Œ„2׌„2*10

1024

2048

Jos kirjoituspyyntösymbolin oikealla puolella ei ole sijoitusnuolta, sen arvo on näppäimistöltä syötettävän lausekkeen arvo. Lukupyyntönä APL-istuntoon tulostuu tällöin Œ: (evaluated input).

B„2
Œ„3+A„Œ

Œ: B+5

10

Jos rivinpalautusta ei haluta suorittaa tulostuksen jälkeen, se saadaan estetyksi käyttämällä Œ:n sijaan merkkinäyttösymbolia  (character output). Jos :n oikealla puolella ei ole sijoitusnuolta, sen arvo on näppäimistöltä luettavan tekstin sisältö merkkijonona (character input, prompt). Merkintää Œ: ei tulostu.

Œ„A„

B+5

B+5

 

Vektoriargumenttiset sekafunktiot

indeksointi (viittaus vektorin alkioihin) [ ]

Viitattavan alkion järjestysnumero kirjoitetaan vektorin perään hakasulkeisiin.

X„7 3 5 1 8
X[2]

3

Jos hakasulkeissa on järjestysnumerovektori, tuloksena on vastaavista alkioista muodostettu tulosvektori.

X[4 2 3 4]

1 3 5 1

A„'PAPURIKKO'
Œ„TXT„A[2 1 4 1 2 3 3 6 7 9]

APUPAPPIKO

Olemassa olevan vektorin yksittäisten alkioiden arvoja voidaan muuttaa hakasuljeindeksoinnin avulla.

A„'LEHVÄ'
A[4]„'M'
A

LEHMÄ

TXT[4 10 8 6 7 2 5 9]„'AAAKKKNP'
TXT

AKUANKKAPA

 

koko, koonti ½

Monadinen kokofunktio ½X (½= "rho") ilmaisee vektorin X alkioiden lukumäärän.

½1 2 3 4 5 6 7 8 9 10

10

TXT[½TXT]

A

Dyadinen koontifunktio N½X toimii siten, että X:n sisältämiä alkioita toistetaan, kunnes tulosvektorissa on positiivisen kokonaisluvun N osoittama määrä alkioita.

4½'A'

AAAA

6½'KAS'

KASKAS

3½1 2 3 4 5

1 2 3

Vektori, jossa ei ole yhtään alkiota, on tyhjä vektori. Tyhjän tekstivektorin saa kirjoittamalla kaksi rajoitinheittomerkkiä perätysten: '' (välissä ei saa olla mitään). Tyhjän numeerisen vektorin saa vaikkapa koontifunktiolla (istuntoon tulostuu tyhjä rivi):

0½1

 

otto

Ottofunktio N†X antaa tulokseksi vektorin, jossa on |N kappaletta vektorin X alkioita alusta päin lukien, jos N>0, tai lopusta päin laskettuna, jos N<0. Jos (|N)>½X, täydennetään tulosta tyypistä riippuen joko nollilla tahi välilyönnein.

5†'VIRTAPIIRI'

VIRTA

¯5†'KURPITSA'

PITSA

A„2 4 6 8 10
6†A

2 4 6 8 10 0

¯1†A

10

¯8†A

0 0 0 2 4 6 8 10

 

pudotus

Pudotusfunktiolla poistetaan alkioita vektorin alku- tai loppupäästä.

3‡'VIRTAPIIRI'

TAPIIRI

A„2 4 6 8 10
¯2‡A

2 4 6

3‡6†A

8 10 0

Jos pudotettavien alkioiden määrä on yhtä suuri tai suurempi kuin vektorissa olevien alkioiden lukumäärä, on tuloksena aina tyhjä vektori.

½123‡A

0

 

jäsenyys (joukkoon kuuluminen) ¹

X¹V kertoo, onko skalaari X yhtä suuri kuin jokin vektorin V alkioista (tulos 1) vai ei (tulos 0).

Jos X on vektori, vertailu suoritetaan jokaiselle X:n alkiolle erikseen ja tuloksena on looginen vektori (bittivektori), jossa on yhtä monta alkiota kuin X:ssä.

A„'VESIHIISI SIHISI HISSISSÄ'
B„'AEIOUYÅÄÖ'
A¹B

0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1

B¹A

0 1 1 0 0 0 0 1 0

 

liitos ,

Lauseke X,Y antaa tulokseksi vektorin, jossa Y:n alkiot on liitetty X:n alkioiden perään.

A„3 5 7
B„9 11
A,0,B

3 5 7 0 9 11

A„'KOKO'
A,'A ',A,'ON ',A,' R',(1‡A),A,'O!'

KOKOA KOKOON KOKO ROKOKOKOO!

 

lukusarja, sijainti ¼

Monadinen lukusarjafunktio ¼X (¼="iota") tuottaa positiivisesta kokonaisluvusta X vektorin, jonka alkioina ovat luvut 1..X.

¼9

1 2 3 4 5 6 7 8 9

20+(¼7)÷10

20.1 20.2 20.3 20.4 20.5 20.6 20.7

Jos X on nolla (¼0), on tuloksena tyhjä vektori jonka koko = 0.

Dyadisen sijaintifunktion V¼X tuloksena on X:n kanssa samanmuotoinen sääntiö, jonka kukin alkio ilmaisee monentenako vastaava X:n alkio on vektorissa V (useista esiintymistä ensimmäinen).

Jollei alkiota löydy ollenkaan, on tuloksena yhtä suurempi luku kuin V:ssä on alkioita.

'ACDC'¼'C'

2

2 3 5 7¼¼4

5 1 2 5

';,.;:'¼' ;'

6 1

 

satunnaisluku ?

Monadinen satunnaislukufunktio ?X määrittää positiiviselle kokonaisluvulle X satunnaisluvun väliltä [1,X].

Esimerkiksi viiden nopan samanaikaista heittoa voi simuloida seuraavasti:

?5½6

5 5 5 5 5

Yatzy!

 

supistus /

Kaksiargumenttinen supistusfunktio V/X valitsee X:stä loogisen ohjainvektorin V ykkösiä vastaavat alkiot. Argumenteissa on oltava yhtä monta alkiota tai sitten V voi olla skalaari, jolloin koko oikea argumenttivektori supistetaan tällä arvolla.

A„5 4 3 2 1
1 0 1 0 1/A

5 3 1

B„'KAPPALE'
0 1 1 0 0 1 0/B

APL

 

pelkistys (reduktio) ¸/

Jos vektorilla X halutaan suorittaa laskutoimitus, joka voitaisiin suorittaa panemalla joka alkioväliin sama skalaarifunktio ¸, tämä funktio voidaan panna kenoviivan erottamana vektorin eteen.

+/A

15

×/A

120

Funktioargumenttinen pelkistys on itse asiassa operaattori-ilmaisu. Näihin palataan myöhemmin.

 

lavennus \

Kaksiargumenttisen lavennusfunktion V\X loogisessa ohjainvektorissa V on oltava yhtä monta ykköstä kuin X:ssä on alkioita (ei skalaarilaajennusta). Lavennuksen tuloksena on vektori, jossa V:n nollaa vastaaviin kohtiin tulee X:n tyypistä riippuen joko nollia tai välilyöntejä.

1 0 1 0 1\'ABC'

A B C

1 1 0 0 1 0 1 1 0\A

5 4 0 0 3 0 2 1 0

 

selaus (kertymä) ¸\

Jos takakenon vasen argumentti korvataan skalaarifunktiomerkinnällä, on tuloksena X:n kokoinen kertymävektori, jossa kukin alkio edustaa osavektorien (X[1], X[1 2], X[1 2 3], ..) pelkistystä.

B„1 2 3 4 5

+\B

1 3 6 10 15

×\B

1 2 6 24 120

Funktioargumenttinen kertymä on myös operaattori-ilmaisu.

 

nousuindeksi

Monadisen nousuindeksifunktion “X tulosvektorissa ovat numeerisen vektorin X indeksit alkioiden mukaisessa nousevassa suuruusjärjestyksessä.

N„5 7 4 9 0
“N

5 3 1 2 4

Vektori lajitellaan nousevaan suuruusjärjestykseen nousuindeksifunktion tuloksen (indeksivektorin) ja hakasuljeindeksoinnin avulla.

N[“N]

0 4 5 7 9

Nousuindeksiä voidaan käyttää myös muiden vektoreiden järjestämiseen määrätyn avainvektorin alkioiden mukaiseen suuruusjärjestykseen.

'ONKII'[“N]

IKONI

 

laskuindeksi

Monadinen laskuindeksifunktio ”X toimii nousuindeksin kaltaisesti, mutta sen tuloksena on nousevan sijasta laskeva suuruusjärjestys.

”N

4 2 1 3 5

N[”N]

9 7 5 4 0

'KAIVO'[”N]

VAKIO

 

heijastus (peilaus), kierto ²

Monadinen heijastusfunktio ²X kääntää vektorin X alkiot päinvastaiseen järjestykseen.

'K',²'SAIPPUA'

KAUPPIAS

²3 5 7 11

11 7 5 3

Dyadisella kiertofunktiolla N²V kierretään vektorin V alkioita kokonaisluvun N itseisarvon verran joko vasempaan (alkupäätä eli origoa päin), kun N>0, tai oikealle, kun N<0.

3²A„3 5 7 11

11 3 5 7

¯3²A

5 7 11 3

¯1²'AKANAT'

TAKANA

5²'AKANAT'

TAKANA

 

APL-ohjelmat

otsikkorivi

Muoto (hakasulkeissa olevat osat voivat puuttua, aaltosulkeissa olevat voivat esiintyä 0,..,N kertaa):

[tulosmuuttuja] [varg] nimi [oarg] {;lokaalimuuttuja}

Jos funktiolla on vain yksi argumentti, se on oikeanpuoleinen argumentti (oarg). Paikalliset muuttujat (lokaalimuuttujat) ovat käytössä vain ohjelman sisällä. Jos lokaalimuuttujan arvoa muutetaan, ei minkään ohjelman ulkopuolisen samannimisen muuttujan arvo muutu. Muuttujat, jotka eivät ole paikallisia, ovat globaaleja. Globaalimuuttujat ovat käytettävissä (näkyvissä) sekä funktion sisä- että ulkopuolella, paitsi jos jokin lokaalimuuttuja on samanniminen. Tällöin lokaalimuuttujan nimi peittää (shadow) vastaavan globaalin nimen funktion suorituksen ajaksi. Globaalimuuttujan arvo ei riipu samannimisen lokaalimuuttujan arvosta.

Argumentit ovat paikallisia muuttujia, jotka saavat alkuarvoikseen ohjelman kutsussa esiintyvät arvot. Ohjelmia voidaan käyttää rekursiivisesti eli ne voivat kutsua itseään.

 

rivien numerointi

Otsikkorivin numero on 0 (nolla). Muut rivit ajatellaan numeroiduiksi juoksevasti 1,2,3,... Rivin alussa oleva kaksoispisteeseen päättyvä nimi on tällöin paikallinen muuttuja (riviotsikko, nimiö (label)), jonka arvo on sama kuin kyseisen ohjelmarivin numero. Rivinumeron arvoa ei voi muuttaa sijoitusfunktiolla.

 

hyppykäsky

Hyppykäskyn …L (branch, goto, jump) vaikutuksesta (skalaaria käsitellään yksialkioisena vektorina):

siirrytään seuraavalle riville, jos L on tyhjä vektori
poistutaan ohjelmasta, jos L[1]=0 (tai muu kokonaisluku joka ei ole funktion rivinumero)
muutoin suoritus jatkuu riviltä, jonka rivinumero on L[1]
niladinen hyppynuoli (escape, abort) keskeyttää kaikkien ohjelmien suorituksen.

 

kommentti (selite, huomautus) ©

Ohjelmarivillä symboli © (ei tekstivektorin osana) tulkitaan kommentiksi (comment) merkistä rivin loppuun.

HUOM: Jotkut APL-tulkit vaativat kommentit omiksi riveikseen.

 

esimerkkejä

[0] Z„KERTOMA N
[1] …(Nˆ1)/OK © hyppää jos alussa..
[2] Z„N×KERTOMA N-1 © rekursiivinen kutsu
[3] …0 © lopeta rekursio
[4] OK:Z„1 © yhden/nollan kertoma
[0] ZM SYT N
[1] © Suurin yhteinen tekijä Euklideen menetelmällä
[2] :ZM © paluuarvo
[3] MM|N © laske jakojäännös
[4] N„Z © vaihda päittäin
[5] …(M¬0)½ © ellei tasan, uudestaan
40 SYT KERTOMA 4

8

 

Hieman virheilmoituksista

Jos APL-tulkki kohtaa lausekkeen, jota se ei voi suorittaa, tulkki keskeyttää ohjelman suorituksen.

Ruudulle tulostuvassa kolmirivisessä virheviestissä on virhetyypistä riippuva lakoninen virheteksti, virhelauseke (ohjelmarivi) ja ^-merkillä osoitetaan se kohta, johon suoritus pysähtyi.

Esimerkiksi:

5÷0

DOMAIN ERROR © määrittelyaluevirhe (nollalla ei saa jakaa)

5÷0
^

Yleisiä (liiankin) virheilmoituksia ovat:

DOMAIN ERROR - argumentti ei kuulu määrittelyalueeseen
INDEX ERROR - indeksiviittaus sääntiön ulkopuolelle
LENGTH ERROR - argumenttien pituudet eivät täsmää
RANK ERROR - argumentit eivät ole samanmuotoisia
SYNTAX ERROR - väärämuotoinen APL-lauseke
VALUE ERROR - viittaus muuttujaan tai funktioon, jota ei ole olemassa
WS FULL - työtilan muisti on täyttynyt.

 

Virhetilanne (joissakin tulkeissa myös istunnossa tehdyt virheet) rekisteröidään APL:n tilanilmaisimeen (virhetilannepino, tilaindikaattori eli SI (State Indicator)). Ohjelman suorituksen keskeydyttyä voi virhetilanteen poistaa (korjata muuttujat, näppäilyvirheet tms.) ja jatkaa suoritusta siitä, mihin se keskeytyi.

Keskeytyneen ohjelman saa jatkumaan korjauksen jälkeen hyppäämällä suoraan virheriville, mihin voi käyttää lauseketta …ŒLC. Tuo ŒLC (Line Counter) viittaa järjestelmämuuttujavektoriin, jonka ensimmäisenä alkiona on kulloisenkin suoritettavan ohjelmarivin numero.

Työtilan tilanilmaisimen saa esille järjestelmäkomennolla )SI.

Tilapinon saa tyhjennetyksi (tilaa viemästä) järjestelmäkomennolla )RESET.

Järjestelmämuuttujiin, -funktioihin ja -komentoihin palataan vielä tuonnempana.

 

Kontrollirakenteista

APL:n kontrollirakenteet on nopeasti kerrottu: hyppynuolen lisäksi niitä ei ole. Hyvässä APL-koodissa ei juuri kontrollirakenteita tarvita; käsiteltävän tiedon järjestäminen rakenteeltaan ongelmanratkaisuun sopivaksi vähentää skalaarikielille tyypillisten silmukoiden tarvetta.

Vaikka ehto- ja silmukkarakenteita ei kielessä ole, on ne tarvittaessa helppo tehdä.

Esimerkiksi N kertaa suoritettava silmukka voidaan tehdä vaikkapa näin:

I„0 © kierroslaskuri
0:I„I+1 © silmukan alkuosoite
…(N<I)/1 © joko kaikki?
... © silmukassa suoritettava APL-koodi
…0 © takaisin alkuun
1: © jatko-osoite

Yksinkertainen jos-niin -rakenne (if-then) esitellään myöhemmin suoritusfunktion yhteydessä.

 

Työtila ja kirjastot, tiedostoista

APL:n käyttämät objektit talletetaan perinteisesti työtiloihin (workspace). Työtilaa käsitellään APL-istunnossa (session), jolloin käytettävissä ovat kaikki APL:n perusfunktiot sekä ne muuttujat ja funktiot, jotka käsiteltävään työtilaan on tehty (editoitu) taikka kopioitu. Työtila sisältää siis koko työskentely-ympäristön, eli virhetilanteeseen keskeytyneen funktion ja sen mahdollisten kutsufunktioiden keskeytyshetken lokaalimuuttujat ovat myös läsnä. Tämä toisaalta mahdollistaa virheellisen työtilan talletuksen myöhempää selvittelyä varten, toisaalta kuluttaa työtilan käyttömuistia.

Työtilojen hallintaan on kourallinen järjestelmäkäskyjä (system command), jotka alkavat aina oikealla sulkeella.

Talletettu työtila ladataan käytettäväksi komennolla )LOAD ttnimi, missä ttnimi tarkoittaa työtilan (taltio)nimeä. Eri ympäristöissä työtilojen nimeämisen säännöt vaihtelevat. Yleensä kahdeksanmerkkinen APL- ja skandimerkkejä sisältämätön nimi kelpaa.

Työtilan nimen saa esiin argumentittomalla komennolla )WSID (WorkSpace IDentifier). Ennen talletusta on työtilalle annettava nimi joko tallennuskomennon yhteydessä tahi sitten komennolla )WSID ttnimi.

Työtila talletetaan joko argumentittomalla komennolla )SAVE, tai sitten käskyllä )SAVE ttnimi. Tehdyn työn talletus on täysin käyttäjän kontolla. Kokenutkin käyttäjä tulee silloin tällöin ladanneeksi uuden työtilan vaikka entinen oli tallettamatta.

HUOM: APL ei varoita tallettamattomuudesta, päällekopioinnista tms. – käyttäjähän tietää, mitä tekee!

Työtilaan kopioidaan muista APL-työtiloista objekteja komennolla )COPY ttnimi nimilista. Jos nimilista puuttuu, kopioidaan koko työtila. Työtilassa mahdollisesti olevat samannimiset objektit korvautuvat kopiotyötilan objekteilla. Suojauskopiokomentoa )PCOPY (Protected COPY) käytetään haluttaessa olla varovainen.

Työtilatiedoston voi poistaa komennolla )DROP ttnimi.

Työtilan funktiolistan saa esiin komennolla )FNS (FuNctionS) ja muuttujat komennolla )VARS (VARiableS).

Työtilan objekteja voi poistaa käskyllä )ERASE nimilista.

Tyhjä työtila alustetaan komennolla )CLEAR. Tämä poistaa kaikki objektit ja virhetilanteet muistista.

Työtiloja voidaan järjestelmästä riippuen tallettaa eri kirjastoihin, joihin yleensä viitataan kirjastonumerolla. Eri APL-tulkkien kirjastointitavat poikkeavat toisistaan merkittävästi. IBM:n APL:issä on perinteisesti käytössä kolmen tyyppisiä kirjastoja: julkisia, yksityisiä ja työryhmäkirjastoja.

Esimerkiksi kirjastossa 1 on yleensä työtila UTILITY, joka otetaan käyttöön käskyllä )LOAD 1 UTILITY.

APL-tulkit kykenevät nykyään yleensä käyttämään isäntäkoneensa tiedostojärjestelmää suoraan, jolloin kirjastoviitteiden asemesta voi työtiloihin viitata suoraan hakemistorakenteen mukaisilla nimillä.

APL-istunto lopetetaan enemmittä kyselyittä käskyllä )OFF.

Tiedostojen suoraan käsittelyyn ei perinteisesti ole standardoituja APL-välineitä. IBM-APL:issä tiedostoja (kuten muitakin APL:n ulkopuolisia resursseja) käsitellään yhteismuuttujilla (shared variable). Useissa muissa APL-tulkeissa (mm. APL*PLUS, Dyalog APL, Sharp APL) on tiedostojen käsittelyä helpottavia järjestelmäfunktioita (system function), joilla voidaan suoraan käyttää joko APL-komponenttitiedostoja (component file) tahi muita tiedostoja (native file).

 

Sääntiöt

Sääntiöt (array) on suorakulmaisesti järjestettyjen samantyyppisten alkioiden (homogeeninen) joukko. Sääntiön rakenteen määrittävät sen ulotteisuus (kertaluku, aste) ja koko.

Sääntiön ulotteisuus (rank) on sen ulottuvuuksien (dimensioiden, suuntien) lukumäärä (yleensä enintään 64):

yksiulotteinen sääntiö = vektori (alkiojono; yksi dimensio) (vector)
kaksiulotteinen sääntiö = matriisi (taulukko; kaksi dimensiota) (matrix)
kolmiulotteinen sääntiö = kuutio (kolme dimensiota) (cube, three-dimensional array)
nollaulotteinen sääntiö = skalaari (ei ulottuvuuksia) (scalar).

Sääntiön koolla (koko- eli koordinaattivektorilla) (shape) tarkoitetaan sen alkioiden lukumäärää eri ulottuvuuksien (akseleiden) suunnissa. Jokainen sääntiö on suorakulmainen (ortogonaalinen) eli alkioiden lukumäärä yhdessä suunnassa on riippumaton alkioiden määristä muissa suunnissa.

Esimerkiksi matriisin jokainen rivi on aina yhtä pitkä (eli jokaisella rivillä on sama määrä sarakkeita).

Sääntiön kokovektorin komponentit ilmaisevat sääntiön vastaavien ulottuvuuksien alkioiden lukumäärän. Kokovektorin tuottaa monadinen kokofunktio (½K); sääntiön ulotteisuus = kokovektorin koko (½½K).

Esimerkiksi 2´3´4-matriisin kokovektori on 2 3 4 ja sen ulotteisuus on 3.

Jos jokin kokovektorin alkioista on nolla, on kyseessä tyhjä sääntiö (empty array).

Skalaarin koko on tyhjä vektori ja sen ulotteisuus on = 0.

Yli kaksiulotteiset sääntiöt tulostuvat tasoittain kaksiulotteisina osamatriiseina. Eri ulottuvuustasojen rajalle tulostetaan aina yksi ylimääräinen tyhjä rivi.

Sääntiön alkioiden indeksointi eri ulottuvuuksien suunnassa alkaa yleensä ykkösestä, mutta se voidaan myös muuttaa alkamaan nollasta asettamalla indeksialku-järjestelmämuuttujan ŒIO (Index Origin) arvo nollaksi. Tässä oppaassa indeksointi alkaa kuitenkin aina ykkösestä, ellei erikseen toisin mainita.

Joidenkin funktioiden toimintaan (arvoalueeseen tai tulokseen) vaikuttavat järjestelmämuuttujat ilmaistaan funktioesittelyn otsikossa aaltosuljemerkinnällä, jossa kyseiset järjestelmämuuttujat luetellaan aaltosulkeiden välissä, esimerkiksi {ŒIO}. Lisätietoa järjestelmämuuttujista ja -funktioista esitetään tuonnempana.

 

suuntamerkintä (suunnassa) f[S]X {ŒIO}

Useille funktioille voidaan osoittaa se suunta (axis), jonka mukaan funktio sääntiössä suoritetaan. Suuntamerkintänä käytetään funktiomerkinnän oikealle puolelle sijoitettavia hakasulkeita, joiden väliin haluttu suunta (tai suuntavektori) sijoitetaan. Suunnan lukuarvo riippuu indeksialun arvosta.

Esimerkiksi matriisin M sarakesummat saadaan lausekkeella +/[1]M (tai +/[0]M jos ŒIO„0). Yleensä funktioiden suorituksen oletussuuntana on sääntiön viimeinen ulottuvuus, joten matriisin rivisummat saa joko lausekkeella +/[2]M tahi suoraan +/M.

 

Sekafunktioiden yleiset muodot

Käytetään jatkossa seuraavia merkintöjä ja esimerkkimuuttujia:

S skalaari
V vektori
M matriisi
K kaikki sääntiöt
¸,¾ skalaarifunktioita
„… lausekkeiden vastaavuus (ei APL-ilmaisu)
VEK „… 2 13 7 5 1 (vektori)
MAT „… 3 4½1 2 3 4,5 6 7 8,9 10 11 12 (matriisi)

 

indeksointi K0[K1;..;Kn] {ŒIO}

Indeksoinnin (bracket indexing) tuloksena on sääntiö, joka on koottu K0:n osista indeksisääntiöiden K1..Kn osoittamalla tavalla, missä Ki edustaa K0:n i:nnettä ulottuvuutta. Kunkin indeksin alkioiden sallitut arvot ovat yhdestä K0:n kokovektorin vastaavan alkion arvoon.

Esimerkiksi 2´3-matriisilla toisen indeksin alkioiden tulee olla arvoltaan 1,2 tai 3 (jos ŒIO=0, sallitut arvot ovat 0,1 ja 2). Indeksilausekkeessa tulee olla ¯1+½½K:n verran puolipisteitä eli jokaisen K0:n suunnan indeksointi tulee antaa erikseen.

Jos Ki puuttuu, tarkoitetaan kaikkien i:nnen indeksin sallittujen arvojen muodostamaa vektoria.

Esimerkiksi 2´3-matriisille M: M[1;] „… M[1;1 2 3].

Ki:n alkiot ilmaisevat, missä järjestyksessä K0:n i:nnen suunnan alkioita poimitaan tulossääntiötä luotaessa. Jos Ki on skalaari, puuttuu tulossääntiöstä K0:n i:s suunta; muulloin tulossääntiössä vastaa K0:n i:nnettä ulottuvuutta yhtä monta ulottuvuutta kuin niitä Ki:ssä on. Tuloksen koolle on voimassa:

½K0[K1;..;Kn] „… (½K1),..,½Kn (puuttuvalle Ki:lle: ½Ki „… (½K0)[i]).

VEK[2]

13 © skalaari

VEK[4 3 2 1]

5 7 13 2

'SAMMALIKKO'[²¼6]

LAMMAS

'ABCDEFGHIJKLM'[MAT]
A B C D
E F G H
I J K L
MAT[1 3;3 2 1] © ½MAT[1 3;3 2 1] „… (½1 3),½3 2 1
3   2   1
11   10   9
MAT[1;]

1 2 3 4

MAT[;1] © ½MAT[;1] „… (½1 2 3),½1 „… ,3

1 5 9

MAT[;¼1] © ½MAT[;¼1] „… (½1 2 3),½,1 „… 3 1
1
5
9
½MAT[2 3 4½¼3;5 6 7½¼4]

2 3 4 5 6 7

 

koko (dimensio, muoto) ½K

Kokofunktion (shape) tuloksena on argumentin K koordinaattivektori.

½VEK

5 © „… ,5

½MAT

3 4

0 0½MAT © ei tulostu edes yhtä tyhjää riviä

Skalaariargumentin koko on tyhjä vektori, tyhjälle vektorille tulos on = 0.

½'A' © skalaari!

© „… 0½0

½''

0 © „… ,0

HUOM: Ehkäpä yleisin APL-käyttäjän virhe on sekoittaa yksialkioinen vektori ja skalaari keskenään; kummallakin saattaa olla sama sisältö, mutta eri rakenne (ts. vektori koostuu skalaareista).

 

koonti (kokoa, muotoile) V½K

Koonnin (reshape) tuloksena on sääntiö, jonka kokovektoriksi tulee vasen argumentti V. Tulossääntiön alkiot saadaan toistamalla K:n alkioita riveittäin (viimeinen indeksi vaihtuu nopeimmin) niin monta kertaa, että kukin V:n määrittämistä paikoista on täytetty.

3 4½¼12 © „… MAT
1   2   3   4
5   6   7   8
9   10   11   12

Jos vasempana argumenttina on skalaari, se vektoroidaan ennen koontia.

Œ„A„7½MAT © A „… (,7)½MAT

1 2 3 4 5 6 7

½½A

1

Tyhjällä vektorilla kokoaminen tuottaa skalaarin.

1½VEK © „… (,1)½VEK

2 © „… ,2

''½VEK © „… (¼0)½VEK

2 © skalaari

Miksi skalaarin koko sitten on tyhjä vektori? Tarkastellaan lähemmin sääntiön kokoa ja ulotteisuutta:

A„3 2 1½'W' © ½A „… 0‡3 2 1 „… 3 2 1 ja ½½A „… ,3
A„ 2 1½'W' © ½A „… 1‡3 2 1 „… 2 1 ja ½½A „… ,2
A„ 1½'W' © ½A „… 2‡3 2 1 „… ,1 ja ½½A „… ,1
A„ 'W' © ½A „… 3‡3 2 1 „… ¼0 ja ½½A „… ,0

Skalaarin ulotteisuus (aste) on siis = 0, jolloin vastaavan kokovektorin on oltava tyhjä.

Sääntiön ulotteisuuden voi mieltää vaikkapa geometrisesti: siinä missä kolmi-, kaksi- ja yksiulotteiset sääntiöt vastaavat kuutiota, tasoa ja viivaa, vastaa skalaari yhtä pistettä jolla ei siis ole ulottuvuuksia.

 

otto V†K

Ottofunktion (take) tulossääntiö saadaan ottamalla K:n alkioista ohjausvektorin V osoittama viipale (osasääntiö) mukaan. Kukin V:n alkio ilmaisee, kuinka monta sen suuntaista tasoa K:sta valitaan mukaan.

Positiiviselle V:n alkiolle otetaan tasot alkupäästä ja negatiiviselle loppupäästä. Jos tasoja valitaan enemmän kuin niitä K:ssa on, ajatellaan K:n sisältävän ylimääräisiä tasoja, jotka kaikki ovat K:n tyypin mukaan joko nollia tai välilyöntejä. V:ssä on oltava yhtä monta alkiota kuin K:n kokovektorissa (½V „… ½½K).

2 3†MAT
1 2 3
5 6 7
2 ¯6†MAT
0 0 1 2 3 4
0 0 5 6 7 8
¯7†'ABCD'
      A B C D © alkuun kolme välilyöntiä

 

pudotus (poisto, jättö) V‡K

Pudotusfunktio (drop) toimii kuten ottofunktio, mutta vasen argumentti V ilmaisee nyt pois jätettävät tasot.

¯1 2‡MAT
3 4
7 8
1 1‡¯1 2‡MAT

8

B„2 5 8 12 19 31
(1‡B)-¯1‡B © viereisten alkioiden erotukset

3 3 4 7 12

 

jäsenyys (joukkoon kuuluminen) K1¹K2 {ŒCT}

Jäsenyysfunktion (member of) tuloksena on K1:n muotoinen looginen sääntiö, jonka kunkin alkion arvo on 1, jos vastaava K1:n alkio sisältyy K2:een, muutoin 0.

VEK¹MAT

1 0 1 1 1

MAT¹VEK
1 1 0 0
1 0 1 0
0 0 0 0

 

jonoutus ,K

Jonoutusfunktion (ravel) tuloksena on vektori, jonka alkioina ovat K:n alkiot riveittäin (viimeinen indeksi vaihtuu nopeimmin). Jonoutuksella voi skalaarista tehdä yksialkioisen vektorin.

,MAT

1 2 3 4 5 6 7 8 9 10 11 12

½,'A'

1

 

liitos (kerrostus) K1,[S]K2 K1,K2 {ŒIO}

Liitoksen (catenate) tulossääntiössä on K1:n ja K2:n alkiot liitetty toisiinsa suunnassa S. Argumenttien alkioiden on oltava samaa tyyppiä (lukuja tai merkkejä). Jos K1 on tyhjä, tuloksena on K2 (ja päinvastoin). Jos sekä K1 että K2 ovat enintään vektoreita, on tuloksena vektori, jossa ovat argumenttien alkiot peräkkäin.

VEK,100 200

2 13 7 5 1 100 200

Jos S on kokonaisluku ja argumenteilla on yhtä monta ulottuvuutta, liitos tehdään suunnassa S. Jos S puuttuu, on oletuksena viimeinen ulottuvuus. Tuloksen kokovektorin S:nnen alkion arvo on K1:n ja K2:n S:nsien alkioiden summa, ja kokovektorin muiden alkioiden on oltava molemmilla argumenteilla yhtä suuria.

Esimerkiksi jos ½K1 „… 2 3 5 ja ½K2 „… 2 6 5, on ½K1,[2]K2 „… 2 9 5.

MAT,MAT © ½MAT,MAT „… 3,4+4
1   2   3   4   1   2   3   4
5   6   7   8   5   6   7   8
9   10   11   12   9   10   11   12

Jos S on kokonaisluku ja K1:llä on yksi ulottuvuus vähemmän kuin K2:lla, ajatellaan että K1:een on lisätty uusi ulottuvuus S (kokovektoriin ajatellaan uudeksi S:nneksi komponentiksi luku 1), ja toimitaan kuten edellä.

MAT,10 20 30 © „… MAT,[2]10 20 30
1   2   3   4   10
5   6   7   8   20
9   10   11   12   30

Jos S ei ole kokonaisluku, on argumenttien kokovektorien oltava identtiset. Kumpaankin argumenttiin ajatellaan lisätyksi uusi —S:s ulottuvuus (kokovektoriin tulee —S:s komponentti arvoltaan 1), ja kerrostus (laminate) tehdään tässä uudessa suunnassa.

(10×¼5),[0.1]VEK © „… (1 5½10×¼5),[1]1 5½VEK
10   20   30   40   50
2   13   7   5   1
(¼3),[1.5]10 11 12
1 10
2 11
3 12
(3 1½'OSO'),[2.1]3 1½'NEK'

ON

SE

OK

Jos toinen argumentti on skalaari, voi toinen olla mikä sääntiö tahansa. Liitettäessä skalaari ajatellaan korvatuksi sääntiöllä, jossa on yhtä monta ulottuvuutta kuin toisella argumentilla, kokovektorin kaikki alkiot ovat ykkösiä ja kaikkien alkioiden arvo = kyseisen skalaarin arvo.

0,[1]MAT,100 © „… (1 5½0),[1]MAT,3 1½100
0   0   0   0   0
1   2   3   4   100
5   6   7   8   100
9   10   11   12   100

 

lukusarja ¼S {ŒIO}

Monadinen lukusarjafunktio (interval) tuottaa positiivisesta kokonaisluvusta S vektorin 1..S (tai 0..S-1, jos ŒIO„0). Nolla-argumentilla saa tulokseksi tyhjän vektorin (¼0).

¼4

1 2 3 4

½¼0

0

5-¼4 © „… ²¼4

4 3 2 1

¼1 © „… ŒIO vektorina

1

 

sijainti V¼K {ŒIO ŒCT}

Dyadisen sijaintifunktion (index of) tuloksena on K:n muotoinen sääntiö, jonka kukin alkio ilmaisee K:n vastaavan alkion sijainnin (indeksin) V:ssä. Alkion arvona on (½V)+ŒIO, jollei kyseistä alkiota esiinny V:ssä.

'TASKURAPU'¼'SAKSET'

3 2 4 3 10 1

VEK¼MAT
5 1 6 6
4 6 3 6
6 6 6 6

 

satunnaisluku ?S {ŒIO ŒRL}

Monadinen satunnaislukufunktio (roll) määrittää positiiviselle kokonaisluvulle S satunnaisluvun joukosta ¼S (otanta takaisinpanolla).

Yhden kortin vetoa korttipakasta voisi simuloida vaikka seuraavasti:

('’ª“+'[?4]),'1234567890JQK'[?13]

“Q © ..patarouva tällä kertaa

 

satunnaisotos S1?S2 {ŒIO ŒRL}

Dyadinen satunnaisotosfunktio (deal) tuottaa vektorin, jossa on S1 kappaletta satunnaisia kokonaislukuja joukosta ¼S2 (otanta ilman takaisinpanoa).

S1 ja S2 ovat positiivisia kokonaislukuja ja S1ˆS2.

7?39 © lottonumeroarvonta

1 2 3 4 5 6 7 © ..todennäköisyys aika pieni

?1 © „… ŒIO skalaarina

1

HUOM: Jokainen viittaus ?-satunnaislukufunktioihin muuttaa sivutuotteena myös satunnaislukusiemenjärjestelmämuuttujan ŒRL (Random Link) arvoa.

 

supistus (typistys, tiivistys) V/[S]K V/K VšK

Supistusfunktion (compress) tulossääntiössä ovat mukana oikean argumentin K suunnassa S ne tasot, joita vastaa loogisen vektorin V ykkösalkio. Jos V:n kaikki alkiot ovat nollia, on tuloksena tyhjä sääntiö.

Joko ½V „… (½K)[S] tai sitten V voi olla skalaari, joka ajatellaan toistetuksi riittävän monta kertaa.

Jos suuntaa S ei anneta, on oletuksena viimeinen ulottuvuus (VšK:lle ensimmäinen).

1 0 0 1/MAT © „… 1 0 0 1/[2]MAT „… 1 0 0 1š[2]MAT
1   4
5   8
9   12
0 1 0šMAT © „… 0 1 0/[1]MAT

5 6 7 8

Œ„A„'LASCIATE OGNI SPERANZA, VOI CH''ENTRATE'

LASCIATE OGNI SPERANZA, VOI CH'ENTRATE

(A¹' ''')/¼½A © kiinnostavien merkkien indeksit

9 14 24 28 31

N„¼12
(2|N)/N © parillisten lukujen poisto vektorista

1 3 5 7 9 11

 

lavennus (harvennus) V\[S]K V\K V™K

Lavennuksen (expand) tuloksena on sääntiö, jossa K:hon on lisätty sen S:nnessä suunnassa ylimääräisiä pelkkiä nollia tai välilyöntejä sisältävä taso jokaista loogisen vektorin V nolla-alkiota kohden.

Edellytetään että +/V „… (½K)[S] (ei skalaarilaajennusta).

Jos suuntaa S ei anneta, on oletuksena viimeinen ulottuvuus (V™K:lle ensimmäinen).

(17½1 0)\'HARVENNUS'

H A R V E N N U S

1 0 1 1™MAT © „… 1 0 1 1\[1]MAT „… 1 0 1 1™[1]MAT
1   2   3   4
0   0   0   0
5   6   7   8
9   10   11   12

Lavennusfunktiota voi käyttää tietotyypin tutkintaan:

0\¼0 © argumentti saa olla tyhjä vektori:

0 © numeerinen -> 0

0\''
  © merkkitietoa -> ' '
0=0\0½'TEKSTIÄ' © => teksti- tai numerotiedon

0

0=0\0½MAT © tyyppitarkastus!

1

Tyyppitarkastuksen voi yhtä hyvin tehdä myös ottofunktion avulla:

0=1†0½'TEKSTIÄ'

0

0=1†0½MAT

1

 

nousuindeksi “V {ŒIO}

Monadisen nousuindeksin (grade up) tuloksena on vektori, jossa numeerisen argumenttivektorin V indeksit ovat sen alkioiden mukaisessa nousevassa suuruusjärjestyksessä.

“VEK

5 1 4 3 2

VEK[“VEK]

1 2 5 7 13

A„27 4 ¯1 2 15 2
““A © nousevat sijaluvut

6 4 1 2 5 3

 

laskuindeksi ”V {ŒIO}

Laskuindeksi (grade down) toimii kuten nousuindeksi, mutta suuruusjärjestys on nyt laskeva.

”VEK

2 3 4 1 5

VEK[”VEK]

13 7 5 2 1

A„27 4 ¯1 2 15 2
“”A © laskevat sijaluvut

1 3 6 4 2 5

 

heijastus (peilaus) ²[S]K ²K ´K

Heijastusfunktion (reverse) tulossääntiössä ovat K:n tasot S:nnessä suunnassa päinvastaisessa järjestyksessä kuin K:ssa. Jos suuntaa S ei ole annettu, on oletuksena viimeinen ulottuvuus (´K:lle ensimmäinen).

²MAT © „… ²[2]MAT „… ´[2]MAT
4   3   2   1
8   7   6   5
12   11   10   9
´MAT © „… ²[1]MAT „… ´[1]MAT
9   10   11   12
5   6   7   8
1   2   3   4
Œ„M„4 4½'OSATTULOOLATTASO'
O S A T
T U L O
O L A T
T A S O
²M
T A S O
O L U T
T A L O
O S A T
´M
T A S O
O L A T
T U L O
O S A T

 

kierto K1²[S]K2 K1²K2 K1´K2

Dyadisen kiertofunktion (rotate) tuloksena on K2:n muotoinen sääntiö, jossa kutakin S:nnen ulottuvuuden suuntaista osavektoria on kierretty kokonaislukusääntiön K1 vastaavan alkion määräämien positioiden verran. Jos suunta S puuttuu, on oletuksena viimeinen ulottuvuus (K1´K2:lle ensimmäinen).

Positiiviset K1:n alkiot kierrättävät vastaavaa tasoa origoon päin, negatiiviset origosta pois päin.

Jos K2:n kokovektorista poistetaan S:s alkio, saatu vektori on identtinen K1:n kokovektorin kanssa Esimerkiksi jos ½K1 „… 5 3 4 ja S„2, on oltava ½K2 „… 5 4.

Skalaari K1 tulkitaan sopivan muotoiseksi sääntiöksi, jonka kaikkien alkioiden arvo = skalaarin arvo.

1²VEK © „… ¯4²VEK

13 7 5 1 2

M„4 4½'OSATTULOOLATTASO'
1²M
S A T O
U L O T
L A T O
A S O T
1 3 2 4´M
T A A T
O S S O
T U A T
O L L O
¯1 0 1 2´MAT © „… ¯1 0 1 2²[1]MAT
9   2   7   12
1   6   11   4
5   10   3   8
Œ„B„2 3 5½¼30
1   2   3   4   5
6   7   8   9   10
11   12   13   14   15
                 
16   17   18   19   20
21   22   23   24   25
26   27   28   29   30
1²[1]B © „… 1´B
 
16   17   18   19   20
21   22   23   24   25
26   27   28   29   30
                 
1   2   3   4   5
6   7   8   9   10
11   12   13   14   15
Œ„C„2 3½¼6
1 2 3
4 5 6
C²[3]B © „… C²B „… C´[3]B

 

2   3   4   5   1
8   9   10   6   7
14   15   11   12   13
                 
20   16   17   18   19
21   22   23   24   25
27   28   29   30   26

 

muotoilu (tulostusasu) •K {ŒPP}

Monadinen muotoilufunktio (format, thorn) muuttaa argumenttinsa samanlaiseksi tekstisääntiöksi kuin millaisena tämä tulostuisi ruudulle.

Tulossääntiölle on voimassa: ½½•K „… ,1—½½K.

N„2 2 5½0.1×¼20
Œ„•N
0.1   0.2   0.3   0.4   0.5
0.6   0.7   0.8   0.9   1
1.1   1.2   1.3   1.4   1.5
1.6   1.7   1.8   1.9   2
½•N

2 2 19

Muotoilun avulla voi tulosteessa esittää sekä tekstiä että numeerista dataa yhdessä.

'PII = ',•±1

PII = 3.141592654

 

esimerkkimuotoilu V•K {ŒPP}

Dyadisen muotoilufunktion (format by specification) vasempana argumenttina on yksi tai useampi sääntiön viimeisen suunnan (sarakkeiden) muotoilua ohjaava lukupari. Lukuparit liittyvät oikean argumentin lukuihin siten, että parin edellinen jäsen tarkoittaa kirjoitustilan leveyttä ja jälkimmäinen desimaalien määrää.

Selkeyden vuoksi välilyönnit osoitetaan seuraavissa esimerkeissä alaviivalla ( _ ).

A„12.34 ¯23.456 1 ¯345.6789
4 1 6 0 7 2 8 3•A

12.3 _ _ _¯23 _ _ _1.00¯345.679

Jos lukuparin ensimmäinen jäsen on nolla, valitaan sellainen kirjoitustila, jolla luku ei kosketa naapuriin.

6 1 0 0 0 2 0 3•A

_ _ 12.3 _¯23 _ 1.00_¯345.679

Jos vasempana argumenttina on vain yksi lukupari, se käsitetään kaikille yhteiseksi.

8 1•A

_ _ _ _ 12.3_ _ _ ¯23.5 _ _ _ _ _ 1.0_ _¯345.7

Yhteisen lukuparin ensimmäinen voidaan jättää kirjoittamatta, jolloin se tulkitaan nollaksi.

1•A

_ 12.3_ ¯23.5 _ 1.0_ ¯345.7

Eksponenttimuotoinen (skaalattu) tulostus saadaan antamalla desimaalien lukumäärä negatiivisena. Desimaalien itseisarvo osoittaa tulostustarkkuuden (merkitsevien numeroiden lukumäärän).

10 ¯4•A

_ 1.234E1 _ _¯2.346E1_ _ _1.000E0_ _ ¯3.457E2_ _

 

suoritus –V

Monadinen suoritusfunktio (execute) poistaa vektori- tai skalaariargumentiltaan tekstitieto-ominaisuuden.

–A„'5+3' © „… –'5+3'

8

–A,'×',A © „… –'5+3×5+3'

29

M„2 4½'5 3','2 ¯1'
–,M,' ' © tekstimatriisista numerovektori

5 3 2 ¯1

Tyhjän vektorin suoritus ei palauta tulosta, joten suoritusfunktiota voi käyttää supistusfunktion kanssa jos-niin -ehtolausekkeen (if-then) tavoin.

–''
 
–(1<0)/'1+1' © ehtolauseke, ei suoriteta
 
–(1^1)/'2+2' © ehtolauseke, suoritetaan

4

 

transponointi (käännös) ³K

Transponoinnin (transpose) tulossääntiössä K:n koordinaatit on käännetty päinvastaiseen järjestykseen.

³MAT © ½³MAT „… 4 3
1   5   9
2   6   10
3   7   11
4   8   12
³4 4½'OSATTULOOLATTASO'
O T O T
S U L A
A L A S
T O T O

 

koordinaattien vaihto V³K {ŒIO}

Koordinaattien vaihdon (dyadic transpose) tulossääntiössä on K:n kokovektorin indeksien järjestystä muutettu kokonaislukuvektorilla V ohjaten. V:n alkiot (½V „… ½½K) määräävät, monenneksiko tulossääntiön suunnaksi K:n suunnat tulevat. V:n alkiot voivat olla keskenään identtisiä, jolloin tulokseen tulevat vain näin määritellyt diagonaalialkiot (½½V³K „… —/V).

Toisistaan poikkeavien V:n alkioiden tulee sisältää kaikki kokonaislukusarjan ¼—/V luvut.

Transponoinnin ja koordinaattien vaihdon välillä on yhteys: ³K „… (²¼½½K)³K.

Esimerkiksi jos A on 2´3´4-sääntiö ja Z„2 3 1³A, niin Z[I;J;K] „… A[J;K;I]

ja jos Z„1 2 1³A, niin Z[I;J] „… A[I;J;I].

2 1³MAT © „… ³MAT
1   5   9
2   6   10
3   7   11
4   8   12
1 1³MAT © „… MAT[1;1],MAT[2;2],MAT[3;3]

1 6 11

 

koodin avaus (tulkinta koodina) K1ƒK2

Koodin avauksen (decode, base) tuloksena on K1:n määrittämässä kannassa esitetyn K2:n arvo kymmenjärjestelmässä. Jokainen K1:n viimeisen ulottuvuuden suuntainen vektori määrittää kannan eli ne luvut, joilla painotettuina kunkin K2:n ensimmäisen ulottuvuuden suuntaisten vektorien alkiot lasketaan yhteen yksittäiseksi tulossääntiön alkion arvoksi.

Edellytetään, että ¯1†½K1 „… 1†½K2. Jos K1:n viimeinen (tai K2:n ensimmäinen) ulottuvuus on = 1, se ajatellaan laajennetuksi vaadittavaan muotoon. Skalaariargumentti laajennetaan samalla tavoin.

Tulossääntiön kokovektori on muotoa (¯1‡½K1),1‡½K2.

10ƒ1 9 7 5 © „… 10 10 10 10ƒ1 9 7 5

1975

0 24 60ƒ1 2 3 © yksi vrk, 2h ja 3min minuutteina

1563 © (1×24×60)+(2×60)+3

Huomaa, että nolla toimi tässä pituuden täytealkiona, koodin avauksessa sitä ei itse asiassa tarvittu!

100ƒ²19 10 1998

19981019 © päiväysvektorin koodaus yhdeksi luvuksi

(2 3½¼6)ƒ3 5½¼15
35   45   55   65   75 © esim. 188 „… (4×5×6)+(9×6)+14
77   114   151   188   225  
A„3 2½'07','0A','FF'
16ƒ¯1+'0123456789ABCDEF'¼³A

7 10 255 © heksadesimaaliluvut desimaalisiksi

 

koodaus (esitys koodina) K1‚K2

Koodauksen (encode) tuloksena on K2:n esitys K1:n määrittämässä kannassa. Kukin K1:n viimeisen ulottuvuuden suuntainen vektori määrittää sen kannan, johon K2:n alkiot muunnetaan.

Tulossääntiön alkioiden arvot syntyvät lopusta alkuun jakojäännöksinä, ja ne ovat aina pienempiä kuin vastaavat koodivektorin alkiot. Koodatulla alkiolla on yhtä monta alkiota kuin K1:n viimeisellä ulottuvuudella, merkitsevämpiä alkioita ei oteta huomioon. Tulossääntiön kokovektori on muotoa (½K1),½K2.

2 2 2 2‚9

1 0 0 1

Nollalla koodaus antaa alkuperäisen luvun tai sen, mitä siitä on jäljellä.

0‚521

521

0 24 60‚1563

1 2 3

³0 100 100‚19981012 19800101 19590406
1998   10   12 © VVVVKKPP-muotoisten päiväysten pilkonta
1980   1   1  
1959   4   6  
³'0123456789ABCDEF'[1+16 16‚7 10 255]
07 © desimaaliluvut (<256) heksadesimaalisiksi
0A  
FF  

 

käänteismatriisi (domino) ŽM

Monadisen dominofunktion (matrix inverse) tuloksena on kaksiulotteisen matriisin M (vasen) käänteismatriisi. Matriisin M sarakkeiden on oltava toisistaan lineaarisesti riippumattomia.

Jos M on vektori, se tulkitaan yksisarakkeiseksi matriisiksi; skalaari tulkitaan 1´1-matriisiksi.

Œ„C„3 3½1 2 1,3 4 7,1 0 3
1 2 1
3 4 7
1 0 3
ŽC
3   ¯1.5   2.5
¯0.5   0.5   ¯1
¯1   0.5   ¯0.5
Ž5 © „… ÷5

0.2

(ŽM)+.×M „… yksikkömatriisi mahdollisin pyöristysvirhein (+.× on matriisitulo).

(ŽC)+.×C © ks. sisätulo-operaattori
1 0 0
0 1 0
0 0 1

 

yhtälöryhmän ratkaisu (matriisijako) M1ŽM2

Dyadisen dominofunktion (matrix divide) tuloksena on yhtälöryhmän/ryhmien M1=M2+.×X ratkaisu pienimmän neliösumman menetelmällä. M2:n sarakkeiden on oltava lineaarisesti riippumattomia ja kummallakin argumentilla on oltava yhtä monta riviä (¯1†½M1 „… ¯1†½M2).

Esimerkiksi yhtälöryhmä C+.×X1,X2,X3 = 1 1 0, eli

1×X1 + 2×X2 + 1×X3 = 1
3×X1 + 4×X2 + 7×X3 = 1
1×X1 + 0×X2 + 3×X3 = 0

voidaan ratkaista lausekkeella (poistetaan pyöristysvirheet muotoilemalla tulos yhdellä desimaalilla):

1•1 1 0ŽC

1.5 0.0 ¯0.5

Siis X1=1.5 , X2=0 ja X3=¯0.5.

Usean yhtälöryhmän samanaikainen ratkaisu sujuu myös:

Œ„B„³4 3½1 1 0,0 5 5,3 3 ¯1,2 3 2
1   0   3   2
1   5   3   3
0   5   ¯1   2
1•BŽC
1.5   5.0   2.0   6.5
0.0   ¯2.5   1.0   ¯1.5
¯0.5   0.0   ¯1.0   ¯1.5

 

Operaattorit

Operaattorit vaikuttavat operandifunktioidensa suoritustapaan siten, että syntyy uusia (johdannais)funktioita.

 

pelkiste (reduktio) ¸/[S]K ¸/K ¸šK

Pelkistysoperaation (reduce, reduction) tuloksena on sääntiö, jossa K:n S:nnen suunnan vektorit on korvattu skalaareilla. Kunkin skalaarin arvo saadaan laskutoimituksesta, joka syntyy merkitsemällä vastaavan vektorin alkioväleihin funktiomerkintä ¸. Johdannaisfunktion argumentti K on numeerinen paitsi funktioilla = ja ¬.

Jos (½K)[S] „… 1, ei laskutoimitusta suoriteta. Jos suuntaa S ei anneta, on oletuksena viimeinen ulottuvuus (¸šK:lle ensimmäinen).

×/VEK © „… 2×13×7×5×1

910

Ÿ/0 1 1 0

1

+/MAT © „… +/[2]MAT „… +š[2]MAT

10 26 42

+šMAT © „… +/[1]MAT „… +š[1]MAT

15 18 21 24

Tyhjälle argumentille ¸/K palauttaa pelkistefunktion identtisyysalkion, joka funktion argumenttina ollessaan antaa tulokseksi toisen argumentin tai tällaisen puuttuessa virheilmoituksen.

×/¼0 © X „… X×1

1

-/¼0 © X „… X-0

0

*/¼0 © X „… X*1

1

µ/12345

12345

µ/¼0

DOMAIN ERROR © määrittelyaluevirhe

 

selaus (kertymä, kumulointi) ¸\[S]K ¸\K ¸™K

Selausoperaation (scan) tuloksena on K:n muotoinen sääntiö, jonka kukin alkio edustaa vastaavaa pelkistettä sille K:n osasääntiölle, jolla suunnassa S ovat alkiot vain tähän alkioon saakka. Jos ulottuvuutta S ei anneta, on oletuksena viimeinen suunta (¸™K:lle ensimmäinen).

×\VEK

2 26 182 910 910

Ÿ\0 1 1 0 1 1 © ensimmäisen ykkösen jälkeiset ykkösiksi

0 1 1 1 1 1

<\0 1 1 0 1 1 © vain ensimmäinen ykkönen

0 1 0 0 0 0

¬\0 1 1 0 1 1 © juokseva pariteetti :)

0 1 0 0 1 0

+™MAT © „… +\[1]MAT „… +™[1]MAT
1   2   3   4
6   8   10   12
15   18   21   24

 

ulkotulo (taulukko) K1°.¾K2

Ulkotulon (outer product) tulossääntiössä on alkio kutakin K1:n ja K2:n alkioiden muodostamaa paria kohden. Tulosalkion arvo saadaan suorittamalla parin alkioiden välillä funktio ¾.

Tuloksen kokovektori on muotoa (½K1),½K2. Tulossääntiön alkioille on voimassa identiteetti:

(K1°.¾K2)[G;..;H;I;..;J] „… K1[G;..;H] ¾ K2[I;..;J].

(¼5)°.×¼6 © kertotaulu
1   2   3   4   5   6
2   4   6   8   10   12
3   6   9   12   15   18
4   8   12   16   20   24
5   10   15   20   25   30
(¼4)°.‰¼4 © alakolmiomatriisi
1 0 0 0
1 1 0 0
1 1 1 0
1 1 1 1
3•÷(¼5)°.+¼5 © 5x5-Hilbert-matriisi
0.500   0.333   0.250   0.200   0.167
0.333   0.250   0.200   0.167   0.143
0.250   0.200   0.167   0.143   0.125
0.200   0.167   0.143   0.125   0.111
0.167   0.143   0.125   0.111   0.100

 

sisätulo (yhdiste) K1¸.¾K2

Sisätulon (inner product) tulossääntiössä kutakin K1:n viimeisen ja K2:n ensimmäisen ulottuvuuden suuntaista vektoriparia V1,V2 vastaa tulossääntiössä alkio, jonka arvo on ¸/V1¾V2.

Funktion ¾ argumenteiksi tulevissa vektoreissa on oltava yhtä monta alkiota. Jos sisätulon toisena argumenttina on vain yksi alkio, sitä toistetaan tarvittaessa skalaarilaajennussäännön mukaan.

Tuloksen kokovektori on muotoa (¯1‡½K1),1‡½K2. Tulossääntiölle on voimassa identiteetti:

(K1¸.¾K2)[G;..;H;I;..;J] „… ¸/K1[G;..;H;] ¾ K2[;I;..;J].

Œ„A„3 3½'OLIISOILO'
O L I
I S O
I L O
A^.='ISO'

0 1 0

Œ„B„³7 3½'UNIASUOLOELIISOOMAILO'
U A O E I O I
N S L L S M L
I U O I O A O
A^.=B
0 0 0 0 0 0 0
0 0 0 0 1 0 0
0 0 0 0 0 0 1

Tavanomaista matriisikertolaskua vastaa sisätulo M1+.×M2.

E+.×2 3 5 7 © esim. 51 „… +/1 2 3 4 × 2 3 5 7

51 119 187

 

Järjestelmämuuttujia ja -funktioita

APL:n järjestelmämuuttujien ja -funktioiden nimet alkavat Œ-merkillä.

järjestelmämuuttujia:

ŒAI (Account Information)

Käyttömäärävektori: käyttäjätunnus, kertyneet CPU- ja yhteysajat millisekunteina.

ŒAV (Atomic Vector)

Koodivektori: käytettävissä olevien merkkien muodostama vektori (½ŒAV „… 256).

ŒCT (Comparison Tolerance)

Vertailutarkkuus: oletusarvo 10E¯13, sallitut arvot 0..1.
Vertailtavat ovat yhtä suuria, jos (ŒCT×—/|X,Y)‰|X-Y.
Vaikuttaa perusfunktioihin: — ˜ < > = ¬ ˆ ‰ ¼ ¹.

ŒIO (Index Origin)

Indeksialku (indeksien alin arvo): oletusarvo 1, sallitut arvot 0 ja 1.
Vaikuttaa perusfunktioihin: ¼ “ ” ³ ? sekä indeksointiin ja funktioiden suoritussuuntaan [].

ŒLC (Line Counter)

Suoritettavan ohjelman/ohjelmien rivinumero(t).

ŒLX (Latent Expression)

Työtilan latauksessa suoritettava APL-lauseke tekstivektorina; oletusarvo ''.

ŒPP (Printing Precision)

Tulostustarkkuus (tulostuksessa käytettävien desimaalien määrä): oletusarvo 10, sallitut arvot 1..16.
Vaikuttaa istuntoon tulostukseen Πja muotoilufunktioon .

ŒPW (Printing Width)

Tulostusalueen leveys: oletusarvo 80, sallitut arvot 20..255.
Vaikuttaa istuntoon tulostukseen Œ.

ŒRL (Random Link)

Satunnaislukusiemen ?-funktioille.
Tyhjän työtilan alkuarvo on 16807 („… 7*5).
Jokainen viittaus satunnaislukufunktioihin muuttaa aina ŒRL:n arvoa.

ŒTS (Time Stamp)

Aikaleimavektori: vuosi, kuukausi, päivä, tunti, minuutti, sekunti, millisekunti.

ŒWA (Workspace Available)

Vapaan työtilan koko tavuina.

 

järjestelmäfunktioita:

ŒCR (Canonical Representation)

Merkkiesitys: tekstiargumentin funktionnimeä vastaava merkkimatriisi.

ŒDL (Delay)

Aiheuttaa skalaariargumenttinsa mittaisen sekuntiviipeen, palauttaa tarkan suoritusaika-arvon.

ŒEX (Expunge)

Poistaa argumenttinsa (merkkimatriisi tai -vektori) ilmaisemat objektit työtilasta.

ŒFX (Function Establishment)

Aktivointi: muuttaa argumenttitekstimatriisin funktioksi.

ŒNC (Name Classification)

Nimiluokka: kertoo argumenttinsa (merkkimatriisi tai -vektori) objektiluokan (0/1/2/3 = ei käytössä/riviosoite/muuttuja/funktio).

ŒNL (Name List)

Nimiluettelo.
Oikea argumenttiskalaari/vektori ilmaisee sen objektiluokan, josta etsitään (1= riviosoitteet, 2 = muuttujat ja 3 = funktiot).
Mahdollinen vasen argumentti ilmaisee millä kirjaimilla alkaviin nimiin rajoitutaan.

 

Järjestelmäkomentoja

APL:n järjestelmäkomentorivi alkaa aina oikealla sulkeella. Komentorivillä ei saa olla muuta koodia kuin kyseinen komento parametreineen.

)CLEAR

Työtilan tyhjennys kaikista objekteista ja virhetilapinosta, nimeksi tulee CLEAR WS (vaihdettava ennen tallettamista).

)COPY ttnimi {obj1 obj2 ..}

Kopioi työtilaan työtilan ttnimi sisältö, tai jos objektilista obj1,.. on annettu, kopioi vain nämä.

)DROP ttnimi

Poista työtilatiedosto ttnimi.
Nimi on annettava täydellisenä.

)ERASE obj1 obj2 ..

Poista työtilasta objektit obj1,.. .

)FNS {C}

Listaa työtilan funktiot (jotka alkavat kirjaimilla C..'Z').

)LIB {ttlib}

Listaa kirjaston ttlib työtilat (oletus = käynnistyskirjasto).

)LOAD ttnimi

Työtilan ttnimi lataus muistiin (työtilassa olevat tiedot menetetään).

)OFF

Istunnon päättäminen.
Ei varmistuskyselyjä, muista tallettaa työsi!

)PCOPY ttnimi {obj1 obj2 ..}

Kuten )COPY, mutta kopioidaan vain ne objektit, joiden nimiä ei ole aktiivisessa työtilassa käytössä (Protected COPY).

)RESET

Siivoa virhetilapino.

)SAVE {ttnimi}

Työtilan talletus joko entisellä nimellä tai uudelle nimelle ttnimi.

)SI

Virhetilailmaisimen sisältö.

)VARS {C}

Listaa työtilan muuttujat (jotka alkavat kirjaimilla C..'Z').

)WSID {ttnimi}

Työtilan täysnimen tiedustelu tai asetus nimelle ttnimi.
HUOM: Järjestelmäkomentoja voi antaa vain istunnossa, ohjelmallisesti näiden käyttö ei (yleensä) ole mahdollista.

 

Idiomeja

APL-ohjelmoinnissa usein käytettäviä tiettyyn toimintoon sopivia funktioilmaisuja kutsutaan idiomeiksi. Seuraavassa on muutama lyhyehkö tarpeellinen idiomi (ŒIO=1):

0¹1†0½V © onko vektori numeerinen?
^/(¼½V)¹V © onko vektori permutaatiovektori?
^/,K=1½K © ovatko sääntiön kaikki alkiot samoja?
˜K+0.5 © pyöristys lähimpään kokonaislukuun
(K2¬0)×K1÷K2+K2=0 © palauta nollalla jaettaessa nolla
0ƒV © lukuvektorin viimeinen luku skalaarina
1ƒV © lukuvektorin summa
((1+˜10µS)½10)‚S © kokonaislukuskalaari numeroiksi
0 1‚K © luvun (>0) kokonais- ja desimaaliosat
V°.+,0 © numeerisesta vektorista pystymatriisi
(+/V)÷½V © aritmeettinen keskiarvo
(×/V)*÷½V © geometrinen keskiarvo
(½V)÷+/÷V © harmoninen keskiarvo
V[(“V)[—0.5×½V]] © mediaani (keskeisarvo)
=š0=400 100 4°.|K © ovatko vuodet K (vvvv) karkausvuosia?
³0 100 100‚K © päiväyksen VVVVKKPP pilkonta osiin VVVV KK PP
K×±÷180 © kulman muunto asteista radiaaneiksi
K×180÷±1 © kulman muunto radiaaneista asteiksi
!X-1 © gammafunktio G(X)
÷Y×(X-1)!Y+X-1 © beetafunktio B(X,Y)
÷Y×(X-1)!Y+X-1 © lausekkeen (X,Y)N binomikertoimet
(2=+š0=(¼S)°.|¼S)/¼S © alkuluvut lukuun S asti
-\¼S © vuorotteleva sarja 1 ¯1 2 ¯2 3 ¯3..
W[1++\(¼+/V)¹1++\V] © vektori (V[1]½W[1]),(V[2]½W[2]),..
A´((A„¼S)-—S÷2)²(S,S)½¼S×S © S´S-taikaneliö (S pariton ja >2)
…—¼B © loogisesta ehdosta B riippuva hyppy osoitteeseen 
…0˜¼B © loogisesta ehdosta B riippuva hyppy pois ohjelmasta
–B/'LAUSEKE' © loogisesta ehdosta B riippuva lausekkeen suoritus
(V,W)[““B] © vektoreiden lomitus bittivektorin B ohjaamana
(½V)‰“(¼½V),I © lavennusvektori, jossa nollia indeksien I jälkeen
1/K © skalaari yksialkioiseksi vektoriksi
(¯2†1 1,½M)½M © skalaarin/vektorin muunto matriisiksi
((×/¯1‡½K),¯1†1,½K)½K © sääntiön muunto matriisiksi
((V¼V)=¼½V)/V © toisintoalkioiden poisto vektorista
(V¹K)\(V¹K)/V © halutut alkiot nolliksi/väleiksi
(-+/^\²M=' ')²M © merkkisääntiön tasaus oikealle
(+/^\M=' ')²M © merkkisääntiön tasaus vasempaan
(-˜0.5×+/^\²M=' ')²M © merkkisääntiön keskitys
(V¬' ')/V © välilyöntien poisto vektorista
V>¯1‡0,V © ykkösryhmien alkuykköset
V>1‡V,0 © ykkösryhmien loppuykköset
(1-(V=' ')ƒ1)‡V © vektorin loppuvälilyöntien poisto
(Ÿ\V¬' ')/V © vektorin alkuvälilyöntien poisto
((²Ÿ\²A)^Ÿ/A„V¬' ')/V © vektorin päissä olevien välien poisto
(AŸ1²A„V¬' ')/V © vektorin perättäisten välien tiivistys
1+(½V)-(V¬' ')ƒ1 © vektorin viimeisen välilyönnin indeksi
(¯1²1‡(Ÿ/M¬¯1´M),1)šM © järjestetyn matriisin uniikkirivit
(~A¹1,½V)/A„A/¼½A„(1‡A,0)<A„~V¹'aeiouyäö' © suomenkielisen sanan tavutuskohdat.

 

 

2. APL2

 

APL:n laajennusperiaatteet

APL:n tultua yleiseen käyttöön 70-luvulla sen kehitys ei suinkaan jäänyt paikoilleen. Innostuneen käyttäjäkunnan kehitysehdotukset, erityisesti vuosittaisissa APL-konferensseissa esille tuodut, saivat eri tuotevalmistajat lisäilemään uusia ominaisuuksia omiin tulkkeihinsa. Muun muassa epäsäännöllisen datan (esimerkiksi henkilötietojen) käsittely oli tehtävä usein mutkikkaiden vippaskonstien avulla; niinpä jo varhain alettiin hahmotella ns. toisen sukupolven APL:n ominaisuuksia.

Eri tuotevalmistajat tekivät omia laajennuksiaan niin, että yhtenäisen kielen asemesta julkistettiin joukko enemmän tai vähemmän yhteensopivia toisen sukupolven APL-murteita. IBM:n julkistettua 1982 oman APL2:ksi nimetyn kielensä on kehitys onneksi vienyt siihen, että nykyään kaikki aktiiviset tuotevalmistajat pyrkivät tekemään tuotteistaan kielitasolla mahdollisimman APL2-yhteensopivia.

APL2 on ainoa toisen sukupolven APL-laajennus, jota tässä oppaassa käsitellään.

APL:n perusominaisuudet voidaan kiteyttää seuraavasti:

dataa (tietoa) käsitellään sääntiöinä
APL:n sääntiö on suorakulmaisesti järjestettyjen samantyyppisten alkioiden joukko
datan esitys moniulotteisena sääntiönä kontrolloi myös itse laskennan suoritusta
funktiot käsittelevät argumentteinaan sääntiöitä, niiden tuloksena on uusia sääntiöitä
operaattorit käsittelevät operandeinaan skalaarifunktioita ja tuottavat näin uusia funktioita
notaatiosyntaksi on yksinkertainen (ei monimutkaisia hierarkioita yms.)
funktioiden suoritusjärjestys riippuu vain niiden sijainnista suoritettavassa lausekkeessa
kaikki luvut ovat reaalilukuja, käyttäjän ei tarvitse operoida eri esitystapojen kanssa.

APL2:n tavoitteena oli laajentaa perus-APL:stä ("APL1:stä") kieli, joka olisi tehokas, luotettava ja muodollisesti eheä. Sen tärkeimpiä lisäominaisuuksia ovat:

kielen turhien rajoitusten poisto tai huomattava lievennys
APL-ilmaisujen jako syntaksiluokkiin
numeerisen ja merkkidatan esitys samassa sääntiössä; sääntiö on tyyppirajoitukseton - kaikki luvut ovat kompleksilukuja (reaalilukujen imaginaariosa = 0)
uusi sääntiöominaisuus, sisäkkäisyys, sallii epäsäännöllisen datan käsittelyn
jokainen (argumentillinen) funktio on ambivalentti (joko yksi- tai kaksiargumenttinen)
APL2:n operaattoreiden operandeina voi olla mikä tahansa ei-niladinen funktio
omien operaattoreiden määrittely on mahdollista
useiden funktioiden toimintoja on laajennettu
mukana uusia funktioita ja operaattoreita
virhetilanteiden ohjelmallinen hallinta.

APL2:n toteutuksessa oli kyse tärkeiksi katsottujen tekijöiden välisestä tasapainosta. Suunnittelukriteereistä tärkeimpinä pidettiin mahdollisimman suurta APL1-yhteensopivuutta sekä yksinkertaisuus-, säännönmukaisuus- ja käytettävyysnäkökohtia. Kielen uusien ominaisuuksien kehittelyssä osoittautui erittäin tärkeäksi sopivien identiteettien käyttö (mm. ½M[I;J] „… (½I),½J ja ½Y °.¸ X „… (½Y),½X).

Seuraavissa kappaleissa käydään pääpiirteissään läpi keskeisiä APL2-kielen kehityssuuntaviivoja ja käsitteitä. Tiettyä teoreettista otetta ei voi välttää, mutta satunnainen lueskelija voinee pikaselauksen jälkeen siirtyä suoraan funktioiden ja operaattoreiden kuvausosaan. Teoriaosuuden tekstien pääosa perustuu APL2:n kehitysryhmän johtajan James A. Brownin teksteihin, erityisesti The Principles of APL2 -julkaisuun.

 

Syntaksiluokat

APL2:n symbolit ja nimet jaetaan kuuteen syntaksiluokkaan:

sääntiöt (data, muuttujat, subjektit)
funktiot (ohjelmat, verbit)
monadiset operaattorit (adverbit)
dyadiset operaattorit (adverbit)
sijoitusnuoli (kopula)
hakasulkeet (kameleonttioperaatio).
HUOM: Niladinen (argumentiton) arvon palauttava funktio on tulkittavissa vakioksi, ja näin ollen se kuuluu sääntiöiden kanssa samaan syntaksiluokkaan.

 

APL2:n lausekeluokat ja sidoshierarkia

APL2-kielessä käytetään vain APL2-lausekkeita.
APL2-lauseke koostuu yhdestä tai useammasta APL2-ilmaisuista (alilausekkeista).
APL2-ilmaisu on aina joko sääntiö-, funktio- tahi operaattori-ilmaisu.

sääntiöilmaisut

APL2-sääntiöilmaisu on aina yksirivinen vektori-ilmaisu. Vektori muodostetaan kirjoittamalla vektorin skalaarit vierekkäin välilyönneillä eroteltuina. APL2 sallii sekatyyppisen datan (numeerisen ja merkkidatan) käsittelyn samassa vektorissa.

      1 2 3 4 5 © numeerinen vektori, pituus = 5
      2 'B' 5 7.1 © sekavektori, pituus = 4
      'A' 'B' 'C' © merkkivektori, pituus = 3

Vierekkäisillä välilyönnein erotetuilla sääntiöillä (tavallisesti skalaareilla) on keskenään vektorisidos.

Esimerkiksi I J on vektori, jonka muodostavat alkiot I ja J niiden omasta sisäisestä rakenteesta riippumatta.

 

funktioilmaisut

Kaikki APL2-funktiot ovat ambivalentteja, sekä monadisia että dyadisia, ja niiden käyttötapa riippuu vain funktiokutsusta. Funktion argumenteilla on funktioonsa oikean ja vasemman argumentin sidos.

Funktioilla ei ole keskinäistä hierarkiaa, suoritusjärjestys riippuu vain funktioiden sijainnista lausekkeessa.

Symboleja ° ja käsitellään syntaktisesti funktioina.

Funktiolausekkeen 2×3+4 tulkinnassa on kaksi eri vaihtoehtoa: kolmonen on ensisijaisesti joko kertolaskun oikea argumentti: (2×3)+4 tai yhteenlaskun vasen argumentti: 2×(3+4).

APL1:ssä funktiot suoritetaan oikealta vasempaan, joten jälkimmäinen tulkintatapa asetetaan etusijalle. Vasemman argumentin sidos on oikean argumentin sidosta vahvempi.

Vektori-ilmaisun sisältävä lauseke 2+3 4×5 voidaan tulkita joko niin, että funktiosidos on vektorisidosta vahvempi: (2+3)(4×5) tai toisinpäin: 2+(3 4×5).

Jälkimmäinen tulkinta, jossa vektori käsitellään yhtenä kokonaisuutena, on selkeästi APL1:n mukainen. Vektorisidos on funktion argumenttisidoksia vahvempi.

 

operaattori-ilmaisut

Operaattoreilla johdetaan funktio- ja dataoperandeista uusia funktioita. Operaattorit voivat olla operandiensa suhteen joko monadisia tai dyadisia. Toisin kuin funktiot, operaattorit eivät voi olla ambivalentteja, ja siksi ne jaetaan kahteen eri syntaksiluokkaan: monadisiin ja dyadisiin operaattoreihin. Operaattorilla on aina vasen operandisidos; dyadisella operaattorilla on lisäksi myös oikea operandisidos.

APL1:n operaattorien funktio-operandit on rajoitettu primitiiviskalaarifunktioihin. APL2:n operaattorit voivat sen sijaan saada operandikseen minkä tahansa (ambivalentin) funktion, myös itse tehdyn tai operaattorilla johdetun.

Kahden operaattorin yhdistetty lauseke +.×/ voidaan tulkita joko (+.×)/, sisätulon reduktioksi, tai +.(×/), yhteenlaskun ja tuloreduktion sisätuloksi.

Käytännöllisyys ja se, että operaattorit käyttäytyvät funktioihin nähden peilikuvamaisesti, asettavat APL2:ssa edellisen vaihtoehdon etusijalle. Oikean operandin sidos on vasemman operandin sidosta vahvempi.

Kaksioperandinen kaksiargumenttinen lauseke A×.-B voidaan tulkita joko siten, että sisätulo-operaattorin operandeina ovat kerto- ja vähennyslasku: (A)×.-(B) tahi sitten niin, että operandeina ovat kertolasku ja oikean argumentin vastaluku: A×.(-B).

APL1:n mukaan sisätulon argumentit ovat A ja B, joten oikea operandisidos on vasenta argumenttisidosta vahvempi.

Koska sama symboli (ilmaisu) ei voi olla samanaikaisesti sekä operaattori että funktio, ei vasemman operandisidoksen ja vasemman argumenttisidoksen ristiriitaa voi esiintyä, ja siksi niiden välisellä vahvuuserolla ei ole käytännön merkitystä. Symmetrian vuoksi asetetaan kuitenkin vasen operandisidos vahvemmaksi kuin vasen argumenttisidos.

Jos operaattorit olisivat ambivalentteja, reduktio saisi lausekkeessa +/A×B oikeaksi operandikseen A:n, koska funktion argumenttisidos on operandisidosta heikompi, ja johdettu funktio +/A olisi kertolaskun vasen argumentti eli lauseke tulkittaisiinkin muodossa (+/A)×B. Tämä on ristiriidassa APL1:n käytännön ja yksinkertaisuusperiaatteen kanssa, joten operaattori ei voi olla ambivalentti ja operaattorit on näin ollen jaettava kahteen eri syntaksiluokkaan (reduktio on monadinen operaattori).

Operaattorilla johdettu funktio sen sijaan on ambivalentti, joten muodot +/B ja A+/B ovat ainakin syntaktisesti mahdollisia.

Lavennuslausekkeessa 1 0 1/A on APL1:ssä vasempana operandina vektori 1 0 1 eikä skalaari 1. Vektorisidos on vasemman operandin sidosta vahvempi.

Oikean operandisidoksen vahvuudesta ei APL1 anna osviittaa, joten APL2:n kehittäjät valitsivat (lähinnä kait Sharp APL:n yhteensopivuutta ajatellen) oikean operandisidoksen vektorisidosta vahvemmaksi.

Esimerkiksi dyadiselle operaattorille DOP tulkitaan lauseke + DOP A B muotoon (+ DOP A)B. (Jälkikäteen on J.A. Brown myöntänyt tämän kohdan jääneen APL2:n kauneusvirheeksi!)

 

hakasulkeet

Hakasulkeita, joilla on vain vasen sidos, käytetään sääntiöiden indeksointiin sekä funktioiden ja operaattoreiden suoritussuunnan määritykseen. Hakasulkeet ovat kameleonttioperaatioita: niillä aikaansaatu lauseke on syntaksiluokaltaan sama kuin lausekkeen ilman hakasuljeilmaisua.

Dyadisen operaattorin DOP sisältävä lauseke + DOP ²[1] voidaan tulkita kahdella tavoin: joko (+ DOP ²)[1] tai + DOP(²[1]). Jälkimmäinen tulkinta on selkeämpi ja käytännössä yksinkertaisempi, joten hakasuljesidos on oikean operandin sidosta vahvempi.

Hakasuljesidos on siten myös vektorisidosta vahvempi, ja siksi lauseke A B C[2] on tulkittava kuten A B(C[2]). Niinpä vektori-indeksointilausekkeet tulee siis tarvittaessa ympäröidä sopivasti sulkeilla.

Esimerkiksi APL1:n lauseke 1 2 3[2] on APL2:ssa kirjoitettava muotoon (1 2 3)[2]. Tämä on ainoa syntaktinen ero APL1:stä APL2:een siirryttäessä.

Koska heittomerkit rajoittavat tekstivektorin yksiselitteisesti, ei tekstivektorin indeksointisyntaksi muutu.

 

sijoitusnuoli

Sijoitusnuolella on sekä vasen sidos (sijoitussidos) että oikea sidos (datasidos).

Lausekkeessa A„2+3 tulee A:n arvoksi 5, joten argumentin vasen sidos on vahvempi kuin sijoitusnuolen oikea sidos.

Lausekkeessa 2+A„3 sijoitus A:han tehdään ennen summausta. Sijoitusnuolen vasen sidos on oikeaa argumenttisidosta vahvempi.

Dyadisen operaattorin DOP sisältävä lauseke + DOP A„3 voidaan tulkita joko (+ DOP A)„3 taikka + DOP(A„3). Jälkimmäinen tulkinta on selkeämpi, joten sijoitusnuolen vasen sidos on oikean operandin sidosta vahvempi.

APL2:n lopulliseksi sidoshierarkiaksi saadaan:

hakasulkeet
sijoitusnuoli vasempaan
oikea operandi
vektori
vasen operandi
vasen argumentti
oikea argumentti
sijoitusnuoli oikealle.
 
HUOM:
oikeanpuoleisin funktio, jonka argumentit ovat valmiit, suoritetaan ensin
APL2-lausekkeen arvo tulostetaan ruudulle, ellei sen viimeinen suoritettava syntaksitoimenpide ole sijoitus (tavallinen tai valintasijoitus).
 

Vektorinotaatio

Vektoriin kuuluvat yksittäiset paljaat skalaarit voidaan syöttää yksitellen joko välilyöntien tai sulkeiden erottamina. Erotinvälilyöntien lukumäärä ei muuta lausekkeen arvoa. Yksittäisten merkkien syötössä ovat välilyöntierottimet olennaisia!

 
1 2 'A'     3 'B'       'C'

1 2 A 3 BC

'A' 'P' 'L' '2'

APL2

'A''P''L''2'

A'P'L'2

Sulkeita käytetään sekä ohjaamaan lausekkeiden suoritusjärjestystä että vektorinotaatiossa ilmaisemaan sääntiöryhmittelyä. Sulkeet ovat tarpeettomat jos ne eivät samanaikaisesti sekä erota ja ryhmitä.

(2 3) „… 2 3 © eivät erota
(2)(3) „… 2 3 © eivät ryhmitä
(2 3)(4 5) © sulkeet ovat tarpeen

Sulkeita voi haluttaessa käyttää selventämään sääntiö-, funktio- tai operaattori-ilmaisua.

(1 2)+.÷(2 3) © argumentit
1 2(+).(÷)2 3 © operandit
1 2+(.)÷2 3 © operaattori
1 2(+.÷)2 3 © johdettu funktio
1 2+.÷2 3 © sama sulkeitta

Sulkeilla erotetun lausekkeen voi aina korvata vastaavalla APL-ilmaisulla.

A„1 2
(1 2)3(4 5) „… A 3(4 5)

Pelkistä paljaista merkkiskalaareista koostuva vektori voidaan sulkea yksiin heittomerkkeihin.

'A' 'B' 'C' „… 'ABC'

Sulkeissa oleva alilauseke suoritetaan ennen kuin se sijoitetaan argumentiksi tai sääntiölausekkeen osaksi.

 

Ohjelmoitavat operaattorit

Käyttäjän ohjelmoimat operaattorit eroavat tavallisista funktioista vain otsikkoriviltään: operaattorin nimi ja operandifunktiot erotetaan sulkeilla.

Monadisen (MOP) ja dyadisen operaattorin (DOP) otsikkorivien muodot ovat:

[tulos„] [varg](voper MOP ) [oarg]{;lokaalimuuttuja}
[tulos„] [varg](voper DOP ooper)[oarg]{;lokaalimuuttuja}

Operaattoria suoritettaessa operandien nimet korvautuvat vastaavilla argumenttifunktioilla. Esimerkiksi matriisien M1 ja M2 kertolasku operaattorin STULO ja funktioiden plus ja kertaa avulla sujuu lausekkeella:

M1 plus STULO kertaa M2 © „… M1 +.× M2

 

Korvaussäännöt

APL2-lausekkeessa voidaan alilauseke korvata vastaavan arvon tuottavalla ilmaisulla lausekkeen arvon muuttumatta.

(¯1‡¼4)-1 „… (¼3)-1 © sisältövastaavuus!

Sulkeissa oleva lauseke voidaan korvata vastaavalla sääntiöilmaisulla lausekkeen arvon muuttumatta.

A„2 3 4
2 3 4,5 „… (2 3 4),5 „… (A),5 „… A,5

Sääntiön alkio voidaan korvata toisella vastaavan alkion tuottavalla ilmaisulla sääntiön arvon muuttumatta.

2 3 4 „… 2 (3) 4 „… 2(4-1)4

APL2-lausekkeen alilauseke voidaan korvata samaan syntaksiluokkaan kuuluvalla ilmaisulla lausekkeen syntaksin muuttumatta.

A+B „… A(+)B => A(*)B „… A*B © syntaksivastaavuus!
A++/B „… (A)(+)(+/)(B) => (C)(µ)(^™)(D) „… Cµ^™D

 

Kompleksiluvut

Jokainen APL2:n luku on kompleksiluku. Aito kompleksiluku esitetään aina muodossa xJy, missä x vastaa reaaliosaa ja y imaginaariosaa; reaalilukujen imaginaariosaa ei tulosteta. Kompleksiluku voidaan syöttää myös kulmamuodoissa (polaarimuodoissa) rD¸ taikka rR¸, missä r vastaa etäisyyttä origosta ja ¸ kulma-arvoa asteina tai radiaaneina.

Seuraavien skalaarifunktioiden arvoaluetta ja määritelmiä on laajennettu kompleksilukualueelle

(kompleksiluvun Z reaali- ja imaginaariosat ovat X ja Y eli Z „… X+Y×0J1):

- monadinen + on kompleksiluvun liittoluku (conjugate) (+Z „… X+(-Y)×0J1)
- monadinen | on kompleksiluvun etäisyys (magnitude) origosta eli kompleksiluvun esittämän tasopisteen etäisyys origosta (|Z „… (+/X Y*2)*0.5 „… (Z×+Z)*0.5)
- monadinen × on kompleksiluvun suuntafunktio (direction).

Lisäksi trigonometristen funktioiden joukkoa on laajennettu kompleksilukuoperaatioilla:

8±Z Ö-1-z2 ¯8±Z -Ö-1-z2
9±Z Z:n reaaliosa (X) ¯9±Z Z
10±Z |Z (etäisyys origosta) ¯10±Z +Z (liittoluku)
11±Z Z:n imaginaariosa (Y) ¯11±Z Z×0J1
12±Z Z:n vaihekulma (j(Z)) ¯12±Z *Z×0J1.

Kompleksiluvulle Z pätevät seuraavat identiteetit:

Z „… ¯10 ¯11 +.± 9 11 °.± Z ja
Z „… ¯9 ¯12 ×.± 10 12 °.± Z.

 

Sisäkkäiset sääntiöt

APL2:n sääntiön alkiona voi olla toinen sääntiö. Jos jokainen sääntiön alkio on paljas (ei-sisäkkäinen) skalaari, on sääntiökin paljas. Korostettaessa APL1:n sääntiöiden alkioiden (element) ja APL2:n sääntiöiden alkioiden rakenne-eroa, käytetään toisinaan APL2-sääntiöiden alkioista nimitystä solu (item).

Sisäkkäisyyden mitta on syvyys. Paljaan skalaarin syvyys on = 0, paljaan sääntiön syvyys on = 1 ja sisäkkäisen sääntiön syvyys on = 1 + sisäkkäisimmän alkion syvyys. Sääntiön sisäkkäisyyden kertoo monadinen syvyysfunktio ­. Ruudulle tulostettaessa sisäkkäisten alkioiden väliin sijoitetaan sisäkkäisyydestä riippuva lukumäärä välilyöntejä ja lisäksi tulostetta sisennetään vastaavasti.

­(1 2)(3(4 5))

3

(1 2)(3(4 5))
  1 2   3   4 5   © sisennys, välilyönnit!

Sääntiön voi muuttaa sisäkkäiseksi skalaariksi monadisella kätkentäfunktiolla .

Paljaan skalaarin kätkeminen ei muuta sen syvyyttä (ns. kelluva sisäkkäisyys).

(1 2)(3(4 5)) „… (›1 2),›3(4 5) „… (›1 2),›3,›4 5
A B C „… (›A),(›B),(›C)

Hakasuljeindeksointi ei vaikuta sisäkkäisen sääntiön syvyyteen, sillä voidaan valita vain uloimman kerroksen (kuoren) alkioita. Sen sijaan dyadisella poimintafunktiolla œ voi valita ja paljastaa sääntiöstä minkä tahansa alkion. Esimerkiksi sisäkkäiselle ei-tyhjälle vektorille 1œA „… œA[1].

Sääntiön sisäkkäisyyttä voi tutkia tuotteen mukana tulevalla DISPLAY-funktiolla, joka antaa tietoa sääntiön sisäkkäisyyden lisäksi myös sen muusta rakenteesta ja sisällöstä.

A„1 1 2½(2 2½('APL',2)'=' 'FUN'(±1))((¼0)(0 1½'A'))
DISPLAY A
ÚÚ…ÎÎÎÎÎÎÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎÎÎ Ì
‡‡ Ú…ÎÎÎÎÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎ Ì Ú…ÎÎÎÎÎÎÎÎÌ Û
ÛÛ ‡ Ú…ÎÎÎÎÌ   Û Û Ú´Ì Ú…Ì Û Û
ÛÛ Û ÛAPL 2Û = Û Û Û0Û ² Û Û Û
ÛÛ Û À+ÎÎÎÎÙ - Û Û À~Ù ÀÎÙ Û Û
ÛÛ Û Ú…ÎÎÌ   Û À¹ÎÎÎÎÎÎÎÎÙ Û
ÛÛ Û ÛFUNÛ 3.141592654 Û Û
ÛÛ Û ÀÎÎÎÙ   Û Û
ÛÛ À¹ÎÎÎÎÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎ Ù Û
ÀÀ¹ÎÎÎÎÎÎÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎÎÎ Ù

Alkion sisäkkäisyys = sitä ympäröivien rajojen lukumäärä. Paljaalla skalaarilla ei ole rajoja, paljaan merkkiskalaarin alle tulostetaan yksi alaviiva. Jokaisen laatikon vasemman yläkulman symbolit kertovat, onko kyseessä vektori (), matriisi ( ja ) vai tyhjä vektori/matriisi (´ tai ²). Vasemman alakulman merkintä ilmaisee, onko alkion sisältö tyypiltään sisäkkäinen (¹), numeerinen (~), merkki- vai sekamuotoinen (+). Vasemman reunan pystyviivojen lukumäärä näyttää vielä alkion moniulotteisuuden.

Myös tyhjät sääntiöt voivat olla sisäkkäisiä (eli niilläkin voi olla oma rakenne).

DISPLAY 0 2½›0 0
Ú…ÎÎÎÎÎÎÎÎÎÎÎÎÌ
² Ú…ÎÎÌ Ú…ÎÎÌ Û
Û Û0 0Û Û0 0Û Û
Û À~ÎÎÙ À~ÎÎÙ Û
À¹ÎÎÎÎÎÎÎÎÎÎÎÎÙ

 

Valintasijoitus

Sijoitusnuolen vahva vasen sidos mahdollistaa ilmaisut, joissa sijoitettavana on sääntiön nimen asemesta (olemassaolevaan) sääntiöön kohdistuva valintalauseke. Esimerkiksi:

A[2]„3 © „… (2ÞA)„3
(1†A)„3
(2‡2 3,A)„3
(3œA)„3

Jos on mahdollista kirjoittaa lauseke, jolla poimitaan sääntiöstä alkioita, sen voi panna sulkeiden väliin ja sijoitusnuolella muuttaa valittujen alkioiden sisältöä. Sääntiötä, jonka alkioita näin käsitellään, kutsutaan kohdesääntiöksi.

Valintalausekkeessa sallitut monadiset (¹ † , ² ´ ³) ja dyadiset (‡ † Þ œ ½ ² ´ ³) valintafunktiot sekä -operaattorit (\ ™ / š) riippuvat viime kädessä APL2-toteutuksesta.

Dyadisella poimintafunktiolla œ voi valita vain yhden sijoitusalkion. Valintalausekkeessa voi lisäksi käyttää hakasuljeindeksointia ja (muuhun kuin valintaan) mitä tahansa funktioita ja operaattoreita.

Monen sääntiön valintasijoituksesta (selective specification, selective assignment) havaitaan, että monisijoitus (multiple assignment) on valintasijoituksen erikoistapaus: ((›A),(›B),(›C))„X Y Z „… (A B C)„X Y Z.

Monisijoituksesta nähdään taas, että tavallinen yhteen nimeen sijoitus on monisijoituksen erikoistapaus:

(A B C)„X Y Z => (¯2‡A B C)„¯2‡X Y Z „… (A)„X „… A„X.

Monen sääntiön valintasijoitusta ei ole yleisesti määritelty.

Valintasijoituksessa käydään läpi kolme eri vaihetta:

Valitaan kohdesääntiön sijoitettavien alkioiden sijainnit.
Korvataan valitut alkiot. Jos korvataan vain yksi alkio, korvataan koko kohdesääntiön alkio sijoitettavalla datalla. Muussa tapauksessa data viedään kohdesääntiön korvattaviin alkioihin data-alkio -pareittain (mahdollisin skalaarilaajennuksin).
Palautetaan lausekkeen arvo = sijoitusnuolen oikeanpuolinen arvo ennen sijoitusta.
A„1 2 3 1 2 4 5
1+((A=3)/A)„99

100

A

1 2 9 1 2 4 5

((1=2|A)/A)„'¸'
A

¸ 2 ¸¸ 2 4 ¸

Poimintafunktiolla voi valita jopa paljaasta skalaarista, joka mielletään riittävän monta kertaa kätketyksi.

A„5
((¼0)(¼0))œA

5

(((¼0)(¼0))œA)„3 4
­A

3 © yksikerroksinen data toiseen kerrokseen!

(((¼0)(¼0))œA)„7
A

7 © takaisin skalaariksi

 

Paljaan skalaarin kätkentä

Eri APL1-laajennusten suurin periaatteellinen ero on siinä, onko kätketty paljas skalaari sisäkkäinen (ankkuroitu sisäkkäisyys: Sharp APL) vai ei (kelluva sisäkkäisyys: APL2, APL*PLUS, Dyalog APL).

Seuraavassa ovat pääkohdat J.A. Brownin esityksestä, jossa hän osoitti miksi APL2:n kelluva sisäkkäisyys vaikuttaa luontevammalta.

Deduktiivinen tapa tutkia paljaan skalaarin tapausta on lähteä liikkeelle yleisestä tapauksesta, tehdä tästä sopivia havaintoja ja lopuksi laajentaa tehdyt päätelmät erikoistapauksiin kuten paljaisiin skalaareihin, jos mahdollista. Lähdetään liikkeelle tasarakenteisista sisäkkäisistä sääntiöistä, joiden alkiot ovat keskenään samanmuotoisia ja -syvyisiä. Tämä on tarpeeksi yleinen lähtötilanne: jos joku yleinen sääntö pätee tasarakenteiselle sääntiölle, on sen oltava voimassa myös muunlaisille sääntiöille.

Sääntiön täydelliseen määrittelyyn tarvitaan vain kaksi tekijää: sisältö ja rakenne. Sääntiön sisällön urkintaan on olemassa perusfunktio, monadinen ¹, joka palauttaa argumenttisääntiön sisällön paljasrakenteisena vektorina.

Sääntiön rakenteelle ei ole olemassa vastaavaa funktiota, joten määritellään tasarakenteiselle sääntiölle monadinen rakennefunktio STRUCT seuraavasti: funktion tuloksena on argumenttinsa (ääretön) rakennevektori, jonka ensimmäinen alkio on argumenttisääntiön kokovektori, seuraava alkio on ensimmäisen alkion kokovektori, seuraava alkio on ensimmäisen alkion ensimmäisen alkion kokovektori, ja niin edespäin. Sääntiön ensimmäisen alkion poimintaan voidaan käyttää monadista ekafunktiota .

Esimerkiksi jos A„3 2½›5½›4 3½0, on

STRUCT A „… (3 2)(,5)(4 3)(¼0)(¼0)(¼0)..
„… (½A)(½†A)(½††A)(½†††A)(½††††A)..

Rakennevektorin sisällön tulo = sääntiön paljaiden skalaarien lukumäärä.

×/¹ STRUCT A © „… ½¹A

360

Jos sääntiö A kätketään, siitä tulee sisäkkäinen skalaari, eli

STRUCT ›A „… (¼0)(3 2)(,5)(4 3)(¼0)(¼0)(¼0)..
¹›A „… ¹A © sisältö säilyy samana

Rakennevektorin eteen tulee tyhjä vektori, siispä sisältö ei muutu, ainoastaan syvyysrakenne!

Paljaan skalaarin ja kätketyn skalaarin rakennevektoreiksi saadaan nyt

STRUCT 5 „… (¼0)(¼0)(¼0).. © „… (½5)(½†5)..
STRUCT ›5 „… (¼0)(¼0)(¼0)(¼0)..

Kätkeminen lisää siis rakennevektorin eteen yhden ¼0:n. Paljaan skalaarin rakennevektori on jo ääretön jono tyhjiä vektoreita, eikä yhden lisäys eteen muuta sen rakennetta. Niinpä paljaan skalaarin ja kätketyn paljaan skalaarin rakennevektorit ovat identtiset. Tästä voi päätellä, että paljaan skalaarin rakenne ei kätkettäessä muutu.

HUOM: Määritellään vielä toinen (äärellinen) rakennefunktio STRUCT1, jonka tuloksena on rakennevektori ilman lopussa olevia tyhjiä vektoreita. Tällöin on voimassa identiteetti: ­X „… †½STRUCT1 X.

 

Tyyppi ja prototyyppi

Sääntiön X tyyppi (tyyppisääntiö) saadaan lausekkeella †0½›X. Tyyppisääntiö on alkuperäisen sääntiön kanssa samanrakenteinen, mutta siinä on nolla jokaisen paljaan luvun ja välilyönti jokaisen paljaan merkin paikalla.

†0½›(¼3),'A',¼3
0 0 0   0 0 0

Muuttujan prototyyppi saadaan lausekkeella †0½›†, eli prototyyppi = sääntiön ensimmäisen alkion tyyppi.

†0½›†(¼3),'A',¼3

0

Prototyyppiä käytetään tarvittaessa (otto-, eka-, lavennus-, monistus- ja paljastusfunktioille) sääntiöiden täytealkiona.

A„(1 2)'ABC'
†0½›†A

0 0

4½A
  1 2   ABC   1 2   ABC © „… (1 2)'ABC'(1 2)'ABC'
4†A
 
  1 2   ABC   0 0   0 0 © „… (1 2)'ABC'(0 0)(0 0)
DISPLAY 1 1 1 0\((2 3)(4(5 6)))7 8 9
Ú…ÎÎÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎ Ì
Û Ú…ÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÌ   Ú…ÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÌ Û
Û Û Ú…ÎÎÌ Ú…ÎÎ ÎÎÎÎÎÎÌ Û 7 8 Û Ú…ÎÎÌ Ú…ÎÎ ÎÎÎÎÎÎÌ Û 9 Û
Û Û Û2 3Û Û Ú…ÎÎÌ Û Û   Û Û0 0Û Û Ú…ÎÎÌ Û Û Û
Û Û À~ÎÎÙ Û 4 Û5 6Û Û Û   Û À~ÎÎÙ Û 0 Û0 0Û Û Û Û
Û Û Û À~ÎÎÙ Û Û   Û Û À~ÎÎÙ Û Û Û
Û Û À¹ÎÎ ÎÎÎÎÎÎÙ Û   Û À¹ÎÎ ÎÎÎÎÎÎÙ Û Û
Û À¹ÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÙ   À¹ÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÙ Û
À¹ÎÎÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎ ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎ Ù

 

Täytefunktio

Primitiivifunktioilla ja kukin- sekä sisätulo-operaattoreilla johdetuilla funktioilla, joilla on ainakin toisena argumenttina tyhjä sääntiö, sovelletaan funktion mukaista täytefunktiota (fill function) alkuperäisen funktion asemesta.

Täytefunktion argumentteina on tyhjän argumentin asemesta tämän prototyyppi; tyhjän paljaan tekstivektorin prototyyppi on tällöin =0. Tarvittaessa täytefunktiota käytetään (sisäkkäisten tyhjien sääntiöiden tapauksessa) rekursiivisesti. Esimerkiksi skalaarifunktioiden täytefunktiona on ¬.

DISPLAY ''÷''
Ú´Ì
Û0Û
À~Ù
DISPLAY ÷0 2½›1 2 3
Ú…ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ
² Ú…ÎÎÎÎÌ Ú…ÎÎÎÎÌ Û
Û Û0 0 0Û Û0 0 0Û Û
Û À~ÎÎÎÎÙ À~ÎÎÎÎÙ Û
À¹ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ

 

Skalaarifunktioista

Monadisille skalaarifunktioille sovelletaan seuraavia käsittelysääntöjä (yhteensopivuusehtoja):

paljaalle skalaariargumentille käytetään funktiota sellaisenaan
ei-tyhjälle argumentille käytetään funktiota jokaiselle paljaalle alkiolle erikseen
tyhjälle argumentille sovelletaan täytefunktiota (argumentin prototyypille).

Dyadiselle skalaarifunktiolle sovelletaan taas seuraavia käsittelysääntöjä:

jos molemmat argumentit ovat paljaita skalaareja, käytetään funktiota sellaisenaan
tyhjälle argumentille sovelletaan täytefunktiota (argumentin prototyypille)
samanmuotoisille argumenteille funktiota sovelletaan vastinalkiopareittain
jos toinen argumentti on skalaari tai yksialkioinen vektori, sitä käytetään jokaisen toisen argumentin alkion kanssa (skalaarilaajennus).

Sisäkkäisille sääntiöille käytetään näitä sääntöjä rekursiivisesti.

DISPLAY 2 (3 4)(5 6 7) + ((8 9) 10) 11 (12 13 14)
Ú…ÎÎÎÎÎÎÎÎÎÎÎÎÎÎ ÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ Ì
Û Ú…ÎÎÎÎÎÎÎÎÎÎÎÎ Ì Ú…ÎÎÎÎÌ Ú…ÎÎÎÎÎÎÎÌ Û
Û Û Ú…ÎÎÎÎÎÌ Û Û14 15Û Û17 19 21Û Û
Û Û Û10 11 Û 12 Û À~ÎÎÎÎÙ À~ÎÎÎÎÎÎÎÙ Û
Û Û À~ÎÎÎÎÎÙ Û   Û
Û À¹ÎÎÎÎÎÎÎÎÎÎÎÎ Ù   Û
À¹ÎÎÎÎÎÎÎÎÎÎÎÎÎÎ ÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ Ù

Dyadisia skalaarifunktioita voi käyttää halutuissa suunnissa (K1 ¸[W]K2).

V„1 10 100
M„3 4½¼12
V×[1]M
1   2   3   4
50   60   70   80
900   1000   1100   1200

Suuntavektorissa W ei saa esiintyä sama akseli kuin kerran, järjestyksellä ei ole vaikutusta tulokseen. Akseleille on voimassa: ½,W „… (½½K1)˜½½K2 ja ^/W¹¼(½½K1)—½½K2.

Argumentit ovat yhteensopivia, jos ½W „… (½K1)[W] (tai ½W „… (½K2)[W]).

Tuloksen koko = moniulotteisemman argumentin koko.

A„100×3 2 4½¼24
M+[1 3]A
101   202   303   404
501   602   703   804
905   1006   1107   1208
1305   1406   1507   1608
1709   1810   1911   2012
2109   2210   2311   2412

 

APL2-funktiot ja -operaattorit

Esitellään seuraavaksi uudet operaattorit ja funktiot sekä APL1-funktioista ne, joiden ominaisuuksia on APL2:ssa laajennettu. Käytetään seuraavia merkintöjä:

S skalaari
V vektori
W suuntavektori (yksi tai useampia kokonaislukuja)
M matriisi
K kaikki sääntiöt
¸ funktio

 

APL2-operaattorit

kukin (jokaiselle) ¸¨K K1¸¨K2

Monadinen kukin-operaattori (each) suorittaa monadisen operandifunktion ¸ jokaiselle argumentin K alkiolle. Operaattorin toiminta kohdistuu (sisäkkäisen) argumentin kuorikerrokseen. Operaattoria toistamalla voidaan pureutua argumentin syvempiin kerroksiin.

Monadiselle operaattorille on voimassa identiteetti: Iœ¸¨K „… ¸(IœK).

Œ„A„¼¨¼5 © „… (¼1)(¼2)(¼3)(¼4)(¼5)
  1   1 2   1 2 3   1 2 3 4   1 2 3 4 5
½A

5

½¨'APL' (2½›'APL2')
  3   2 © „… (,3)(,2)
½¨¨'APL' (2½›'APL2')
            4   4   © „… (3½›¼0)((,4)(,4))

Dyadinen kukin-operaattori (dyadic each) suorittaa operandifunktion ¸ jokaisen argumenttiparin välillä. Jos jompikumpi argumenteista on skalaari, se laajennetaan toisen argumentin rakenteen mukaiseksi.

Dyadiselle operaattorille on voimassa identiteetti: IœK1¸¨K2 „… (IœK1)¸(IœK2).

2½3 4 5

3 4

2½¨3 4 5 © „… 2 2 2½¨3 4 5
  3 3   4 4   5 5
(›2 3)½¨3 4 5 © skalaarilaajennus
  3 3 3   4 4 4   5 5 5
  3 3 3   4 4 4   5 5 5
A„(10 20)(30 40)(50 60)
+/A
  90 120
+/¨A

30 70 110

Jos operandifunktio on skalaarifunktio, ei kukin-operaattorilla ole vaikutusta funktion toimintaan.

Tyhjälle argumentille käytetään funktion mukaista täytefunktiota kyseisen argumentin prototyypille.

1 2 3 +¨ 4 5 6 © „… 1 2 3 + 4 5 6

5 7 9

 

monistus (toisto), pelkiste, liukuva pelkiste V/[S]K ¸/[S]K S1¸/[S2]K

APL2:ssa etukenosymboli / on aina operaattori. Sen avulla johdetaan eri tyyppisiä funktioita:

 

monistusfunktio V/[S]K (replicate) johdetaan operaattorista vektorioperandilla V. Monistuksella toistetaan operandivektorin mukaisesti sääntiön K tasoja suunnassa S.

Jos V on skalaari tai yksialkioinen vektori, sitä käytetään kaikille monistustasoille, muutoin tulee olla (½K)[S] „… +/V‰0. Jos suunta S puuttuu, oletuksena on viimeinen suunta (VšK:lle ensimmäinen).

Jos V:n toistinalkio on positiivinen tai nolla, suuntaa S vastaavan tason alkioita monistetaan toistinalkion verran. Negatiivisella toistinalkiolla monistetaan suunnan S täytealkiota toistinalkion itseisarvon verran.

1 2 ¯1 3 ¯2 0/6 7 8 9

6 7 7 0 8 8 8 0 0

1 0 ¯1 2šœ'YKSI' 'EI NÄY' 'TUPLAA'
YKSI
 
TUPLAA
TUPLAA

 

pelkistefunktiossa ¸/[S]K (reduce) voi operandina olla mikä tahansa dyadinen funktio.

Pelkistys vähentää ei-skalaarisen argumentin ulotteisuutta yhdellä.

×/[1]3 4½¼12 © „… ך3 4½¼12

45 120 231 384

A„,/'A' 'BC' 'DEF' 'GHIJ'
DISPLAY¨ A (½A) (­A) © vektorin pelkiste on skalaari
ÚÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Ú´Ì
Û Ú…ÎÎÎÎÎÎÎÎÎÌ Û Û0Û 2
Û ÛABCDEFGHIJÛ Û À~Ù
Û ÀÎÎÎÎÎÎÎÎÎÎÙ Û
À¹ÎÎÎÎÎÎÎÎÎÎÎÎÎÙ

 

liukuva pelkiste S1¸/[S2]K (reduce n-wise) on dyadinen funktio, jonka vasen kokonaislukuargumentti S1 määrittelee sen ikkunan (liukuma-alueen) leveyden, jolle funktiota pelkistetään suunnassa S2.

Sekä S1 että S2 ovat joko skalaareja tai yksialkioisia vektoreita. Jos S1 on negatiivinen, ikkunan sisältö heijastetaan ennen pelkistystä. Tuloksen pituus pelkistesuunnassa on 1+(½K)[S2]-|S1.

3+/¼5 © „… (+/1 2 3),(+/2 3 4),(+/3 4 5)

6 9 12

(4+/1 4 9 16 25 36)÷4 © juokseva keskiarvo

7.5 13.5 21.5

¯2-/1 4 9 16 25 © viereisten alkioiden erotukset

3 5 7 9

¯2,/'ABCD'

BA CB DC

Jos S1=0, käytetään funktion identtisyysalkiota.

0×/¼5

1 1 1 1 1 1 © huomaa pituus!

 

lavennus, selaus (kertymä, kumulointi) V\[S]K V\K ¸\[S]K ¸\K

APL2:ssa takakenosymboli \ on aina operaattori. Sen avulla johdetaan eri tyyppisiä funktioita:

 

lavennusfunktiolla V\[S]K (expand) lavennetaan sääntiötä K akselin S suunnassa loogisen vektorin V avulla. Jos suuntaa ei anneta, oletuksena on viimeinen ulottuvuus (V™K:lle ensimmäinen). V:n nolla-alkio laajentaa tulossääntiötä laajennussuunnan täytealkiolla, ykkösalkiot osoittavat K:n alkuperäisen datan sijoittumiskohdat. Ohjainvektorille V on voimassa: +/V „… (½K)[S].

1 0 1 0 1 0 1\'APL2'

A P L 2

A„2 3 4½¼24
((,A)[1 3 13 16])„'ACDE'
A
A   2   C   4
5   6   7   8
9   10   11   12
             
D   14   15   E
17   18   19   20
21   22   23   24
1 1 1 0 1\[3]A
A   2   C       4
5   6   7   0   8
9   10   11   0   12
                 
D   14   15       E
17   18   19   0   20
21   22   23   0   24

 

selausfunktion ¸\[S]K (scan) tuloksena on K:n muotoinen sääntiö, jonka kukin alkio on dyadisen funktion ¸ pelkiste sille K:n osasääntiölle, jossa S:nnessä suunnassa ovat alkiot vain tähän alkioon asti. Jos suuntaa ei anneta, on oletuksena viimeinen ulottuvuus (¸™K:lle ensimmäinen).

+\(1 2)(3 4)(5 6)
  1 2   4 6   9 12
+\¨(1 2)(3 4)(5 6)
  1 3   3 7   5 11
DISPLAY ,\'A' 'BC' 'DEF' 'GHIJ'
Ú…ÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ
Û Ú…ÎÎÌ Ú…ÎÎÎÎÎÌ Ú…ÎÎÎÎÎÎÎÎÎÌ Û
Û A ÛABCÛ ÛABCDEFÛ ÛABCDEFGHIJÛ Û
Û Î ÀÎÎÎÙ ÀÎÎÎÎÎÎÙ ÀÎÎÎÎÎÎÎÎÎÎÙ Û
À¹ÎÎ ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ
+\[1]3 4½¼12 © „… +™3 4½¼12
1   2   3   4
6   8   10   12
15   18   21   24
,\[1]3 3½¼9
    1   2   3
    1 4   2 5   3 6
    1 4 7   2 5 8   3 6 9

 

APL2-funktiot

indeksifunktio VÞ[W]K VÞK {ŒIO}

Dyadinen indeksifunktio (index) valitsee oikeasta argumenttisääntiöstä K vasemman argumentin V indeksien ilmaisemat alkiot kokonaislukuvektorin W määräämissä suunnissa. Jos suuntia ei ole annettu, ovat oletuksena kaikki suunnat: VÞK „… VÞ[¼½½K]K. Indeksivektorin pituus = suuntien lukumäärä, esimerkiksi kolmiulotteiselle sääntiölle M: I JÞ[1 3]M „… M[I;;J].

Indeksifunktion ja hakasuljeindeksoinnin välillä on identiteetti: I J KÞM „… M[I;J;K]. Skalaarin valinta on mahdollista lausekkeella (¼0)ÞS.

3ÞA„11 12 13 14 © „… A[3]

13

(›2 1)ÞA © „… A[2 1]

12 11

2 1ÞM„2 2½11 12 13 14 © „… M[2;1]

13

2(2 1)ÞM © „… M[2;2 1]

14 13

2Þ[1]M © „… M[2;]

13 14

(¼0)Þ±1

3.141592654

 

sisältö ¹K

Monadisen sisältöfunktion (enlist) tuloksena on argumentin paljas sisältövektori (rivisuunnassa).

A„(2 2½¼4)(2 2½(5 6(2 2½7 8 9 10)11))'ABCD'
DISPLAY A
Ú…ÎÎÎÎÎÎ ÎÎ Î ÎÎ ÎÎ ÎÎ ÎÎÎ ÎÎÎÎÎÎÎÎÎ Ì
Û Ú…ÎÎÌ Ú… Î ÎÎ ÎÎ ÎÎ ÎÎÎ Ì Ú…ÎÎÎÌ Û
Û ‡1 2Û   5     6 Û ÛABCDÛ Û
Û Û3 4Û Û Ú …Î ÎÎ Ì   Û ÀÎÎÎÎÙ Û
Û À~ÎÎÙ Û 7 8 Û 11 Û Û
Û Û Û 9 10 Û   Û Û
Û Û À ÎÎ Ù   Û Û
Û À¹ Î ÎÎ ÎÎ ÎÎ ÎÎÎ Ù Û
À¹ÎÎÎÎÎÎ ÎÎ Î ÎÎ ÎÎ ÎÎ ÎÎÎ ÎÎÎÎÎÎÎÎÎ Ù
¹A

1 2 3 4 5 6 7 8 9 10 11 ABCD

 

syvyys (kerros), yhtenevyys (identtisyys) ­K K1­K2 {ŒCT}

Sääntiön sisäkkäisyyden asteen kertoo monadinen syvyysfunktio (depth), jonka palauttama tulos on skalaari.

­¨'A' 'APL1' ('APL' 2)

0 1 2

Dyadinen yhtenevyysfunktio (match) ilmaisee kahden sääntiön keskinäisen identtisyyden eli sisällön ja rakenteen (muodon ja syvyyden) yhdenmukaisuuden.

'A'­,'A'

0

 

kätkentä (kapselointi), ositus (jaotus) ›[W]K ›K V›[S]K V›K

Monadinen kätkentäfunktio (enclose) paketoi (kapseloi) argumenttinsa sisäkkäiseksi sääntiöksi vektorin W osoittamissa suunnissa.

Jos suuntavektoria ei ole annettu, kätketään koko sääntiö skalaariksi (›K „… ›[¼½½K]K).

Paljasta skalaaria ei voi kätkeä, eli paljaalle skalaarille A: A „… ›A. Kätkentä kasvattaa argumenttinsa (muun kuin paljaan skalaarin) syvyyttä yhdellä.

›'ABC'
  ABC
­›'ABC'

2

A„3 4½'KÄSIUPOSNYSÄ'
›[2]A
  KÄSI   UPOS   NYSÄ
›[1]A
  KUN   ÄPY   SOS   ISÄ

Jos koordinaattivektori W on tyhjä ja argumentti on sisäkkäinen sääntiö, sääntiön alkioiden sisäkkäisyys kasvaa yhdellä muun rakenteen muuttumatta: ›[¼0]N „… ›¨N.

Kätkentä- ja paljastusfunktioiden välillä on yhteys: K „… œ[W]›[W]K. Vektori-ilmaisun ja kätkentäfunktion välillä on identiteetti: (A B C) „… (›A),(›B),(›C).

Dyadisella ositusfunktiolla (partition), jossa vasen ohjausargumentti V on skalaari tai kokonaislukuvektori (‰0), oikea argumentti K jaotellaan sisäkkäiseksi vektoriksi ohjausvektorin jakokohtien mukaan akselin S suunnassa. Jos ositussuuntaa ei ole annettu, on oletuksena sääntiön viimeinen ulottuvuus.

Jakokohdassa ohjaimen alkion arvo kasvaa suhteessa edelliseen arvoon. Nollalla merkittyjä osia ei oteta tulokseen mukaan. Ohjausvektorin (ellei se ole skalaari) pituuden ja ositettavan sääntiön koordinaattivektorin S:nnen arvon tulee olla yhtä suuria.

Tulokselle pätee: (V¬0)/[S]K „… œ[S],/[S]V›[S]K.

DISPLAY 1 1 2 2 0 3 2 1 2 3›'ABCDEFGHIJ'
Ú…ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ
Û Ú…ÎÌ Ú…ÎÌ Ú…ÎÎÌ Ú…Ì Ú…Ì Û
Û ÛABÛ ÛCDÛ ÛFGHÛ ÛIÛ ÛJÛ Û
Û ÀÎÎÙ ÀÎÎÙ ÀÎÎÎÙ ÀÎÙ ÀÎÙ Û
À¹ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ
A„' BLANKOILLA EROTELTU TEKSTI '
DISPLAY (A¬' ')›A
Ú…ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ
Û Ú…ÎÎÎÎÎÎÎÎÎÌ Ú…ÎÎÎÎÎÎÎÌ Ú…ÎÎÎÎÎÌ Û
Û ÛBLANKOILLAÛ ÛEROTELTUÛ ÛTEKSTIÛ Û
Û ÀÎÎÎÎÎÎÎÎÎÎÙ ÀÎÎÎÎÎÎÎÎÙ ÀÎÎÎÎÎÎÙ Û
À¹ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ
1 0 1›[1]3 3½'ABCDEFGHI'
  A   B   C
  G   H   I
1 0 1›[2]3 3½'ABCDEFGHI'
  A   C
  D   F
  G   I

 

paljastus (purku, kuorinta), poiminta œ[W]K œK VœK {ŒIO}

Monadinen paljastusfunktio (disclose, mix) purkaa argumenttinsa alkiot sääntiöiksi alkioiden purkusuunnissa W. Kaikkien K:n alkioiden tulee olla skalaareja tai samanulotteisia sääntiöitä (ei välttämättä samanmuotoisia). Tulossääntiötä täydennetään tarvittaessa täytealkioilla.

Jos suuntavektoria W ei ole, ovat oletuksena alkioiden viimeiset suunnat: œK „… œ[(½½K)+¼½½†K]K.

Paljastuksen ja kätkennän välillä on identiteetti: œK „… œ[W]›[W]K.

œ'SISÄKKÄINEN' 'TEKSTIVEKTORI' '' 'MATRIISIKSI'
SISÄKKÄINEN
TEKSTIVEKTORI
 
MATRIISIKSI
œ(1 2)'ABCD' 'EFGHI'
1 2 0 0 0
A B C D  
E F G H I

Tuloksen rakenteessa on kyse alkuperäisen sisäkkäisen sääntiön ja sen alkioiden rakenteen yhdistämisestä. Purkusuuntavektorin W alkiot kertovat alkion suuntien sijainnit tuloksen kokovektorissa.

Esimerkiksi jos ½K „… 3 ja ½¨K „… (2 4)(2 4)(2 4), on ½œ[1 2]K „… 2 4 3, ½œ[1 3]K „… 2 3 4 ja ½œ[2 3]K „… 3 2 4.

Jos K:n kaikki alkiot ovat skalaareja, täytyy W:n olla tyhjä.

œ[¼0]›¨'AB' 'CDE' 'FGHI'
  AB   CDE   FGHI

Dyadisella poimintafunktiolla (pick) voi valita ja paljastaa minkä tahansa, sisäkkäisenkin, sääntiön alkion. Valintavektorille V on voimassa ehdot: 2‰­V ja (½V)ˆ­K. V:n i:s alkio kertoo K:n i:nnen kerroksen (syvyyden) indeksoinnin.

A„'A' 'BC' ('DEF' 'GHIJ')
3œA
  DEF   GHIJ
3 2 4œA

J

Moniulotteisen sääntiön uloimmasta kerroksesta (kuorikerroksesta) valittaessa V:n tulee olla skalaari tai yksialkioinen vektori. Tyhjällä vektorilla valittaessa: K „… (¼0)œK (myös skalaarille).

A„2 2½'AB' 'CDE' 'FGHI' ('JK' 'LMN')
(›2 2)œA
  JK   LMN
(2 2)2œA

LMN

(I J)„((1 2)3) ((2 2)2 3)
I Jœ¨›A

EN

(¼0)œ2*0.5

1.414213562

 

ensimmäinen (eka), otto †K V†[W]K V†K

Monadinen ekafunktio (first) valitsee argumenttinsa ensimmäisen alkion ja paljastaa sen.

Jos K on tyhjä, tuloksena on K:n prototyyppi.

Ei-tyhjälle sääntiölle K: †K „… (›(½½K)½1)œK. Paljaalle vektorille V: †V „… ''½V „… 1œV „… 1ÞV.

†'DO' 'RE' 'MI' 'FA'

DO

††'DO' 'RE' 'MI' 'FA'

D

Dyadisen ottofunktion (take) vasen argumentti ilmaisee vektorin W suunnissa otettavien alkioiden lukumäärän. Kokonaislukuvektorissa V on oltava yhtä monta alkiota kuin W:ssä. Jos suuntavektori W puuttuu, ovat oletuksena kaikki K:n suunnat (V†K „… V†[¼½½K]K). Positiiviselle V:n alkiolle valitaan vastaavan suunnan alkiot alkupäästä ja negatiiviselle lopusta.

Jos jossain suunnassa valitaan enemmän alkioita kuin niitä K:ssa on, ajatellaan K:n sisältävän ylimääräisiä tasoja, jotka kaikki ovat K:n vastaavan suunnan prototyypin mukaisia. Suuntavektorin W alkioiden järjestys on vapaa, mutta kukin suunta voidaan antaa vain kerran.

Otolle on voimassa identiteetti: V†[W]K „… œ[W](›V)†¨›[W]K.

Otto ei vaikuta valittujen alkioiden sisäiseen rakenteeseen.

A„œ'PUUPÄÄ' 'ETUOVI' 'MENNYT'
2†[1]A © „… 2 6†A
PUUPÄÄ
ETUOVI
¯3†[2]A © „… 3 ¯3†A
PÄÄ
OVI
NYT
3 ¯2†[2 1]A © „… ¯2 3†A
ETU
MEN
3†[1]œ(1 'A' 3)(4 5 6)
1 A 3
4 5 6
0   0

 

pudotus V‡[W]K V‡K

Pudotusfunktio (drop) toimii samalla tavoin kuin otto, mutta vasen kokonaislukuargumentti V ilmaisee nyt suunnittain pois jätettävien alkioiden lukumäärät.

2‡[1]A © „… 0 2‡A

MENNYT

3 ¯1‡[2 1]A
PÄÄ
OVI

 

jonoutus ,[W]K ,K

Monadisella jonoutusfunktiolla (ravel) argumentin K alkiot jonoutetaan suunnissa W. Suuntavektori W voi olla joko kokonaislukuvektori, -skalaari, desimaaliluku tai tyhjä vektori.

Suuntavektorin puuttuessa on oletuksena sääntiön kokovektori: ,K „… ,[¼½½K]K.

Jos W on desimaaliluku (1—W˜1+½½K), lisätään argumentin kokovektoriin ylimääräinen ykkönen ennen suuntaa —W. Kokonaislukuskalaarille W: K „… ,[W]K.

A„2 3½'MIESIE' © „… œ'MIE' 'SIE'
,[0.1]A
MIE
SIE
½,[0.1]A

1 2 3

½,[1.1]A

2 1 3

½,[2.1]A

2 3 1

Jos W on kokonaislukuvektori, sen tulee olla nousevassa suuruusjärjestyksessä oleva osakoordinaattivektori. Tuloksen kokovektoriin summautuvat tällöin W:n sisältämät K:n suunnat.

A„3 2 4½¼24
,[2 3]A
1   2   3   4   5   6   7   8
9   10   11   12   13   14   15   16
17   18   19   20   21   22   23   24

Jos W on tyhjä vektori, muodostetaan kokovektorin loppuun uusi ulottuvuus, jonka pituus = 1.

,[¼0]11 12 © „… ,['']11 12

11 © ½,[¼0]11 12 „… 2 1

12

 

paitsi V~K {ŒCT}

Dyadinen paitsi-funktio (without, excluding) poistaa vasemmasta vektoriargumentistaan V oikeassa argumentissa K olevat alkiot. Poistetaan vain ne alkiot, jotka ovat sekä rakenteeltaan että sisällöltään yhtenevät.

1 2 3 4 5~2 3 4

1 5

'HIP' 'HIP' 'HURRAA'~'HIPHIP' 'HURRAA'
  HIP   HIP
4 7 5(¼0)6 7 5~9 5 7 3
4   6     © ¼0 jäi!
4 7 5(¼0)6 7 5~9 5 7 3,›¼0

4 6

'ABC'~2 2½'BDEF' © poistettavan koolla ei väliä

AC

 

nousuindeksi “K K1“K2 {ŒIO}

Monadisen nousuindeksin (grade up) tuloksena on vektori, jossa numeerisen sääntiön K ensimmäisen ulottuvuuden indeksivektori on K:n (ensimmäisen suunnan) alkioiden suhteen nousevassa suuruusjärjestyksessä.

Esimerkiksi matriisiargumentille on tuloksena vektori, joka ilmaisee mihin järjestykseen matriisin rivit järjestettäisiin nousevasti.

“M„3 2½2 1,1 1,1 2 © „… œ(2 1)(1 1)(1 2)

2 3 1

DISPLAY¨ M (M[“M;])
  Ú…ÎÎÌ Ú…ÎÎÌ
  ‡2 1Û ‡1 1Û
  Û1 1Û Û1 2Û
  Û1 2Û Û2 1Û
  À~ÎÎÙ À~ÎÎÙ

Dyadista nousuindeksiä (grade up with collating sequence) käytetään merkkisääntiöiden lajitteluun. Vasen ohjainargumentti K1 sisältää sen aakkostusjärjestyksen, jonka mukaan K2:n ensimmäisen suunnan indeksivektorin järjestys määrätään.

Esimerkiksi jos K1 on vektori ja K2 on matriisi, lasketaan K2:n riveille painoarvot niiltä löytyvien K1:n merkkien mukaan ja näistä painoarvoista tuotetaan edelleen tulosindeksivektori.

Jos K1 on matriisi tai moniulotteinen sääntiö, samoilla riveillä ovat ne merkit, joilla on sama painoarvo; moniulotteisella ohjaimella voi hienosäätää useiden samanpainotteisten merkkien keskinäistä järjestystä.

A1„'ABCDEFGHIJ'
A2„œ'ABCDEFGHIJ' 'abcdefghij'
M„œ'ABC' 'abc' 'AbC' 'Abc' 'ABc' ' BC' ' AB'
DISPLAY¨ M (M[A1“M;]) (M[A2“M;]) (M[ŒAV“M;])
  Ú…ÎÎÌ Ú…ÎÎÌ Ú…ÎÎÌ Ú…ÎÎÌ
  ‡ABCÛ ‡ABCÛ ‡ABCÛ ‡ ABÛ
  ÛabcÛ ÛABcÛ ÛABcÛ Û BCÛ
  ÛabCÛ ÛabCÛ ÛabCÛ ÛabcÛ
  ÛabcÛ ÛabcÛ ÛabcÛ ÛAbcÛ
  ÛABcÛ Û ABÛ ÛabcÛ ÛAbCÛ
  Û BCÛ Û BCÛ Û ABÛ ÛABcÛ
  Û ABÛ ÛabcÛ Û BCÛ ÛABCÛ
  ÀÎÎÎÙ ÀÎÎÎÙ ÀÎÎÎÙ ÀÎÎÎÙ

 

laskuindeksi ”K K1”K2 {ŒIO}

Monadinen ja dyadinen laskuindeksi (grade down; grade down with collating sequence) toimivat samalla tavoin kuin nousuindeksifunktiot, paitsi että indeksin järjestys on nyt laskeva.

DISPLAY¨ M (M[A1”M;]) (M[A2”M;]) (M[ŒAV”M;])
  Ú…ÎÎÌ Ú…ÎÎÌ Ú…ÎÎÌ Ú…ÎÎÌ
  ‡ABCÛ ‡abcÛ ‡ BCÛ ‡ABCÛ
  ÛabcÛ Û BCÛ Û ABÛ ÛABcÛ
  ÛAbCÛ Û ABÛ ÛabcÛ ÛAbCÛ
  ÛAbcÛ ÛabcÛ ÛAbcÛ ÛAbcÛ
  ÛABcÛ ÛabCÛ ÛAbCÛ ÛabcÛ
  Û BCÛ ÛABcÛ ÛABcÛ Û BCÛ
  Û ABÛ ÛABCÛ ÛABCÛ Û ABÛ
  ÀÎÎÎÙ ÀÎÎÎÙ ÀÎÎÎÙ ÀÎÎÎÙ

 

etsintä K1ºK2 {ŒCT}

Etsintäfunktiolla (find) paikallistetaan K2:sta K1:n kanssa yhteneviä (samanmuotoisia ja -sisältöisiä) alueita. Loogisessa tulossääntiössä on ykkönen jokaisen löytyneen alueen ensimmäisen (kulma-)alkion paikalla. Tulossääntiö on samanmuotoinen kuin K2.

'SIKA'º'UUSIKAARLEPYY'

0 0 1 0 0 0 0 0 0 0 0 0 0

A„'* TIIVISTETTÄVÄ TEKSTI *'
(~' 'ºA)/A © peräkkäisten välilyöntien tiivistys

* TIIVISTETTÄVÄ TEKSTI *

A„'TOM' 'TOM' 'TO' 'TOM' 'TOM' 'TOM'
'TO' 'TOM'ºA

0 0 1 0 0 0

(›'TOM')ºA

1 1 0 1 1 1

Jos K1:llä on vähemmän ulottuvuuksia kuin K2:lla, etsitään viimeisten K2:n ulottuvuuksien suunnassa eli K1:n kokovektorin alkuun lisätään tällöin tarpeellinen määrä ykkösiä.

A„4 5½'ABCABA'
DISPLAY¨ A ('AB'ºA) ((œ'BC' 'AB')ºA)
  Ú…ÎÎÎÎÌ Ú…ÎÎÎÎÎÎÎÎÌ Ú…ÎÎÎÎÎÎÎÎÌ
  ‡ABCABÛ ‡1 0 0 1 0Û ‡0 1 0 0 0Û
  ÛAABCAÛ Û0 1 0 0 0Û Û0 0 1 0 0Û
  ÛBAABCÛ Û0 0 1 0 0Û Û0 0 0 1 0Û
  ÛABAABÛ Û1 0 0 1 0Û Û0 0 0 0 0Û
  ÀÎÎÎÎÎÙ À~ÎÎÎÎÎÎÎÎÙ À~ÎÎÎÎÎÎÎÎÙ

 

mallimuotoilu (esimerkkimuotoilu) V•K {ŒFC}

Dyadisen mallimuotoilufunktion (format by example) vasempana argumenttina on merkkivektori, joka sisältää muotoilua ohjaavat erikoismerkit 0..9 ja . sekä ,.

Muut merkkivektorin sisältämät merkit säilytetään tuloksessa sellaisinaan.

Muotoiluohjaimet toimivat seuraavasti:

. desimaalierottimen sijainti (numerojonon osana)
, tuhaterottimen sijainti (numerojonon osana)
0 täytä nollilla tähän asti
1 etumerkkimerkintä negatiiviselle luvulle
2 etumerkkimerkintä positiiviselle luvulle
3 käytä etumerkkimerkintää (yhdessä ohjainten 1 tai 2 kanssa)
4 vaihda ohjainten 1, 2 tai 3 toiminta päinvastaiseksi
5 standardi lukumuotoilu
6 kenttäerottimen käsittely
7 eksponenttimuodon ilmaisin
8 välilyöntipositioiden täytönilmaisin
9 täytä nollilla tai välilyönneillä tähän asti.
 
('50. 50. 5555'•ŒTS[3 2 1])~' ' © päiväys

10.8.1997

'HINTA: 5550.50 mk'•123.45

HINTA: 123.45 mk

 

APL2-perusnäppäimistö

 

 

 

APL2-järjestelmämuuttujia ja -funktioita

ŒAF (Atomic Function)

Muuntaa argumentin kokonaislukuindeksit vastaaviksi ŒAV:n (nolla-alkuisiksi) merkeiksi; merkkiargumentit muunnetaan vastaaviksi indekseiksi.

ŒAT (Attributes)

Lisätietofunktio: Palauttaa oikean argumentin nimilistan objekteista vasemman ohjainargumentin mukaisia tietoja.
Vasen ohjainargumentti voi olla joku kokonaisluku 1-4.

ŒEA (Execute Alternate)

Ehdollinen suoritus: Suorittaa dyadisen funktion oikean tekstiargumentin.
Virhetilanteessa suoritetaan vasen tekstiargumentti.

ŒEC (Execute Controlled)

Hallittu suoritus: Suorittaa monadisen funktion tekstiargumentin.
Tuloksena on sisäkkäinen vektori: (lauseketyyppi) (virhekoodi) (lausekkeen tulos).

ŒEM (Error Message)

Virheviesti, kolmirivinen tekstimatriisi.

ŒFC (Format Control)

Muotoilumerkistö: tekstivektori, jossa ovat muotoilussa tulostuvat desimaalierotin, tuhaterotin, täyte-, ylivuoto-, välilyönti- ja negatiivisuusmerkki.
Oletusarvona '.,*0_¯'.

ŒNC (Name Classification)

Nimiluokka: kertoo argumenttinsa (merkkimatriisi tai -vektori) objektiluokan (¯1/0/1/2/3/4 = väärä syntaksi/ei käytössä/riviosoite/muuttuja/funktio/operaattori).

ŒNL (Name List)

Nimiluettelo.
Oikea argumenttiskalaari/vektori ilmaisee sen objektiluokan, josta etsitään (1= riviosoitteet, 2 = muuttujat, 3 = funktiot, 4 = operaattorit).

ŒTF (Transfer Form)

Siirtomuoto: argumenttiobjekti siirtotiedoston mukaiseksi tekstivektoriksi tai muunnos siirtomuodosta APL-objektiksi.

ŒTC (Terminal Control)

Erikoismerkkivektori: askelpalautus-, rivinvaihto- ja rivinsiirtomerkki.

 

APL2-järjestelmäkomentoja

Osalle järjestelmäkomennoista voi APL2:ssa antaa sen nimivälin, jota komento koskee. Esimerkiksi )VARS A C tuo esille ne muuttujat, jotka alkavat kirjaimilla A, B tai C.

)HOST {cmd}

Suorita käyttöjärjestelmäkäsky cmd, tai siirry väliaikaisesti käyttöjärjestelmätasolle.

)IN atf {obj1 obj2 ..}

Lue siirtotiedosto atf joko kokonaan tai objektit obj1.. .

)NMS {C {E}}

Listaa työtilan muuttujat, funktiot ja operaattorit (jotka alkavat kirjaimilla C..E).

)OUT atf {obj1 obj2 ..}

Vie siirtotiedostoksi atf joko koko työtila tai objektit obj1,.. .

)OPS {C {E}}

Listaa työtilan operaattorit (jotka alkavat kirjaimilla C..E).

)PIN atf {obj1 obj2 ..}

Kuten )IN, mutta haetaan vain ne objektit, joiden nimiä ei ole aktiivisessa työtilassa käytössä (Protected IN).

 

APL2-idiomeja

,[0.1]V © vektorista yksirivinen matriisi
,['']V © vektorista pystymatriisi
,[¼½½K],[0.1]K © sääntiöstä matriisi (vektorista vaakamatriisi)
,[¯1‡¼½½K]K © sääntiöstä matriisi (vektorista pystymatriisi)
,/M © matriisin riveistä sisäkkäinen vektori
,šM © matriisin sarakkeista sisäkkäinen vektori
V/W © vektori (V[1]½W[1]),(V[2]½W[2]),..
(1+V='''')/V © heittomerkkien kahdennus merkkivektorista
(~(2½' ')ºV)/V © peräkkäisten välilyöntien tiivistys yhdeksi
V~' ' © välilyöntien poisto vektorista
V~V~W © vektorijoukkojen leikkaus 
V,W~V © vektorijoukkojen unioni ž
†0½›K © tyyppisääntiö
†0½›†K © prototyyppi
Vœ¨›K © hajaindeksipoiminta ("chipmunk")
›[2]M © matriisista sisäkkäinen rivivektori
(›[2]M)~¨' ' © matriisin riveistä välilyönnitön sisäkkäinen vektori
(V¬' ')›V © vektorin ositus välilyöntien mukaan
›[1‡¼½½K]K © ei-skalaarin vektorointi
K­¨›V © mitkä sisäkkäisen sääntiön solut ovat = vektori V
œ–¨›[2]M © merkkimatriisista numeerinen
œ–¨›[½½K]',',K © merkkisääntiö riveittäin numeeriseksi
œ(›¨“¨A)Þ¨A„›[½½A]A„1/A © sääntiön rivit nousevaan järjestykseen
œV © sisäkkäinen vektori (rivi)matriisiksi
³œV © sisäkkäinen vektori (sarake)matriisiksi
œ,/K1 K2 © sääntiöiden liitos riveittäin
,¨/K1 K2 © sääntiöiden alkioittainen liitos
M˜.¼' ' © matriisin riveiltä löytyvien välien ensimmäiset indeksit
IÞ¨›K © sääntiön hajaindeksointi sisäkkäisellä indeksivektorilla I
(››W)Þ[1]¨V © matriisivektorin alkioiden rivilajittelu indeksein W
(,M)„(,M)[“,(2×¼†½M)+[1]M=' '] © siirrä välilyönnit matriisin rivien loppuun
((,K='¯')/,K)„'-' © vaihda sääntiössä negatiivit miinusmerkeiksi
1œ4 ŒAT K © muuttujan koko tavuina
2 ŒAT F © funktion päivitysaikaleima

 

Kirjallisuutta

Seuraavat APL-julkaisut ovat olleet joko suoranaisina lähteinä tahi sitten muuten vaan suositeltavaa APL-luettavaa asiasta syvää tietoa halajaville.

Seppo Linnainmaan, Heikki Apiolan, Kyösti Huhtalan ja Tapio Nummen luentomonisteet.

APL-konferenssien esitelmäjulkaisut.

Gary A. Bergquist:

APL Advanced Techniques and Utilities, 1987

Per Gjerløv, Henrik E. Nyegaard (suomeksi kääntänyt Gustav Tollet):

APL-kielen opas, 1975 (IBM G075-0009-1F)

Leonard Gilman, Allen J. Rose:

APL – an Interactive Approach, 1983 (ISBN 0-471-09304-1)

FinnAPL:

Idiomikirjasto, 1984 (ISBN 951-95886-0-4)

James A. Brown:

The Principles of APL2, 1984 (IBM TR 03.247)

IBM:

An Introduction to APL2, 1988 (IBM SH20-9229-1)
APL2 Programming: Language Reference, 1988 (IBM SH20-9227-3)

James A. Brown, Sandra Pakin, Raymond P. Polivka:

APL2 at a Glance, 1988 (ISBN 0-13-038670-7)

Juha Haataja:

APL2-ohjelmointikielen käyttöopas, 1989

Norman D. Thomson, Raymond P. Polivka:

APL2 in Depth, 1995 (ISBN 0-387-94213-0)

 

Lisäksi lehtiä:

Suomen APL-yhdistys: APL-Uutiset

British APL Association: Vector

ACM/SigAPL: Quote Quad