# &kommander;i uus parser

## Uue parseri dokumentatsioon

Uus parser lisati &kommander;isse versioonis 1.2, mis nägi ilmavalgust KDE 3.4 koosseisus. Käesolev dokument pidi algselt kirjeldama kõiki uue parseri omadusi. Nüüd, kus KDE 3.5.9 koosseisus on välja lastud &kommander; 1.3, on uus parser juba vaikimisi kasutusel, välja arvatud peaaknaga (MainWindow) rakenduste puhul, mis luuakse &Qt; Disaineris. Et uus parser on tunduvalt võimekam, ilma vanale parserile omase pesastamise piiranguta ning väga paljude uute omadustega, soovitame tungivalt seda kasutada.

&kommander;ist endast siin juttu ei tule. Kui soovid teada saada, mis on &kommander;, kuidas luua dialooge ja kuidas manipuleerida käitusajal vidinatega, uuri käsiraamatu teisi osi.

## Vana parser

Alljärgnevalt võrdleme kaht parserit. Kuigi me soovitame üldjuhul uut parserit, on ka vana endiselt toetatud ja kasulikki, eriti kui asi puudutab teiste skriptikeelte kasutamist.

### Vana parser

Vana parser oli tegelikult makroparser. Tunnustati ainult stringe, mille alguses seisis @, mida siis parsiti loogiliselt ja laiendati.

    @LineEdit1.setText(@ListBox.selection)

Kõige selle aluseks olev funktsionaalsus (kohalikud muutujad, avaldised,failide manipuleerimine) tuli teha mõnes teises skriptikeeles, näiteks Bash. Ehkki &kommander;i eesmärk on toetada kõiki skriptikeeli, mis on juba praegu teatud määral võimalik, oli vaja kiirest ja natiivset skriptikeelt, mis oleks kindlasti porditav. Vana parseri suurim probleem oli see, et &kommander;i erisid hinnati enne koodi edastamist skriptikeelel, mis muutis võimatuks nende kasutamise silmustes ja tingimustes.

Arendajate meelest ei ole bash kuigi kiire ega uutele kasutajatele mõistetav, vana parser aga oli algselt just bash, mis kutsus välja DCOP-i. Et &kommander; tahab olla programmeerimiskeeltest sõltumatu, tekkis vajadus muudki kui funktsioonid ise teostada.

### Uus parser

Uus parser on täielik parser. See parsib kogu skripti, mitte ainult funktsioone. Et meid huvitab eelkõige graafiline kasutajaliides, mitte aga skriptikeeled ise, tuli teha kompromisse. Seepärast leiad kindlasti, et &kommander;i skriptid suudavad toime tulla kõigi peamiste ülesannetega ning neid on lihtne ja hõlpus kasutada. Kõike sinu loodut koondab endasse Funktsioonisirvija. Funktsioonisirvija mõte on võimaldada &kommander;i uustulnukatest kasutajatel ligi pääseda kõigele, mida vaid vaja. Põhimõtteliselt sarnaneb see mõnevõrra näiteks tabelarvutusrakenduses KSpread kasutatava sirvijaga, mis aitab valida funktsioone ja sisestada neisse vajalikke parameetreid.

Kui soovid ära kasutada mõne teise skriptikeele funktsionaalsust, saab neid kaasa &kommander;i skriptiobjektidesse vastava päisekirjega. Funktsioonisirvija aitab sisestada viited vidinatele. Tuleb lihtsalt meeles pidada, et parser uurib ühe käigu ajal vana parseri funktsioone ja teise käigu ajal sinu skripti. Nii et kui püüad vidinas midagi muuta ja loed seda keset skripti, ei pruugi tulemus olla just selline, nagu ootasid.

    #!/usr/bin/php

Järgnevad on versiooni 1.2 omadused

- kohalikud ja globaalsed muutujad ning assotsiatiivsed massiivid

- arvavaldised

- stringide manipuleerimine

- mitmesugused struktuurikäsud: if, while, for, foreach

- enamik vana parseri funktsioone

- vidinate otsene manipuleerimine

- palju lisafunktsioone

- korralik käivitamisaeg

- parameetrite saamine signaalidelt skripti pesades

Järgnevad on versiooni 1.3 omadused

- parameetrite edastamine ja saamine skripti käivitamise väljakutsetega

- väärtuse tagastamine skriptist

- vidinate loomine lennult

- signaalide ja pesade ühendamine lennult

- muutuja aliase kasutamine vidina nimeks

- lihtsad indekseeritud massiivi funktsioonid

- otsene ligipääs vidinate pesadele

### Uue parseri kasutamine

Uue parseri lubamiseks anna dialoogi omadusele `useInternalParser` property väärtus `tõene`. Samuti saab uue parseri lubada konkreetses skriptis, lisades

    #!kommander

skripti esimesele reale. Pane tähele ka seda, et kui kasutad skriptis mõnda muud skriptikeelt, siis jõustab &kommander; automaatselt vana parseri, et skript ja dialoog ikka korralikult koostööd teeksid.

    #!/bin/bash
    echo @Self.item(0)
    # returns first parameter passed to script
    # echo $returnvalue passes back to calling script

## Uue parseri omadused

### Tüübid

Iga väärtuse tüüp on kas string, täisarv või double. Tüübiteisendus on automaatne ning alati valitakse kõige sobivam tüüp (kui näiteks lisad täisarvule double'i, on tulemuseks double). Kui üks väärtus on string, on ka tulemus string.

Raskustesse võib sattuda arvväärtuse hankimisel vidinast ja sellega matemaatilise tehte sooritamise puhul. Kuna &kommander; kasutab kahe tekstistringi ühendamiseks tehet `+`, võib ta tõlgendada `LineEdit1.text + 2` kui `22`, aga mitte kui `2`. Probleemide vältimiseks uuri osa Stringifunktsioonid.

### Avaldised

Toetatud on järgmised matemaatilised tehted: `+, -, *, mod,` . Enesestmõistetavalt on toetatud ka tavalised sulud.

Toetatud on kõik võrdlused: `<`, `>`, `<=`, `>=`, `==`, `!=`. `!=` asemel võib kasutada ka `<>`. Samuti on toetatud loogilised tehted `and`, `or` ja `not`, samuti nende C ekvivalendid (`&&`, `||`, `!`).

Stringide puhul võib nende liitmiseks kasutada tehet `+`.

Mõned korrektsete avaldiste näited:

    2+3
    -5 * (2 - 13 mod 3)
    "Loendil on " + 12 + "elementi."

### Muutujad

Muutujaid ei ole vaja deklareerida. Kui kasutad muutujat, võetakse seda kui deklareeritut. Muutuja tüüp tuvastatakseautomaatselt, seda võib hiljem muuta.

Toetatud on ka assotsiatiivsed massiivid. Need seostavad stringivõtmed suvalist tüüpi väärtustega. Massiivi deklareerimiseks lisa sellesse lihtsalt mõni element, näiteks: `A["Quanta"] = "Web editor"`. Massiive saab käsitleda ka käsuga foreach ja massiivifunktsioonidega.

Toetatud on kohalikud ja globaalsed muutujad. Globaalsed muutujad on tähistatud alustava alakriipsuga. See tähendab, et `minuMuutuja` on kohalik, aga `_minuMuutuja` globaalne. Sama kehtib massiivide kohta.

    a = 5
    b = 2 * 5 - (a + 1)
    c = "[Item " + b + "]"
    d["MyKey"] = "MyValue"
    d["MyKey2"] = 5

Muutujate kasutamine vidinates on üsna tavapärane. See tuleb kasuks näiteks vidinate silmuste puhul tabelis.

    for i=0 to 10 do
      mycombo = "ComboTable"+i
      createWidget(mycombo, "ComboBox", "Form1")
    end

### Kommentaarid

Kommentaare saab &kommander;is kasutada kahe programmeerimiskeelte traditsioonilise kommentaarivormi kujul. Kes ei ole programmeerimisega tuttavad, heitku pilk allapoole, kus on näha, mida tähendab traditsiooniline vorm. Soovi korral võid alloleva teksti kopeerida ja asetada nupu või dialoogi initsialiseerimisse, et näha, kuidas kommentaarid tegelikult toimivad.

    // this is a comment for one line
    message_info("Hello World") //traditional first program
    // the above comment also ignored - the messagebox is not
    # this is also a comment
    message_info("This message will show")

Järgnev mitmerealine kommentaar ei toimi ja selle kasutamine põhjustab ülejäänud vidina käivitamise nurjumise.

    /*
    Hei, mina siin tahtsin olla üks kommentaarike
    Pärast mind skripti enam edasi ei käivitata
    ÄRA KASUTA SELLISEID KOMMENTAARE KOMMANDERIS!
    */

### Sisseehitatud globaalsed muutujad

&kommander; pakub mitmeid käepäraseid sisseehitatud globaalseid muutujaid.

- `_ARGS` - dialoogile avamisel edastatav argumendistring

- `_ARGCOUNT` - edastatavate argumentide arv. Need hangitakse argumentidest `ARG1` kuni `ARGn`, kus n on edastatavate argumentide koguarv

- `_KDDIR` - kataloog, millest dialoog käivitatakse. &kommander; kasutab vaikimisi sinu kodukataloogi, aga seda võib muidugi muuta. See on kasulik failide salvestamiseks ja lugemiseks &kommander;i failiga.

- `_NAME` - seda ei ole põhjust kasutada, nii et ära siis seda kasuta

- `_PID` - aktiivse dialoogi protsessi ID, põhimõtteliselt sama mis pid. Seda nime ei tasuks oma muutujates kasutada!

- `_VERSION` - see on abiks, kui soovid lasta näidata töötava &kommander;i versiooni

### Argumentide edastamine &kommander;is

Argumente saab edastada skripti parameetritega, signaalide ja pesadega, käsurea parameetritega ja DCOP-iga. Vaatame skripte. Kutsu oma skript välja nii:

    result = ScriptObject1.execute("Hello World")
    debug(result)

Skriptis leiad midagi sellist:

    var = str_upper(Self.Item(0))
    return(var)

Nüüd tagastatakse teatelogis Stderr HELLO WORLD.

Skripti pesaga ühendatud signaali vastuvõtmine käib samamoodi. Self.Item(0) on esimene parameeter jne. Edastatud argumentide arvu hankimiseks on mõeldud ScriptObject.count.

Käserea parameetrid lubavad nii nimega kui ka nimeta argumente. Nimeta argument näeb välja selline:

    kmdr-executor myprog.kmdr 100 red

kus _ARG1 = 100 ja _ARG2 = red. Tühikutega stringide edastamisel argumendina tuleb nad panna jutumärkidesse. Dialoogikäsu kasutamine muudab asjad keerulisemaks, sest kogu argumendistring tuleb edastada tervikuna, mis tähendab selle asetamist jutumärkidesse.

    dialog("mydialog.kmdr", 100+" \"Hello World\"")

See tagastab _ARG1 = 100 ja _ARG2 = Hello World. Ilma jutumärkideta saaksid _ARG2 = Hello ja _ARG3 = World. Nimega parameetrite kasutamine on kenam ja mitte nii segadusseajav.

    dialog("mydialog.kmdr", "xcount=100 xquote=Hello world")

Nüüd saad neid kasutada globaalsete muutujatega _xcount ja _xquote.

DCOP võib olla päris keeruline, mistõttu me soovitame kasutada meie tööriistu DCOP-i lubamiseks &kommander;i võrgudialoogides näiteks funktsioonisirvijaga. Toome näite DCOP-i väljakutse kohta dialoogist, mis on avatud &kommander;i eellasaknast. Kuna ta teab oma eellast, võib ta saata teabe tagasi ajal, mil ta on avatud, ning vabalt kasutada kõiki oma eellase funktsioone, välja arvatud pesad. Loomulikult saab seda teha ka seesmiselt skriptiga, mis kutstutakse välja väliselt, nii et praktikas ei ole sisuliselt mingeid piire.

    dcop("kmdr-executor-"+parentPid, "KommanderIf", "setText(QString,QString)", "StatusBar8", "Hello")

Vaatame seda osade kaupa. Kõigepealt lisame parentPid "kmdr-ececutor-"-ile, sest me ei saa eeldada, et väljakutsuja on &kommander;i aken. Seda võib kasutada Quanta või KSpreadi või millega tahes. Seejärel adresseerime KommanderIf'i, mis on kena ja puhastatud liides lõppkasutajale. Me loodame, et kui KDE lõpuks KDE4 ajal vahetab DCOP-i välja D-Busi vastu, võtab aina enam rakendusi omaks selle kena lõimimist soodustava liidese. Järgmine parameeter "setText(QString,QString)" on oluline, sest see muudab lubatud parameetrid prototüübiks. Vastasel juhul ei suudaks &kommander; väljakutset valideerida. Niisiis ilma DCOP-väljakutse definitsioonita on tulemuseks viga. Ülejäänud on mõistagi edastatavad parameetrid. Me soovitame uurida rakendusi, mis kasutavad `kdcop`'i, kui soovid näha, kuidas see töötab, ning harjutada DCOP-väljakutsetega shellis, kuni omandad õige süntaksi.

## Käsud

Toetatud on mitmesugused struktuurikäsud. Neid võib igati pesastada.

Samuti on olemas kolm erikäsku: `exit`, `break` ja `continue`. Esimene lõpetab skripti täitmise ja pöördub tagasi. Teine väljub aktiivsest plokist (while, for või foreach) ning kolmas väljub aktiivsest sammust, taasalustades silmuse algusest.

### if

Käsul `if` on järgmine süntaks:

`if` tingimus `then` kood `elseif` tingimus `then` kood `else` kood `endif`

Nii `elseif` kui ka `else` on mittekohustuslikud. Tingimus võib olla suvaline avaldis. Kood täidetakse, kui tingimus on tõene. See tähendab:

- nullist erinev täisarvu ja double korral

- mittetühi stringi korral

    if a * 2 > 7 then
       b = 1
    elseif a < 0 then
       b = 2
    elseif
       b = 0
    endif

### while

`while` tingimus `do` kood `end`

Tingimus arvutatakse uuesti iga silmuse täitmise ajal.

    while i < 15 do
      i = i + a
    end

### for

Käsul `for` on järgmine süntaks:

`for` muutuja `=` algväärtus `to` lõppväärtus `step` avaldis `do` kood `end`

Silmus täidetakse alates algväärtusest ja lõpetatakse siis, kui muutuja väärtus on suurem kui lõppväärtus. Kui määratud on `step`, siis igal sammul suurendatakse muutuja väärtust määratud väärtuse, mitte aga `1` võrra.

    foreach i = 1 to 20 step 5 do
      a = a + 2 * i
    end

### foreach

Käsul `foreach` on järgmine süntaks:

`for` muutuja `in` massiiv `do` kood `end`

Silmus täidetakse iga määratud massiivi võtme puhul. Igal sammul omistatakse muutujale massiivi järgmine võti.

    sum = 0
    foreach i in myArray do
      sum = sum + myArray[i]
    end

## Funktsioonid

Uus parser toetab enamikku vana parseri funktsioone, aga lisatud on ka mõned uued funktsioonid.

### Stringifunktsioonid

Stringifunktsioonid on samad, mis vanas parseris, ainult et nende nimedele eelneb `str_`, mitte `@String`.

- `str_length(`string`)` - tagastab stringi pikkuse

- `str_contains(`string`, `tekst`)` - tagastab 1, kui string sisaldab teksti

- `str_find(`string`, `tekst`, `algus`)` - tagastab teksti esimese esinemiskoha stringis; mittekohustuslik algus määrab otsingu alguskoha

- `str_find(`string`, `tekst`, `algus`)` - tagastab teksti viimase esinemiskoha stringis; mittekohustuslik algus määrab otsingu alguskoha

- `str_left(`string`, `arv`)` - tagastab määratud arvu märke alates stringi algusest

- `str_right(`string`, `arv`)` - tagastab määratud arvu märke alates stringi lõpust

- `str_right(`string`, `algus`, `arv`)` - tagastab stringi alamstringi alates algusest, mis sisaldab määratud arvu märke (või kõik kuni stringi lõpuni, kui viimast parameetrit ei ole antud)

- `str_remove(`string`, `tekst`)` - tagastab stringi koos kõigi alamstringidega, mis on võrdsed eemaldatava tekstiga

- `str_replace(`string`, `tekst`, `tekst2`)` - tagastab stringi koos kõigi alamstringidega, mis vastavad tekstile, mis asendatakse tekst2-ga

- `str_lower(`string`)` - tagastab stringi, mis teisendatakse väiketäheliseks

- `str_upper(`string`)` - tagastab stringi, mis teisendatakse suurtäheliseks

- `str_section(`string`, `eraldaja`, `algus`, `lõpp`)` - tagastab alamstringi, mis sisaldab stringi neid osasid, mis on määratud eraldajaga; kui pole määratud lõppu, tagastatakse kogu alguse sektsioon

- `str_args(`string`, `...`)` - tagastab stringi koos `%1`, `%2`, `%3`-ga, mis asendatakse järgnevate parameetritega.

- `str_isnumber(`string`)` - tagastab 1, kui string on korrektne arv

- `str_isempty(`string`)` - tagastab 1, kui string on tühi

- `str_toint(`string`, `default`)` - tagastab täisarvuks teisendatud stringi; kui teisendamine ei ole võimalik, tagastatakse vaikeväärtus (default)

- `str_todouble(`string`, `default`)` - tagastab double'iks teisendatud stringi; kui teisendamine ei ole võimalik, tagastatakse vaikeväärtus (default)

### &kommander;ri funktsioonid

Toetatud on enamik &kommander;i funktsioone; mõned küll (nt. `expr`) on uues parseris iganenud ega ole kasutatavad.

- `debug(`string`, `...`)` - kirjutab kõik parameetrid standardveaväljundisse stderr

- `echo(`string`, `...`)` - kirjutab kõik parameetrid standardväljundisse stdout

- `dcop(`string`, `...`)` - kutsub välja DCOP-funktsiooni

- `exec(`string`, `shell`)` - käivitab välise programmi (kasutades vajaduse korral mittekohustuslikku shelli); blokeerib aktiivse dialoogi täitmise, kuni parameetrina antud programm on töö lõpetanud; tagastab selle programmi väljundi

- `i18n(`string`)` - märgib stringi tõlgitavaks

- `env(`string`)` - tagastab keskkonnamuutuja väärtuse

- `readSetting(`võti`, `default`)` - tagastab määratud võtmega seadistustefaili salvestatud väärtuse; kui sellist väärtust ei ole, tagastatakse vaikeväärtus (default)

- `writeSetting(`võti`, `väärtus`)` - kirjutab võtme ja väärtuse paari seadistustefaili

&kommander; 1.3 uued omadused

- `execBackground(`string`, `shell`)` - käivitab välise programmi (kasutades vajaduse korral mittekohustuslikku shelli) taustal, blokeerimata aktiivset dialoogi; vastupidi eespool kirjeldatud funktsioonile `exec` ei tagasta programmi väljundit

- `return(`value`)` - tagastab väärtuse väljakutsuvale objektile (skript, nupp...)

- `createWidget(`vidinanimi`, `vidinatüüp`, `eellane`)` - loob uue vidina. Seejärel võib selle asetada näiteks tabelisse või tööriistakasti ja muuta `minuvidin.show(true)` abil nähtavaks. Kui asetad uue vidina vormi, pead mõtlema ka paigutusele. &kommander; ei loo paigutusi lennult ega muuda pikslikaupa positsioneerimist (enamasti). See on veidi häiriv isegi C++ arenduse korral. Me soovitame kasutada rühmakasti ja tegelda paigutusega dialoogis, mis võimaldab parima kontrolli asjade käigu üle.

- `connect(`saatja`, `signaal`, `saaja`, `pesa`)` - ühendab vidina signaali vidina pesaga. Uuri ühenduse dialoogi ja vali sarnased vidinad võimaluste selgitamiseks. Kui näiteks signaal näeb välja nagu `execute(const QString&)`, siis peabki just see siin jutumärkides olema.

- `disconnect(`saatja`, `signaal`, `saaja`, `pesa`)` - tühistab eeltoodud ühenduse. Ka siin on oluline täpne süntaks.

- `widgetExists(`vidinanimi`)` - tuletab meelde, et võid kasutada muutuja nime viitena vidinale. Seda võib kasutada näiteks loodud vidinate kasutamisel, et kontrollida nende olemasolu. Olematu vidina väljakutsumine toob enesestmõistetavalt kaasa vea.

### Massiivifunktsioonid

Toetatud on enamik massiivifunktsioone, kuigi mõned (nt. `value`) on uues parseris iganenud ega ole enam kasutatavad. Ainuke erinevus on see, et nende nimele eelne nüüd `array_`, mitte `@Array`.

Parseri piirangute tõttu tuleb massiivi nimi määrata stringina, näiteks `array_count("MinuMassiiv")`.

- `array_clear(`massiiv`)` - eemaldab kõik elemendid massiivist

- `array_count(`massiiv`)` - tagastab elementide arvu massiivis

- `array_keys(`massiiv`)` - tagastab stringi, mis sisaldab massiivi realõpuga (EOL) eraldatud võtmeid; pane tähele, et kui oled importinud massiivi skalaari (võtmed ilma väärtusteta, vt. allpool näidet) &kommander;i abil, ei saa seda kasutada `array_values("minumassiiv")` abil, nagu vahest võisid oletada (sest see tundub ju sisaldavat ainult väärtusi), vaid kasutada tuleb `array_keys("minumassiiv")`. Aga võib-olla on veel parem mõte kasutada allpool kirjeldatud uusi indekseeritud massiive.

- `array_values(`massiiv`)` - tagastab stringi, mis sisaldab massiivi realõpuga (EOL) eraldatud võtmeid

- `array_tostring(`massiiv`)` - tagastab stringi, mis sisaldab kogu massiivi realõpuga (EOL) eraldatud võtme ja väärtuse paaridena (mida ennast eraldab tabeldusmärk)

- `array_fromstring(`massiiv`, `string`)` - loeb massiivi stringist (tavaliselt pakub seda funktsioon `array_tostring`)

- `array_remove(`massiiv`, `võti`)` - eemaldab võtmega võti elemendi massiivist

Toome näite massiivi kasutamisest:

    array_fromstring("myArray", "1\tA\nsecond\tB\n3\tC")
    foreach key in myArray do
      debug("myArray[" + key + "]= " + myArray[key])
    end

See näitab standardveaväljundis stderr järgnevat teksti. Siin on näha, et massiivi elementide järjekorras ei saa kindel olla, sest võtmed on stringid, mitte arvud.

    myArray[1]= A
    myArray[3]= C
    myArray[second]= B

Teine näide võtmeta massiivi kohta:

    array_fromstring("myArray", "A\nB\nC")
    foreach key in myArray do
      debug(key)
    end
    debug("Massiivi elemendid:\n" + array_keys("myArray"))

See annab tulemuseks:

    A
    B
    C
    Massiivi elemendid:
    A
    B
    C

&kommander; 1.3 uued omadused

- `array_indexedFromString(`massiiv`, `string`, `eraldaja`)` - see kompenseerib tõiga, et &kommander;il puuduvad indekseeritud massiivid. See loob massiivi nullipõhise järjestikindeksiga. Massiivinimes ja kõigis stringides, mida ei väljenda muutuja, tuleb kasutada jutumärke. Eraldaja argument ei ole kohustuslik, vaikimisi on selleks "\t" [tabeldusmärk], mida kasutatakse väljade eraldamiseks tabelite, massiivide või detailividinate lugemisel ja kirjutamisel. Pane tähele, et see massiivi indeks ei kehtesta iseenesest mingeid reegleid. Samahästi võiks selle luua silmusega, ainult et nii on mugavam.

- `array_indexedInsertElements(`massiiv`, `võti`, `string`, `eraldaja`)` - see funktsioon on osa indekseeritud massiivide komplektist ning võimaldab lisada elemente massiivi, hooldades samal ajal järjestikut unikaalset indeksit. Määra alustav indeksi võti, tekstistring ja eraldamise viis. Elemendid lisatakse aina kasvava indeksinumbriga.

- `array_indexedRemoveElements(`massiiv`, `alustav võti`, `arv`)` - see võimaldab eemalda elemente indekseeritud massiivist ja vältida indeksis lünki. Määra alustav võti ja lisavõimalusena eemaldatavate elementide arv. Vaikeväärtus on üks. Tulemuseks on ümberindekseeritud massiiv, millest on vajalikud elemendid eemaldatud.

- `array_indexedToString(`massiiv`, `eraldaja`)` - see võimaldab teisendada indekseeritud massiivi taas stringiks, mis on eriti kasulik detailividinate puhul. Kui näiteks näitad andmebaasipäringu tulemust TreeWidget1 kujul, millel on kuus veergu, võid kasutada valitud rea saamiseks `TreeWidget1.selection`. See on eraldatud tabeldusmärkidega ning sa võid vaadata näiteks selle viiendat elementi, kui kasutad `str_section(TreeWidget1.selection, "\t", 4)` (pea meeles, et see on nullipõhine). See on väätuse lugemiseks päris hea, aga kui soovid seda muuta, näed, et see pole veel kõik. Kui oled stringi lõhkunud, saad selle uuesti kokku panna, kui kasutad `val1+"\t"+val2...` Indekseeritud massiivide kasutamisel võid redigeerida viiendat elementi järgmiselt:

      idx = TreeWidget1.currentItem
      array_indexedFromString("z", TreeWidget1.selection)
      z[4] = "new value"
      TreeWidget1.removeItem(idx)
      TreeWidget1.insertItem(array_indexedToString("z"), idx)

  Pane tähele, et selleks tuli lisada ainult kaks lühikest rida! See on andmebaasi kasutamisel väga tulus.

### Failifunktsioonid

Toetatud on kõik failifunktsioonid, ainuke erinevus on see, et nimede ees seisab `file_`, mitte `@File`.

- `file_read(`nimi`)` - tagastab faili nimi sisu

- `file_write(`nimi`, `...`)` - kirjutab kõik argumendid faili nimi

- `file_append(`nimi`, `...`)` - lisab kõik argumendid faili nimi

### Sisendifunktsioonid

Need funktsioonid näitavad mõnda dialoogi, mis võimaldab kasutajal sisestada teatud väärtuse. Vanas parseris oli nende kasutamiseks mõeldud `@Input`. Enamiku funktsioonide puhul on kõik parameetrid mittekohustuslikud, erand on `input_text`, mis nõuab 2 parameetrit, ja `input_value`, mis nõuab 5 parameetrit.

- `input_color(`nimetus`, `default`)` - tagastab värvi #RRGGBB vormingus

- `input_text(`nimetus`, `pealdis`, `default`)` - tagastab kasutaja sisestatud teksti

- `input_value(`nimetus`, `pealdis`, `default`, `min`, `maks`, `samm`)` - tagastab kasutaja sisestatud väärtuse

- `input_directory(`alguskataloog`, `filter`, `nimetus`)` - tagastab kasutaja valitud kataloogi

- `input_openfile(`nimetus`, `pealdis`, `default`)` - tagastab kasutaja sisestatud olemasoleva faili

- `input_savefile(`nimetus`, `pealdis`, `default`)` - tagastab kasutaja sisestatud faili (kui see on olemas, on vajalik kinnitus)

- `input_openfiles(`nimetus`, `pealdis`, `default`)` - tagastab kasutaja sisestatud olemasolevate failide realõppudega (EOL) eraldatud stringi

### Teatefunktsioonid

Need funktsioonid näitavad kasutajale teatud teadet või paluvad kinnitada mõne toimingu. Vanas parseris oli kasutusel `@Message`.

- `message_info(`tekst`, `nimetus`)` - näitab infoteksti

- `message_error(`tekst`, `nimetus`)` - näitab veateksti

- `message_warning(`tekst`, `nimetus`, `nupp1`, `nupp2`, `nupp3`)` - näitab küsimust koos hoiatuse ja kuni kolme nupuga; tagastatakse valitud nuppude arv; kui nuppude nimesid pole määratud, näidatakse nuppe `Yes` ja `No`

- `message_question(`tekst`, `nimetus`, `nupp1`, `nupp2`, `nupp3`)` - näitab küsimust ja kuni kolme nuppu; tagastatakse valitud nuppude arv; kui nuppude nimesid pole määratud, näidatakse nuppe `Yes` ja `No`