Az Afnix programozási nyelv

Típusok

Egyszerű típusok

Integer

Az egyszerû diszkrét skalár típus az Integer. Az Integer egy 64 biten reprezentált elõjeles típus. 32 bites rendszerben használva is a 64 bites reprezentácíót használja az Afnix. Ha ennél nagyobb számot szeretnénk tárolni, akkor a Relatif típust lehet használni.

Az alapértelmezett integer literál forma a decimális jelölés. A mínusz jel jelzi a negatív számokat. Lehet használni hexadecimális ill. bináris jelölést, 0x ill. 0x prefixxel. A jelölésben a jobb olvashatóság érdekében alkalmazhatunk aláhúzás jelet.

const a 123 trans b -255 const h 0xff const b 0b1111_1111

Az Integer érték a literál jelölést felhasználva jön létre egy implicit Integer példány felhasználásával. Az Integer osztálynak vannak beépített konstruktorai, az alapértelmezett konstruktor létrehoz egy Integer objektumot és nullára inicializálja, a többi konstruktor egy Integer, Real, Character vagy String értéket vesz alapul.

const a (Integer) const b (Integer 2000) const c (Integer "23")

Hexadecimális vagy bináris jelölés használatánál ügyelni kell a negatív Integer értékekre. A 0x_8000_0000_0000_0000 a legkisebb negatív érték.

A standard aritmetikai operátorok használhatók beépített operátorként.

+ 3 4
- 3 4
- 3
* 3 4
/ 4 2

Beépített objektumként az Integer objektumhoz tartoznak különbözõ beépített metódusok. Az alábbi példa mutatja ezeket a metódusokat.

trans i 0 i:++ i:-- i:+ 4 i:= 4 i:- 1 i:* 2 i:/ 2 i:+= 1 i:-= 1 i:*= 2 i:/= 2

Az összehasonlító operátorok hasonlóképpen mûködnek. A különbség, hogy mindig egy Boolean értékkel térnek vissza.

== 0 1 != 0 1

Az aritmetikai metódusokhoz hasonlóan az összehasonlító operátorok is támogatva vannak metódusként is.

i:= 1 i:== 1 i:!= 0

Relatif

A Relatif vagy ’nagy-szám’ típus egy Integer végtelen precizitással. Hasonlóképpen mûködik, mint az Integer, de végtelen hosszúságú számokkal is. A Relatif jelölésére r vagy R suffixet használhatunk.

const a 123R trans b -255R const c 0xffR const d 0b1111_1111R const e (Relatif) const f (Relatif 2000) const g (Relatif "23")

Real

A Real osztály a lebegõpontos számok reprezentálására szolgál. A reprezentáció rendszerfüggõ, de alapvetõen az IEEE 754-1985 szabványban megfogalmazott dupla 64 bites lebegõpontos reprezentációt követi. A Real támogat minden operációt, amit az Integer.

Az AFNIX két fajta literál reprezentációt támogat a Real esetében. Az elsõ a szokásos tizedespontos forma, a második a tudományos forma.

const a 123.0 # a positive real const b -255.5 # a negative real const c 2.0e3 # year 2000.0

A Real számok konstruálása hasonlóképpen történik, mint az Integer esetében, az alapértelmezett konstrukor 0.0-ra inicializálja az értéket. A beépített operátorok, metódusok is hasonlóak az Integer esetében leírtakhoz.

trans r 0.0 # 0.0 r:++ # 1.0 r:-- # 0.0 r:+ 4.0 # 4.0 r:= 4.0 # 4.0 r:- 1.0 # 3.0 r:* 2.0 # 8.0 r:/ 2.0 # 2.0 r:+= 1.0 # 5.0 r:-= 1.0 # 4.0 r:*= 2.0 # 8.0 r:/= 2.0 # 4.0

Character

A Character reprezentálása a Unicode szabványban megadott 31 bites reprezentáció szerint történik (ISO 10646).

A szokásos aposztrófos jelölést használhatjuk a karakterek megadására.

const LA01 'a' # the character a const ND10 '0' # the digit 0

Minden a Unicode kódszetben megadott karaktert támogatja az AFNIX. A Character konstruálása a megadott Character literál alapján vagy egy explicit Character példány alapján történik. Az alapértelmezett konstruktor egy null Charactert hoz létre. A többi konstruktor egy Integer, Character vagy String értéket vesz alapul. Itt a String lehet egy sima idézõjeles karakter vagy az U+ hexadecimális jelõlés. Például az U+40 String a @ karaktert jelöli.

const nilc (Character) # null character const a (Character 'a') # a const 0 (Character48) # 0 const mul (Character "*") # * const div (Character "U+40") # @

A Character olyan, mint egy Integer, a 0 – 0x7FFFFFFF tartományon. A Character atitmetika egyszerûbb, mint az Integer aritmetika és nincs túlcsordulás ellenzõrzés. Az aritmetikai operátorok egy Integer értéket vesznek paraméterül.

+ 'a' 1 # 'b' - '9' 1 # '8'

Az Integerhez hasonlóan itt is használhatjuk a Character objektum metódusait.

trans c 'a' # 'a' c:++ # 'b' trans c '9' # '9' c:-- # '8' c:+ 1 # '9' c:- 9 # '0'

A Character objektumnál használhatunk még más metódusokat is, ezek fõleg konverzióra szolgálnak.

const LA01 'a' # 'a' const ND10 '0' # '0' LA01:to-string # "a" LA01:to-integer # 97 LA01:alpha-p # true ND10:digit-p # true

String

A String objektum az egyik legfontosabb beípített objektum az AFNIX-ban, a String egy Unicode karakterekbõl álló vektor. A szokásos dupla idézõjeles jelölést használhatjuk a Stringek megadására.

const hello "hello"

Bármilyen literál objektumot használhatunk String konstruálására. Ez azt jelenti, hogy Integer, Real, Boolean ill. Character objektumok érvényesek String konstruálásakor. Az alapértelmezett konstruktor egy null Stringet állít elõ.

const nils (String) # "" const one (String 1) # "1" const a (String 'a') # "a" const b (String true) # "true"

A String esetében is különbözõ beépített metódusok állnak rendelkezésünkre.

const h "hello" h:length # 5 h:get 0 # 'h' h:== "world" # false h:!= "world" # true h:+= " world" # "hello world" const msg "hello world" msg:sub-left 5 # "hello" msg:sub-right 6 # "world" const str "hello:world" const vec str:split ":" # "hello" "world" println (vec:length) # 2 const pi 3.1415926535 # 3.1415926535 const val (pi:format 4) # 3.1416 val:fill-left '0' 9 # 0003.1416

Összetett típusok

Ebben a fejezetben a beépített tároló objektumok leírása található, iterálható objektumoké, mint a Cons, List és a Vektor, ill. speciális objektumoké, mint a Queue és a Bitset.

Cons

Eredetileg a Cons objektum (vagy cons elem) volt a Lisp vagy Scheme rendszerek alap objektuma. A cons elem a List felépítõ blokkja. A cons elem tartalmaz egy objektumot és egy mutatót a következõ cons elemre. A cons elem objektumát car-nak a mutatót cdr-nek nevezik.

Az alapértelmezett konstruktor egy cons elemet hoz létre, nil objektummal inicializálva. A konstruktor kaphat egy v. több paramétert is.

const nil-cons (Cons) const lst-cons (Cons 1 'a' "hello")

A konstruktor bármilyen fajta objektumot kaphat paraméterül, ez alapján beszélhetünk homogén ill. heterogén listéról.

const blist (protect ((1) ((2) ((3)))))

A Cons objektumnak is léteznek különbözõ beépített metódusai.

const c (Cons "hello" "world") c:length # 2 c:get-car # "hello" c:get-cadr # "world" c:get 0 # "hello" c:get 1 # "world"

List

A List beépített objektum kétirányú listák használatát teszi lehetõvé, támogatja az elõre ill. visszafele történõ iterációt.

A List a Conshoz hasonlóan konstruálható, de a Consal ellentétben a List lehet nulla hosszúságú.

const nil-list (List) const dbl-list (List 1 'a' "hello")

A List objektum metódusai hasonlóak a Cons metódusaihoz.

const list (List "hello" "world") list:length # 2 list:get 0 # "hello" list:get1 # "world" list:append "folks" # "hello" "world" "folks"

Vector

A Vector beépített objektum objektumok indexelt tömbjének használatát teszi lehetõvé. A Vector objektumban is van lehetõség mindkét irányban történõ iterációra.

A Vector konstruálása is a Conshoz hasonlóan történik, az alapértelmeztt konstruktor egy Vectort hoz létre 0 objektummal.

const nil-vector (Vector) const obj-vector (Vector 1 'a' "hello")

A Vector objektum metódusai a Cons metódusaihoz hasonlóan használhatóak.

const vec (Vector "hello" "world") vec:length # 2 vec:get 0 # "hello" vec:get 1 # "world" vec:append "folks" # "hello" "world" "folks" vec:set 0 "bonjour" # "bonjour" "world" "folks"

Set

A Set beépített objektum, objektumok halmazban történõ tárolását teszi lehetõvé. A Set objektum is iterálható, de csak elõrefele. A Set egyik tulajdonsága, hogy egy objektum csupán egyszer szerepelhet, egy objektum kétszeres hozzáadása esetén csak egy objektumot kapunk eredményül. A Set konstruálása hasonlóképpen történik, mint a Vector konstruálása, az alapértelmezett konstruktor egy Set-et hoz létre 0 objektummal.

const nil-set (Set) const obj-set (Set 1 'a' "hello")

A Set metódusai hasonlóak a Vector metódusaihoz.

const set (Set "hello" "world") set:get-size # 2 set:add "folks" # "hello" "world" "folks"