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.
Poslední aktualizace:
Skript TapHome je posloupnost příkazů, každý zakončený středníkem, která se může větvit pomocí IF a SWITCH a opakovat cykly WHILE a DO. Stránka popisuje komentáře, literály (čísla, šestnáctkové a binární hodnoty, text, kolekce), zápis IF ve formě funkce a bloku, SWITCH, cykly s BREAK a CONTINUE a RETURN. Klíčová slova a názvy nerozlišují velká a malá písmena a skript vrátí hodnotu posledního příkazu, pokud jej dříve neukončí RETURN. Například IF(va2 > 0, va1/va2, 0) dělí bezpečně a zabrání chybě Division by zero.
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éž.
# x začíná na 5
VAR x := 5;
IF x > 3
x := x - 1; # provede se, jen když x je větší než 3
END
# poslední výraz je výsledek
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.
# počáteční hodnota
VAR x := 5; # komentář za středníkem
IF x > 3
x := 1;
END # konec podmínkyZnak # 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.
# vyber hodnotu podle teploty Te
IF Te < 5
RETURN(1); # pod 5
ELSEIF Te > 10
RETURN(3); # nad 10
ELSE
RETURN(0); # jinak
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:

# přečte bity režimu z registru Modbus 168
# hodnota bitu se změní na polohu přepínače, jinak 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. 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; # počítadlo začíná na 10
WHILE i > 0
i := i - 1; # odpočítávání
IF i > 5
CONTINUE; # zbytek průchodu se přeskočí, dokud je i nad 5
END
BREAK; # cyklus skončí, když je i nejvýše 5
LOOP
i;
# Result: 5int n := 1; # počáteční hodnota
# tělo běží alespoň jednou, pak dokud n < 100
DO
n := n * 2; # n se při každém průchodu zdvojnásobí
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á.
# skript skončí s 0, když Te není známá
IF ISNAN(Te)
RETURN(0);
END
# přepočet teploty na °F
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknownViz také — Výsledek skriptu.