A q programozási nyelv

Nyelvi elemek

Jelkészlet

A rendszer az ASCII karaktereket használja. Megkülönbözteti a kis- és nagybetűket, ezek használatára nem ad ajánlást, kivéve csak annyit, hogy konzisztensen használjuk.

Azonosítók

Egy változó nevének betűvel kell kezdődnie, amit követhet betű, szám, aláhúzásjel, és így tovább. Valamint a következő ajánlások érvényesek változó neveinél:

Literálok

A következő táblázat tartalmazza a q beépített típusokról szóló információkat. Érdekesség a nyelvben, hogy a különböző típusok null-értékeit különbözőképpen kell jelölni. A számtípusoknak van továbbá végtelen értékük (egész: 0W, lebegőpontos: 0w), amelyek jól viselkednek az összehasonlítás során. Azonban ezeknek a speciális értékeknek is meg kell feleltetni egy-egy bitmintát, így a szokásosnál kevesebb igazi számérték tartozik a típusok értékkészletébe (kivéve a real és float típusokat, ahol az IEEE 754 szabvány eleve tartalmaz bitmintákat ezekre a szélsőséges értékekre is).

typesizechar typenum typenotationnull value
boolean1b11b0b
byte1x40x260x00
short2h542h0Nh
int4i6420N
long8j742j0Nj
real4e84.2e0Ne
float8f94.20n
char1c10"z"" "
symbol*s11‘zaphod`
month4m132006.07m0Nm
date4d142006.07.210Nd
datetime4z152006.07.21T09:13:390Nz
minute4u1723:590Nu
second4v1823:59:590Nv
time4t1909:01:02:0420Nt
enumeration *`u$v
dictionary 99`a`b`c!!10 20 30
table 98([] c1:ab`c; c2:10 20 30)

Megjegyzések

Megjegyzésekhez a / karaktert használja a q. A komment a / karaktertől a sor végéig tart:

a: 42 / ez már komment

A / karakter baloldalán még szükséges, hogy legyen egy whitespace karakter:

a:42/ megjegyzésnek szánva, de hiba

Változók

A q-ban nem kell előre deklarálni a változókat. A változó akkor jön létre, amikor értéket adunk neki a : (kettőspont) operátorral:

n:42

A változónak nincs típusa, csak a benne tárolt értéknek van. Így ha egy változónak értékül adunk egy másik típusú értéket, nem kapunk hibaüzenetet.

A nyelv lehetőséget ad a változók névterekbe szervezésére. A névterek neve ponttal kezdődik, valamint a névteres változóhivatkozás tagjait is pont választja el:

.foo.bar:42

Ez az utasítás a .foo nevű névtéren belül a bar nevű változónak értékül adja a 42-t. Minden utasításban van egy alapértelmezett névtér, amely az operációs rendszerek aktuális könyvtár fogalmához hasonlít. A \d rendszerparanccsal változathatjuk meg:

\d .foo

Ezután az összes, névtérnevet nem tartalmazó változónevet a .foo névtérben fog keresni vagy létrehozni a q. A névtérfa gyökerére való visszaváltáshoz használjuk a "\d ." parancsot.

Operátorok, kifejezések

q-ban a kifejezések háromféle elemből épülnek fel. Ezek az ige (verb), főnév (noun) és módosítószó (adverb). Általában a változónevek főnevek, a beépített operátorok (pl. +, -) igék, valamint van néhány beépített módosítószó, amelyekről a függvényekről szóló fejezetben olvashatunk.

Az osztás jele szokatlanul a %, mivel a / jel általában a komment jele. Kezdő q programozók számára meglepő lehet az alábbi eredmény:

2*3+1 8

A q-ban ugyanis nincs precedencia, és minden operátor jobbra asszociatív. A fenti kifejezésben tehát először a 3+1 kerül kiszámításra, ezután az eredmény (4) szorzódik 2-vel, így kapunk 8-at. Bár aritmetikai kifejezéseknél szerencsétlen ez a jelölés, funkcionális stílusú programokban hasznos: ha egy kifejezés elé beírunk egy függvénynevet, akkor az az egész kifejezésre fog vonatkozni. Ha nem ezt akarjuk, használhatunk gömbölyű zárójeleket a csoportosításhoz. Angolul ennek a kiértékelési módnak a neve "left of right", amit nagyjából "bal oldal (ti. függvény) a jobb oldal (ti. argumentum) helyen".

A q legfontosabb operátorai a következők:

+ - * %(bináris) aritmetikai műveletek
&minimum, logikai ÉS
|maximum, logikai VAGY
=(atomi) egyenlőség
~strukturális egyenlőség
,konkatenáció
$típuskonverzió
@applikáció, indexelés (egy argumentummal)
.applikáció, indexelés (több argumentummal)
?keresés; véletlen szám generálása
#megtartás (take)
_törlés (drop)