TapHome

Syntax a riadenie toku

Syntax skriptovacieho jazyka TapHome: príkazy a bodkočiarky, komentáre, literály, IF vo funkčnom a blokovom zápise, SWITCH, cykly WHILE a DO, BREAK, CONTINUE a RETURN.

Posledná aktualizácia:

Skript TapHome je postupnosť príkazov, každý zakončený bodkočiarkou, ktorá sa môže vetviť pomocou IF a SWITCH a opakovať cyklami WHILE a DO. Stránka popisuje komentáre, literály (čísla, hexadecimálne a binárne hodnoty, text, kolekcie), funkčný a blokový zápis IF, SWITCH, cykly s BREAK a CONTINUE a RETURN. Kľúčové slová a názvy nerozlišujú veľkosť písmen a skript vráti hodnotu posledného príkazu, pokiaľ ho skôr neukončí RETURN. Napríklad IF(va2 > 0, va1/va2, 0) delí bezpečne a zabráni chybe Division by zero.

Príkazy a bodkočiarky

Skript je postupnosť príkazov a každý príkaz končí bodkočiarkou ;. Blokové príkazy (IF … END, WHILE … LOOP, DO … LOOP WHILE …) a komentáre bodkočiarkou nekončia. Kľúčové slová a názvy nerozlišujú veľkosť písmen: IF, if a If sú to isté.

# x začína na 5
VAR x := 5;
IF x > 3
    x := x - 1;   # vykoná sa, len keď x je väčšie ako 3
END
# posledný výraz je výsledok
x;
# Result: 4

Bodkočiarku možno vynechať iba za posledným príkazom skriptu; vnútri bloku ju potrebuje každý príkaz, vrátane posledného pred END alebo LOOP. Vnútri bloku chýbajúca bodkočiarka pred END alebo LOOP zastaví skript chybou Unexpected character 'E' at the end of statement. Expected ';' (pred LOOP 'L').

Komentáre

Komentár začína znakom # a pokračuje do konca riadku. Môže stáť na samostatnom riadku alebo za úplným príkazom: za jeho bodkočiarkou, prípadne za END, ELSE alebo LOOP.

# počiatočná hodnota
VAR x := 5;          # komentár za bodkočiarkou
IF x > 3
    x := 1;
END                  # koniec podmienky

Znak # vnútri príkazu (pred jeho bodkočiarkou alebo za podmienkou IF či WHILE) skončí chybou Comment must start on a new line and inline comments are not supported.

Literály

Literál je hodnota zapísaná priamo v skripte.

LiterálPríkladPoznámky
Číslo5, 21.5, -3Desatinná bodka .. Číselný literál je typu double, takže 5 / 2 je 2.5. Bez exponentu (1e3) a bez úvodnej bodky (.5).
Hexadecimálne číslo0xA0A0, 0xffTyp int, číslice nerozlišujú veľkosť písmen: 0xA0A0 je 41120.
Binárne číslo0b10101010Typ int: 170.
Boolovská hodnotaTRUE, FALSE
Neznáme čísloNaNNikdy sa nerovná ničomu; testujte ho funkciou ISNAN.
Žiadna hodnotaNullTestujte ju funkciou ISNULL.
Text (string)"°C", "a\nb", "C:\\data"Escape sekvencie \n, \r, \t, \", \\, \xHH, \uXXXX. Neplatná escape sekvencia skončí chybou Couldn't unescape ….
Znak (char)'A', '\n'Presne jeden znak.
Kolekcia{1, 2, 3}, {"a", "b"}Aspoň jeden prvok, pozrite Kolekcie.
Hodnota enumuH, BigEndianFloat, DateTimeKind.UtcSamostatne alebo s názvom typu, pozrite Enum typy.

IF

IF vráti jednu z dvoch hodnôt podľa podmienky (funkčný zápis), alebo vykoná jeden z viacerých blokov príkazov (blokový zápis).

1
2
IF(condition, valueIfTrue)
IF(condition, valueIfTrue, valueIfFalse)

Parametre

NázovTypPopis
conditionboolNenulové číslo je TRUE, Null je FALSE.
valueIfTrueanyVráti sa, keď je podmienka TRUE.
valueIfFalseanyVoliteľný, vráti sa v ostatných prípadoch.

Návratová hodnota — zvolená hodnota, alebo Null, keď podmienka nie je TRUE a tretí argument chýba. Vyhodnotí sa iba zvolená vetva, takže tá druhá nemôže skončiť chybou.

Príklad — bezpečné delenie a náhrada za NaN. Delenie nulou zastaví skript chybou Line in script: 1 Message: Division by zero; podmienka tomu zabráni:

IF(va2 > 0, va1/va2, 0);
# Result: va1/va2, or 0 when va2 is 0
IF(ISNAN(Te), 0, Te);
# Result: 0 when the device is in error or returns NaN

Blokový zápis

1
2
3
4
5
6
7
IF condition
    statements;
ELSEIF condition
    statements;
ELSE
    statements;
END

Podmienka môže byť v zátvorkách a musí sa zmestiť na jeden riadok; koniec riadku ju ukončí. ELSEIF sa môže opakovať, ELSE je nepovinné, END je povinné. Samotný blok vracia Null; ak má hodnota vzísť z jeho vnútra, použite RETURN.

# vyber hodnotu podľa teploty Te
IF Te < 5
    RETURN(1);   # pod 5
ELSEIF Te > 10
    RETURN(3);   # nad 10
ELSE
    RETURN(0);   # inak
END

Chyby — Function IF requires at least 2 parameters.; Unexpected keyword 'X' at the end of IF statement., keď za vnútorným END nasleduje ;.

Pozrite aj — SWITCH, Operátory.

SWITCH

SWITCH porovná hodnotu so zoznamom prípadov a vráti výsledok prvého zhodného prípadu, alebo predvolený výsledok, keď sa nezhoduje žiadny prípad.

1
SWITCH(value, case1, result1, case2, result2, ..., defaultResult)

Poznámky — SWITCH berie najmenej 4 a najviac 100 argumentov, vždy párny počet: hodnotu, dvojice prípadu a jeho výsledku a predvolený výsledok. Prípady sa porovnávajú ako pri =: čísla podľa hodnoty, text presne; porovnanie textu s číslom skončí chybou Operator '==' not defined …. Vyhodnotí sa iba výsledok zhodného prípadu.

Príklad — návod k zariadeniu uvádza aktívny režim ako bitové hodnoty; skript ich prevedie na polohy viachodnotového prepínača:

Príklad SWITCH
# prečíta bity režimu z registra Modbus 168
# hodnota bitu sa zmení na polohu prepínača, inak NaN
SWITCH(MODBUSR(H, 168, UInt16),
    0, 0,
    0x0002, 1,
    0x0004, 2,
    0x0008, 3,
    0x0010, 4,
    0x0040, 5,
    0x0800, 6,
    NaN);

Chyby — Function SWITCH requires at least 4 parameters.; Invalid arguments for SWITCH function. pri nepárnom počte argumentov.

Cykly WHILE a DO

WHILE opakuje svoje príkazy, kým je podmienka TRUE; DO … LOOP WHILE ich vykoná aspoň raz. CONTINUE; preskočí zvyšok aktuálneho prechodu, BREAK; cyklus opustí; oba sa píšu bez zátvoriek.

1
2
3
4
5
6
7
WHILE condition
    statements;
LOOP

DO
    statements;
LOOP WHILE condition

Rovnako ako pri IF sa podmienka končí koncom riadku. Keď začína znakom (, končí sa zodpovedajúcou ): WHILE (a > 0) AND (b > 0) berie ako podmienku iba (a > 0), preto píšte WHILE (a > 0 AND b > 0).

int i := 10;   # počítadlo začína na 10
WHILE i > 0
    i := i - 1;   # odpočítavanie
    IF i > 5
        CONTINUE;   # zvyšok prechodu sa preskočí, kým je i nad 5
    END
    BREAK;   # cyklus skončí, keď je i najviac 5
LOOP
i;
# Result: 5
int n := 1;   # počiatočná hodnota
# telo beží aspoň raz, potom kým n < 100
DO
    n := n * 2;   # n sa v každom prechode zdvojnásobí
LOOP WHILE n < 100
n;
# Result: 128

Chyby — cyklus sa zastaví chybou More than 1 000 000 loops, stopping loop. BREAK alebo CONTINUE mimo cyklu skončí chybou Cannot use BREAK() outside of WHILE or DO-WHILE. Bodkočiarka za vnútorným LOOP alebo END skončí chybou Unexpected character ';' in WHILE statement.

Názvy sa vyhodnocujú skôr ako kľúčové slová cyklov. Premenná alebo skratka zariadenia s názvom Do alebo While kľúčové slovo zakryje a cyklus skončí chybou Missing operator between 'DO' and ….

RETURN

RETURN okamžite ukončí skript a zadanú hodnotu urobí jeho výsledkom.

1
RETURN(value)

Poznámky — bez RETURN je výsledkom hodnota posledného príkazu. RETURN použite, keď má hodnota vzísť z vnútra bloku, alebo na predčasné ukončenie listener skriptu pri správach, ktoré nespracúva.

# skript skončí s 0, keď Te nie je známa
IF ISNAN(Te)
    RETURN(0);
END
# prepočet teploty na °F
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknown

Pozrite aj — Výsledok skriptu.