A nyelv dinamikus típusrendszerrel rendelkezik, ami azt jelenti, hogy egy változónak nincs típusa, csak a változó értékének lehet típusa. A változók úgy viselkednek, mint az értékek (objektumok) konténerei, így egy változó tartalmazhat egy integer objektumot most, és később egy stringet, ellentétben a típusos nyelvekkel, mint a C++, Java és sok más, ahol a változó nevével deklarálunk kell a típusát is. A dinamikus típusrendszrrel rendelkező nyelvek nagy rugalmasságot adnak a programozónak ( könnyen készíthetők általános (generic) adatszerkezete, pl. listák, fák ), azon az áron, hogy elveszatjük a fordítási időben történő tapus ellenőrzés előnyeit, mivel az ellenőrzések csak futási időben lehetségesek. A változókat minden esetben deklarálni kell, a local, a static, a public, vagy a private kulcsszó segítségével. A nyelv 5 típust különböztet meg, ezek a skalár (egész, lebegőpontos, logikai, karakter, string), a tömb, az asszociatív tömb, a szimbólum, és az osztály (objektum).
Egy skalár típusú változónak értékül lehet adni bármilyen másik skalárt, ugyanis a skalárokat azonos belső ábrázolási formában tárolja.
A tömbök tetszőleges számú és tetszőleges típusú elemeket tárolhatnak, egy tömbnek eleme lehet egy másik tömb vagy akár egy hashtábla is, így bármilyen összetett adattípus könnyen megvalósítható a nyelvben.
local a = #[1,3.14,'e',"alma",#['a','b'],%["ég","kék","fű","zöld"],#szimbólum];
Egy tömb létrehozásakor a '#' jelöli a fordító számára, hogy új tömböt kell létrehozni, ennek a szimbólumnak a hatására hívódik meg a tömb konstruktora. A tömbök mindig 0-tól indexelődnek egész számokkal, de egy szintaktikai cukorka miatt a negatív számokkal való indexelés sem okoz hibát, hanem ezt a fordító úgy értelmezi mintha a tömböt hátulról kezdve, visszafelé szeretnénk indexelni, a negatív index abszolútértéke+1-el.
a[0] //értéke 1
a[1] //értéke 3.14
a[4] //értéke az ['a','b'] tömb
a[4][0] //értéke 'a'
a[5]["ég"] //értéke "kék"
a[-1] //értéke #szimbólum
a[-5] //értéke 'e'
A nyelv megengedi, hogy a tömböket nem konstans kifejezéssel inicializáljuk.
Az asszociatív tömbök kulcs érték párok tárolására szolgálnak. Egy hashtáblának az elemei is tetszőleges típusúak lehetnek, akár a kulcs akár az érték lehet tömb vagy másik hashtábla is.
local b = %["ég", "kék",#[1,2],"egy-kettő"];
Az asszociatív tömbök a kulcshalmazuk elemeivel indexelhetőek. Ha olyan kulccsal indexeljük, amely nem eleme a kulcshalmaznak akkor létrejön egy új hashbeli elem a megadott kulccsal és @nil értékkel.
b[#[1,2]] //értéke "egy-kettő"
b[3.14]=#Pi //létrejön egy új kulcs érték pár (3.14, #Pi)
A modulokat, függvényeket, osztályokat a fordító bájtkódra fordítja, és ezeket a kódokat is eltárolhatjuk egy skalár változóban, így függvényeket, de akár csomagokat is átadhatunk egy függvénynek paraméterül egy skalár változón keresztül. Pl.:
package trunky2;
import basic;
function trunky()
{
local funky; //skalár változó
static v = 0;
v = v + 1;
funky = function() { //létrejön egy név nélküli függvény, és
basic.print( v, '\n' ); //a függvény bájtkódja belekerül a skalár változóba
};
return funky; //ez lehet visszatérési érték is
}
local func;
func = trunky();
basic.print( func, '\n' ); //kiírhatjuk magát a bájtkódot,
func(); //de meg is hívhatjuk, mint függvény
package tipusok; import basic; // egy változó létrehozása local v; // egy egész basic.print( 5, '\n' ); // lebegő pontos basic.print( 12.45, '\n' ); // egy karakter basic.print( 'a', '\n' ); // logikai érték basic.print( @true, '\n' ); // egy szimbólum basic.print( #aSymbol, '\n' ); // egy karakterlánc basic.print( "Egy egyszerű karakterlánc", '\n' ); // egy tömb v = #[ 1, 'a', 20.5, "ABCD" ]; basic.print( v, '\n' ); basic.print( v[3], '\n' ); // egy asszociatív tömb v = %[ "szin", "narancs", "suly", 12 ]; basic.print( v["weight"], '\n' ); basic.print( v["color"], '\n' );
5 12.45 a @true #aSymbol Egy egyszerű karakterlánc [1, 'a', 20.5, "ABCD"] ABCD 12 narancs