A Harbour erősen típusos, típus biztonságos nyelv. Dinamikus típusellenőrzés jellemzi. Tíz beépített adattípus van a Harbourban.
A skalár típusok egyetlen értéket hordoznak. Ez lehet szám, szöveg vagy akár egy másik típusra utaló referencia. A Harbourban hat elemi típus létezik:
NIL
."bla"
, 'bla'
, [bla]
.0d20110102
..T.
, a hamisat .F.
jelöli.1
, 1.1
, -1
, 0xFF
.Összetett típusból a Harbourban négy van definiálva:
{ "String"", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
.{ |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
.{ "Name" => "John", 1 => "Numeric key", { "Nested" => "Hash" } }
.Minden típushoz megnevezhetünk változókat. Az alábbi négy hatáskör valamelyike vonatkozhat egy változóra:
A LOCAL és a STATIC változók fordítási időben kerülnek kiértékelésre. Kiértékelésük sokkal gyorsabb, mint a PRIVATE vagy a PUBLIC változóké, amelyek dinamikus elérésűek, és futási időben értékelődnek ki. Ugyanezért a LOCAL és STATIC változók nem kerülnek a makró fordítóhoz, és minden makró kód, amely rájuk hivatkozik, runtime errort fog okozni. A PRIVATE és PUBLIC változók dinamikus természetükből adódóan futási idő alatt hozhatók létre és távolíthatóak el, érhetőek el és módosíthatók runtime makrókkal és CodeBlockokkal.
A Macro Operator („&”) futásidejű fordító, jellemzően hatékony része az xBase nyelveknek. A Harbour implementációja a Macro Operatorra lehetővé teszi a futási idejű fordítást bármely érvényes Harbour kifejezés esetén. Bármely lefordított kifejezés használható úgy, mint egy érték az értékadás jobb oldalán, de érdekes módon használható balérték kiértékelésére is (PRIVATE és PUBLIC változók, vagy adatbázis mezők). A Macro Operator lefordíthatja, és egyúttal végrehajthatja a függvényhívásokat, az értékadásokat is. A makró eredménye a lefordított applikációban kiértékelésre használható. Bármely Harbour program kiterjeszthető és módosítható futási időben, és igény szerint bővíthető további kóddal.
Szintaxisa a következő:
&( … )
: a zárójelen belüli szöveg le lesz fordítva, és a végrehajtott kód eredményéül kapott érték lesz az eredmény.&SomeId
: rövid megfelelője a &( SomeId )
kifejezésnek.&SomeId.postfix
: rövid megfelelője a &( SomeId + "postfix" )
kifejezésnek.