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.
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:
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).
type size char type num type notation null value boolean 1 b 1 1b 0b byte 1 x 4 0x26 0x00 short 2 h 5 42h 0Nh int 4 i 6 42 0N long 8 j 7 42j 0Nj real 4 e 8 4.2e 0Ne float 8 f 9 4.2 0n char 1 c 10 "z" " " symbol * s 11 ‘zaphod ` month 4 m 13 2006.07m 0Nm date 4 d 14 2006.07.21 0Nd datetime 4 z 15 2006.07.21T09:13:39 0Nz minute 4 u 17 23:59 0Nu second 4 v 18 23:59:59 0Nv time 4 t 19 09:01:02:042 0Nt enumeration * `u$v dictionary 99 `a`b`c!!10 20 30 table 98 ([] c1:ab`c; c2:10 20 30)
Megjegyzésekhez a / karaktert használja a q. A komment a / karaktertől a sor végéig tart:
A / karakter baloldalán még szükséges, hogy legyen egy whitespace karakter:
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:
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:
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:
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.
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:
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) |