TapHome

Sintaxă și controlul fluxului

Sintaxa limbajului de scripting TapHome: instrucțiuni și punct și virgulă, comentarii, literali, IF în formă de funcție și de bloc, SWITCH, buclele WHILE și DO, BREAK, CONTINUE și RETURN.

Instrucțiuni și punct și virgulă

Un script este o secvență de instrucțiuni, iar fiecare instrucțiune se termină cu punct și virgulă ;. Instrucțiunile de tip bloc (IF … END, WHILE … LOOP, DO … LOOP WHILE …) și comentariile nu se termină cu punct și virgulă. Cuvintele cheie și numele nu țin cont de majuscule: IF, if și If sunt același lucru.

VAR x := 5;
IF x > 3
    x := x - 1;
END
x;
# Result: 4

Punctul și virgula se poate omite doar după ultima instrucțiune a scriptului; în interiorul unui bloc fiecare instrucțiune îl necesită, inclusiv ultima dinaintea lui END sau LOOP. În interiorul unui bloc, lipsa punctului și virgulei înaintea lui END sau LOOP oprește scriptul cu Unexpected character 'E' at the end of statement. Expected ';' ('L' înaintea lui LOOP).

Comentarii

Un comentariu începe cu # și continuă până la sfârșitul liniei. Poate sta pe o linie proprie sau poate urma după o instrucțiune completă: după punctul și virgula ei ori după END, ELSE sau LOOP.

# starting value
VAR x := 5;          # a comment after the semicolon
IF x > 3
    x := 1;
END                  # end of the check

Un # în interiorul unei instrucțiuni (înaintea punctului și virgulei sau după condiția lui IF ori WHILE) eșuează cu Comment must start on a new line and inline comments are not supported.

Literali

Un literal este o valoare scrisă direct în script.

LiteralExempluObservații
Număr5, 21.5, -3Separator zecimal .. Un literal numeric este de tip double, deci 5 / 2 este 2.5. Fără exponent (1e3), fără punct la început (.5).
Hexazecimal0xA0A0, 0xffDe tip int, cifrele nu țin cont de majuscule: 0xA0A0 este 41120.
Binar0b10101010De tip int: 170.
BooleanTRUE, FALSE
Număr necunoscutNaNNu este egal cu nimic; se testează cu ISNAN.
Fără valoareNullSe testează cu ISNULL.
Șir de caractere"°C", "a\nb", "C:\\data"Secvențe escape \n, \r, \t, \", \\, \xHH, \uXXXX. O secvență escape invalidă eșuează cu Couldn't unescape ….
Caracter'A', '\n'Exact un caracter.
Colecție{1, 2, 3}, {"a", "b"}Cel puțin un element, consultați Colecții.
Valoare de enumerareH, BigEndianFloat, DateTimeKind.UtcSimplă sau cu numele tipului, consultați Tipuri de enumerare.

IF

IF returnează una dintre două valori în funcție de o condiție (forma de funcție) sau execută unul dintre mai multe blocuri de instrucțiuni (forma de bloc).

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

Parametri

NumeTipDescriere
conditionboolUn număr diferit de zero este TRUE, Null este FALSE.
valueIfTrueanySe returnează când condiția este TRUE.
valueIfFalseanyOpțional, se returnează în celelalte cazuri.

Returnează valoarea selectată sau Null când condiția nu este TRUE și nu există al treilea argument. Se evaluează doar ramura selectată, așa că cealaltă nu poate eșua.

Exemplu — împărțire sigură și înlocuirea lui NaN. Împărțirea la zero oprește scriptul cu Line in script: 1 Message: Division by zero; condiția previne acest lucru:

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

Forma de bloc

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

Condiția poate fi între paranteze și trebuie să încapă pe o singură linie; sfârșitul liniei o încheie. ELSEIF se poate repeta, ELSE este opțional, END este obligatoriu. Blocul în sine returnează Null; pentru a produce o valoare din interiorul lui se folosește RETURN.

IF Te < 5
    RETURN(1);
ELSEIF Te > 10
    RETURN(3);
ELSE
    RETURN(0);
END

Erori — Function IF requires at least 2 parameters.; Unexpected keyword 'X' at the end of IF statement. când un ; urmează după un END interior.

Consultați și — SWITCH, Operatori.

SWITCH

SWITCH compară o valoare cu o listă de cazuri și returnează rezultatul primului caz care se potrivește sau un rezultat implicit când niciun caz nu se potrivește.

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

Observații — SWITCH primește cel puțin 4 și cel mult 100 de argumente, întotdeauna un număr par: valoarea, perechi formate dintr-un caz și rezultatul lui și rezultatul implicit. Cazurile se compară ca la =: numerele după valoare, textul exact; compararea unui text cu un număr eșuează cu Operator '==' not defined …. Se evaluează doar rezultatul cazului care se potrivește.

Exemplu — manualul dispozitivului indică modul activ prin valori de biți; scriptul le transformă în pozițiile unui comutator cu mai multe valori:

SWITCH Example
SWITCH(MODBUSR(H, 168, UInt16),
    0, 0,
    0x0002, 1,
    0x0004, 2,
    0x0008, 3,
    0x0010, 4,
    0x0040, 5,
    0x0800, 6,
    NaN);

Erori — Function SWITCH requires at least 4 parameters.; Invalid arguments for SWITCH function. pentru un număr impar de argumente.

Buclele WHILE și DO

WHILE repetă instrucțiunile cât timp condiția este TRUE; DO … LOOP WHILE le execută cel puțin o dată. CONTINUE; sare peste restul trecerii curente, BREAK; părăsește bucla; ambele se scriu fără paranteze.

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

DO
    statements;
LOOP WHILE condition

Ca la IF, condiția se încheie la sfârșitul liniei. Când începe cu (, se încheie la ) corespunzătoare: WHILE (a > 0) AND (b > 0) ia drept condiție doar (a > 0), de aceea se scrie WHILE (a > 0 AND b > 0).

int i := 10;
WHILE i > 0
    i := i - 1;
    IF i > 5
        CONTINUE;
    END
    BREAK;
LOOP
i;
# Result: 5
int n := 1;
DO
    n := n * 2;
LOOP WHILE n < 100
n;
# Result: 128

Erori — o buclă se oprește cu More than 1 000 000 loops, stopping loop. BREAK sau CONTINUE în afara unei bucle eșuează cu Cannot use BREAK() outside of WHILE or DO-WHILE. Un ; după un LOOP sau END interior eșuează cu Unexpected character ';' in WHILE statement.

Numele se rezolvă înaintea cuvintelor cheie ale buclelor. O variabilă sau o abreviere de dispozitiv numită Do sau While ascunde cuvântul cheie, iar bucla eșuează cu Missing operator between 'DO' and ….

RETURN

RETURN încheie imediat scriptul și face din valoarea dată rezultatul lui.

1
RETURN(value)

Observații — fără RETURN, rezultatul este valoarea ultimei instrucțiuni. RETURN se folosește pentru a da o valoare din interiorul unui bloc sau pentru a opri mai devreme un script listener la mesajele pe care nu le tratează.

IF ISNAN(Te)
    RETURN(0);
END
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknown

Consultați și — Rezultatul scriptului.