Syntaxe a řízení toku
Syntaxe skriptovacího jazyka TapHome: příkazy a středníky, komentáře, literály, IF ve formě funkce a bloku, SWITCH, cykly WHILE a DO, BREAK, CONTINUE a RETURN.
Příkazy a středníky
Skript je posloupnost příkazů a každý příkaz končí středníkem ;. Blokové příkazy (IF … END, WHILE … LOOP, DO … LOOP WHILE …) a komentáře středníkem nekončí. Klíčová slova a názvy nerozlišují velká a malá písmena: IF, if a If jsou totéž.
VAR x := 5;
IF x > 3
x := x - 1;
END
x;
# Result: 4Středník smí chybět jen za posledním příkazem skriptu; uvnitř bloku ho potřebuje každý příkaz, i ten poslední před END nebo LOOP. Když uvnitř bloku chybí středník před END nebo LOOP, skript se zastaví s hlášením Unexpected character 'E' at the end of statement. Expected ';' ('L' před LOOP).
Komentáře
Komentář začíná znakem # a pokračuje do konce řádku. Může stát na samostatném řádku nebo následovat za úplným příkazem: za jeho středníkem nebo za END, ELSE či LOOP.
# starting value
VAR x := 5; # a comment after the semicolon
IF x > 3
x := 1;
END # end of the checkZnak # uvnitř příkazu (před jeho středníkem nebo za podmínkou IF či WHILE) skončí chybou Comment must start on a new line and inline comments are not supported.
Literály
Literál je hodnota zapsaná přímo ve skriptu.
| Literál | Příklad | Poznámky |
|---|---|---|
| Číslo | 5, 21.5, -3 | Desetinná tečka .. Číselný literál je double, takže 5 / 2 je 2.5. Bez exponentu (1e3), bez úvodní tečky (.5). |
| Šestnáctkové číslo | 0xA0A0, 0xff | Typ int, u číslic nezáleží na velikosti písmen: 0xA0A0 je 41120. |
| Binární číslo | 0b10101010 | Typ int: 170. |
| Logická hodnota | TRUE, FALSE | |
| Neznámé číslo | NaN | Nikdy se ničemu nerovná; testujte ho funkcí ISNAN. |
| Žádná hodnota | Null | Testujte ji funkcí ISNULL. |
| Řetězec | "°C", "a\nb", "C:\\data" | Escape sekvence \n, \r, \t, \", \\, \xHH, \uXXXX. Neplatná sekvence skončí chybou Couldn't unescape …. |
| Znak | 'A', '\n' | Právě jeden znak. |
| Kolekce | {1, 2, 3}, {"a", "b"} | Alespoň jeden prvek, viz Kolekce. |
| Hodnota výčtu | H, BigEndianFloat, DateTimeKind.Utc | Samotná nebo s názvem typu, viz Výčtové typy. |
IF
IF vrátí jednu ze dvou hodnot podle podmínky (forma funkce), nebo vykoná jeden z několika bloků příkazů (forma bloku).
| |
Parametry
| Název | Typ | Popis |
|---|---|---|
condition | bool | Nenulové číslo je TRUE, Null je FALSE. |
valueIfTrue | any | Vrátí se, když je podmínka TRUE. |
valueIfFalse | any | Nepovinný, vrátí se v ostatních případech. |
Vrací vybranou hodnotu, nebo Null, když podmínka není TRUE a třetí argument chybí. Vyhodnotí se jen vybraná větev, takže ta druhá nemůže selhat.
Příklad — bezpečné dělení a náhrada za NaN. Dělení nulou zastaví skript s hlášením Line in script: 1 Message: Division by zero; podmínka mu zabrání:
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 NaNForma bloku
| |
Podmínka může být v závorkách a musí se vejít na jeden řádek; konec řádku ji ukončí. ELSEIF se může opakovat, ELSE je nepovinné, END je povinné. Samotný blok vrací Null; chcete-li z něj vrátit hodnotu, použijte RETURN.
IF Te < 5
RETURN(1);
ELSEIF Te > 10
RETURN(3);
ELSE
RETURN(0);
ENDChyby — Function IF requires at least 2 parameters.; Unexpected keyword 'X' at the end of IF statement., když za vnořeným END následuje ;.
SWITCH
SWITCH porovná hodnotu se seznamem případů a vrátí výsledek prvního shodného případu, nebo výchozí výsledek, když se žádný případ neshoduje.
| |
Poznámky — SWITCH přijímá nejméně 4 a nejvýše 100 argumentů, vždy sudý počet: hodnotu, dvojice případu a jeho výsledku a výchozí výsledek. Případy se porovnávají jako =: čísla podle hodnoty, text přesně; porovnání textu s číslem skončí chybou Operator '==' not defined …. Vyhodnotí se jen výsledek shodného případu.
Příklad — návod k zařízení uvádí aktivní režim jako hodnoty bitů; skript je převede na polohy vícehodnotového spínače:

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. při lichém počtu argumentů.
Cykly WHILE a DO
WHILE opakuje své příkazy, dokud je podmínka TRUE; DO … LOOP WHILE je vykoná alespoň jednou. CONTINUE; přeskočí zbytek průchodu, BREAK; cyklus opustí; oba se píší bez závorek.
| |
Stejně jako u IF podmínka končí koncem řádku. Když začíná znakem (, končí u odpovídající ): WHILE (a > 0) AND (b > 0) vezme jako podmínku jen (a > 0), proto pište WHILE (a > 0 AND b > 0).
int i := 10;
WHILE i > 0
i := i - 1;
IF i > 5
CONTINUE;
END
BREAK;
LOOP
i;
# Result: 5int n := 1;
DO
n := n * 2;
LOOP WHILE n < 100
n;
# Result: 128Chyby — cyklus se zastaví s hlášením More than 1 000 000 loops, stopping loop. BREAK nebo CONTINUE mimo cyklus skončí chybou Cannot use BREAK() outside of WHILE or DO-WHILE. Středník ; za vnořeným LOOP nebo END skončí chybou Unexpected character ';' in WHILE statement.
Názvy se vyhodnocují dříve než klíčová slova cyklu. Proměnná nebo zkratka zařízení s názvem
DoneboWhileklíčové slovo zakryje a cyklus skončí chybouMissing operator between 'DO' and ….
RETURN
RETURN okamžitě ukončí skript a zadanou hodnotu učiní jeho výsledkem.
| |
Poznámky — bez RETURN je výsledkem hodnota posledního příkazu. RETURN použijte, když chcete vrátit hodnotu zevnitř bloku, nebo když má listener skript předčasně skončit u zpráv, které nezpracovává.
IF ISNAN(Te)
RETURN(0);
END
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknownViz také — Výsledek skriptu.