A Snobol programozási nyelv

Típusok, típuskonstrukciók

Elemi típusok

Integer

Értéke -32767 és +32767 között lehet, idézőjelek nélkül kell megadni.
Például:

OUTPUT = 42 * 42 OUTPUT = -825 * -825 OUTPUT = 73768 * Compilation error: Erroneous integer, re-enter:

Real

A Vanilla SNOBOL4 még nem tartalmazza a valós számokat, viszont a SNOBOL4+ már igen. Megengedett az 'integer.0' (pl.: 5.0) és az 'integer.' (pl.: 5.) forma, de vigyázat, mivel a SNOBOL-ban a '.' egy operátor, ezért a '.integer' (pl.: .7) nem megengedett, ehelyett: '0.integer' (pl.: 0.7). A számokat meg lehet adni exponenciális formában is (pl.: 1.23456E2 = 123.456).

A 'valós' számokon kívül, még 3 nem valós szám is értelmezve van: INFINITY (végtelen), -INFINITY, NAN ('not a number').

1.0 / 0.0 * eredmény: INFINITY 5.0 - INFINITY * eredmény: -INFINITY INFINITY - INFINITY * eredmény: NAN 0.0 / 0.0 * eredmény: NAN

Egy-két valós függvényt is bevezettek a nyelvbe: ln(), exp(), chop().

String

A string karakterek rendezett sorozata, de fontos, hogy az 'AB' és 'BA' stringek különbözőek. Normális esetben egy string hossza maximum 5000 karakter lehet, de ennek ellenére rá tudjuk venni a SNOBOL-t hosszabb karakterek kezelésére is. A nulla hosszúságú stringet null stringnek hívjuk, és így jelöljük: ''. Egy stringet aposztrófok (') vagy idézőjelek (") közé kell tenni, de nem lehet keverni, vagyis a kezdő jelnek és a vége jelnek meg kell egyeznie.

OUTPUT = 'STRING LITERAL' * STRING LITERAL OUTPUT = "So is this" * So is this OUTPUT = '' * -- üres string OUTPUT = 'WHO COINED THE WORD "BYTE"?' * WHO COINED THE WORD "BYTE"? OUTPUT = "WON'T" * WON'T

Típuskonstrukciók

Tömb

A tömbök használata lehetővé teszi, hogy egyetlen változónévvel meghatározzunk több adatelemet. A tömbelemek bármilyen adattípust tartalmazhatnak a többi tömbelemtől függetlenül. A tömbök létrehozása a program végrehajtása alatt történik, nem fordítási időben. A tömbök méretét bármikor módosíthatjuk vagy törölhetjük őket.

Tömbök létrehozása

A tömböket az ARRAY függvény hozza létre, melynek a tömb méreteit tartalmazó stringet kell megadni. A függvény visszatérési értéke egy tömb mutató (array pointer). ARRAY a tömbelemeket a null stringre inicializálja, de megadhatunk nekik más értékeket is.

Például:

list = ARRAY('25') * ez egy 25 elemű vektor box = ARRAY('12,3') * ez egy 12×3-as mátrix

A tömbelemekre kétféleképpen hivatkozhatunk: a <> és [] zárójelekkel.

Például:

LIST<3> = 'MAPLE' BOX[10,2] = 3 LIST[33] = 4 * Failure OUTPUT = LIST[3] LIST[4] BOX<10,2> * MAPLE3

A kacsacsőrök és a szögletes zárójelek használata között nincs különbség. A tömbnevek valóban pointerek:

B = LIST OUTPUT = B[3] * MAPLE B<3> = 'WILLOW' OUTPUT = LIST<3> * WILLOW

A COPY függvénnyel készíthetünk a tömbről másolatot.
A tömbelemeken való végiglépegetéshez nem kell tudnunk a tömb méretét. Addig lépegetünk, amíg a tömbelemre mutatás műveletének eredménye failure nem lesz:

I = 0 PRINT I = I + 1 OUTPUT = SCORE[I] :S(PRINT) ...
Tömb inicializálása

Az ARRAY függvény a tömb összes elemét a második argumentum értékére állítja be:

A = ARRAY('2,3,4','PA-18') OUTPUT = A[1,2,3] * PA-18, mindegyik tömbelem a 'PA-18' lesz
Tömbhatárok

Általában 1-től a megadott értékig. De ha nekünk ez nem tetszik, magunk adhatjuk meg a tömb alsó és felső határát. Az ARRAY első argumentuma az alábbi általános formában írható fel:

'L1:H1,L2:H3,...,Ln:Hn'

Értelemszerűen az 'L' az alsó indexhatárt, míg a 'H' a felső indexhatárt jelöli, a számok pedig a dimenziót.
Például:

A = ARRAY('-2:2','PIPER') OUTPUT = A[-1] * PIPER OUTPUT = A[3] * Failure

Tábla

A tábla egy egyszerű egydimenziós tömb, két fontos eltéréssel. Először is, a tábla mérete nem kötött; automatikusan nő a mérete, ahányszor új elemet adunk hozzá. Másodszor, a tábla indexe nincs az integerekre korlátozva, bármilyen SNOBOL4 adattípus lehet. Stringeket és mintákat ugyanúgy használhatjuk indexnek, mint az integereket. A tábla típus gyakorlatilag egy elempárokat tartalmazó asszociatív tábla. Táblákat a TABLE függvénnyel hozhatunk létre. A függvény visszatérési értéke egy tábla pointer.

Például:

T = TABLE() T['ROSE'] = 'RED' T['N'] = 6 OUTPUT = T['N'] T['THE'] T['ROSE'] * 6RED FLOWER = 'ROSE' T[FLOWER] = T[FLOWER] ',THORNS' OUTPUT = T[FLOWER] *RED,THORNS

Ebben a példában stringeket használtunk a tábla indexeként. A T['THE'] értéke automatikusan a null string lesz.

Konverziók táblák és tömbök között

Ha a tábla elemeit egy fájlba szeretnénk írni, akkor jó lenne valahogy rendszerezni ezeket az adatokat. Semmi gond - konvertáljuk a táblát tömbbé. A tömb egy N x 2-es mátrix lesz, vagyis N sorral és 2 oszloppal fog rendelkezni. Az 1. oszlop a tábla indexeket tartalmazza, míg a 2. a megfelelő tábla adatokat. N a bejegyzések száma a táblába, nem 0 az értéke. A konvertálás a CONVERT függyvénnyel történik, mely igényel egy tábla argumentumot és az 'ARRAY' szót, és visszatérési értéke egy új tömbre mutató pointer lesz. Folytassuk a következő példával:

A = CONVERT(T, 'ARRAY') * Success OUTPUT = A[1,1] '-' A[1,2] * ROSE-RED,THORNS OUTPUT = A[2,1] '-' A[2,2] * N-6

A SNOBOL4-t megismerve már nem lepődünk meg azon, hogy a konvertálás visszafelé is megtehető, a tömbből táblává való konvertálás szintén lehetséges:

W = CONVERT(A, 'TABLE') * Success OUTPUT = W['ROSE'] * RED,THORNS

Változók

Néhány egyszerű programrészlet:

ABC = 'EGG' OUTPUT = ABC * EGG D = 'SHELL' OUTPUT = abc d * EGGSHELL -- az 'abc d' ugyanaz, mint az 'ABC D'

Operátorok

Számos operátor található a SNOBOL4-ben, sőt saját operátorok definiálása is megengedett. Most a legegyszerűbb egy- és kétoperandusú operátorokkal fogunk foglalkozni. Fontos megjegyezni, hogy az operátorok jele előtt és után szünetet kell hagyni!

Megjegyzés: a bináris operátoroknál a legmagasabb prioritása a hatványozásnak van, utána következik a szorzás, majd az osztás, és végül az összeadás és a kivonás. Általában a programozási nyelvekben a szorzás és az osztás hasonló precedenciájú, SNOBOL-ban ez nem így van, a szorzásnak nagyobb a prioritása.

OUTPUT = 3 - 6 + 2 * -1 OUTPUT = 2 * (10 + 4) * 28 OUTPUT = 7 / 4 * 1 OUTPUT = 3 ** 5 * 243 OUTPUT = 10 / 2 * 5 * 1

Megjegyzés: a *, /, + és a - kiértékelése balról jobbra történik, míg a ** operátornál jobbról balra.

OUTPUT = 24 / 4 / 2 * 3 OUTPUT = 2 ** 2 ** 3 * 256

Megjegyzés: a következő példákon keresztül megismerkedhetünk a SNOBOL kivételes adottságaival, a rendszer automatikusan konvertálja az operátornak megfelelő adattípust, legalábbis megpróbálja, hiszen látni fogjuk, hogy nem lehetséges ez mindig. A null string a 0 integerré konvertálódik.

OUTPUT = 14 + '54' * 68 -- integer és string összeadása OUTPUT = 14 + ' 54' * Execution error #1, Illegal data type * Failure -- nem tudja a ' 54'-et integerré konvertálni a szóköz miatt OUTPUT = 'A' + 1 * Execution error #1, Illegal data type * Failure OUTPUT = 'CONCAT' 'ENATION' * CONCATENATION -- a konkatenáció operátor egyik jele a szóköz OUTPUT = 'A' 'B' 'C' * ABC OUTPUT = (20 - 17) ' DOG NIGHT' * 3 DOG NIGHT -- automatikus típuskonverzió integerből stringgé OUTPUT = 19 (12 / 3) * 194 -- konkatenáció, és nem szorzás, ez így korrekt! OUTPUT = (20 - 17) '' * 3 -- teljesen logikus, nincs mit konkatenálni OUTPUT = +'' * 0 OUTPUT = -(3 * 5) * -15

Indirekt referencia

A program végrehajtása alatt új változókat hozhatunk létre, és meglevőekre referálhatunk karakterstringekből létrehozott változónevekkel. Az indirekt referencia unáris operátor, jele a dollárjel ($). Ha ezt változóra alkalmazzuk, akkor a változó tartalmát használja változónévként - és ez egy másik változó lesz.

Például:

DOG = 'BARK' CAT = 'MEOW' ANIMAL = 'CAT' OUTPUT = $ANIMAL * MEOW ANIMAL = 'DOG' OUTPUT = $ANIMAL * BARK

Példa új változó létrehozására:

$DOG = 'RUFF' OUTPUT = BARK * RUFF

Az indirekt referenciák bármilyen mélységben egymásba ágyazhatók. Null string nem szerepelhet változónévként.

Alkalmazások:

További operátorok