Scriptic
Knowledge Center
ScripticX / Learn

Bazele MiniScript+

Învață sintaxa de bază a limbajului folosit pe ScripticX.

Updated 1 septembrie 202613 min de citit

MiniScript+ (.msp) este limbajul de învățare integrat în ScripticX. Sintaxa lui este intenționat compactă, ca începătorii să se poată concentra pe raționament și pe rezolvarea problemelor, nu pe punctuație.

Tot limbajul înseamnă șapte instrucțiuni: PRINT, INPUT, atribuirea, IF, ELSE, END, WHILE, plus expresii. Nu există tablouri și nici funcții definite de tine (în curând :>).

Cum rulează un program

Un program este o listă de linii, citită de sus în jos. O linie de cod înseamnă întotdeauna exact o instrucțiune, inclusiv liniile goale și cele de comentariu. Interpretorul ține un pointer către linia curentă, o execută și trece mai departe. Buclele și condițiile funcționează mutând acel pointer în altă parte.

MiniScript+
1total = 02total = total + 53PRINT total
text
15

Atribuirea nu afișează nimic de una singură. Doar PRINT scrie în consolă.

Editorul îți dă două moduri de a rula asta:

AcțiuneCe face
RuleazăExecută până la finalul programului, până la o eroare sau până când INPUT cere o valoare
PasExecută exact o instrucțiune, apoi se oprește ca să poți inspecta panoul Variabile

Rularea pas cu pas este cel mai rapid mod de a înțelege o buclă: urmărește cum sare pointerul de la END înapoi la WHILE și cum se schimbă contorul pe drum.

Reguli de sintaxă

O singură instrucțiune pe linie. Nu există separator de instrucțiuni. x = 1 PRINT x nu înseamnă două instrucțiuni, ci este o eroare.

Cuvintele cheie se scriu cu MAJUSCULE. PRINT, INPUT, IF, THEN, ELSE, END, WHILE, AND, OR, NOT, DIV, MOD. Dacă scrii print x, programul se oprește cu Unknown instruction "print x". Două lucruri nu țin cont de majuscule: literalii TRUE/FALSE și numele funcțiilor predefinite, abs(-4) funcționează. Numele variabilelor țin cont de majuscule, așa că total, Total și TOTAL sunt trei variabile diferite.

END se scrie mereu singur. END IF și END WHILE nu sunt valide.

Comentariile încep cu #, fie pe o linie separată, fie după cod. // nu este comentariu (x = 5 // 2 dă eroare).

MiniScript+
1# Calculează scorul final2baza = 803bonus = 10  # acordat pentru viteză4PRINT baza + bonus
text
190

Valori și variabile

Există trei tipuri și niciun mod de a declara unul: o variabilă apare la prima atribuire și preia tipul valorii pe care o ține.

TipExempleObservații
Număr42, 3.14, -7Un singur tip numeric; / poate da zecimale
Text"salut"Doar ghilimele duble drepte
BooleanTRUE, FALSERezultă și din orice comparație
MiniScript+
1nume = "Ana"2scor = 103promovat = scor >= 545PRINT nume6PRINT scor7PRINT promovat
text
1Ana2103true

Valorile boolean se afișează cu litere mici, ca true și false, de aceea arată altfel decât TRUE pe care îl scrii tu.

Numele trebuie să înceapă cu o literă sau cu _ și pot conține apoi litere, cifre și _. Dacă citești o variabilă căreia nu i-ai atribuit nimic, programul se oprește cu Variable "x" is not defined.

O variabilă își poate schimba tipul oricând. Partea din dreapta se evaluează prima, iar rezultatul înlocuiește valoarea veche, exact mecanismul care face contoarele să funcționeze:

MiniScript+
1contor = 12contor = contor + 13contor = "gata"4PRINT contor
text
1gata

Expresii și operatori

Operatorii sunt listați de la cei mai slabi la cei mai puternici. Ce se află mai sus în tabel se evaluează după ce se află mai jos.

NivelOperatoriObservații
1OR
2AND
3< > <= >= == !=
4+ -
5* / % DIV MOD
6NOT - + (unari)

Parantezele au prioritate peste tot, așa că 2 + 3 * 414, dar (2 + 3) * 420.

Aritmetică. / este împărțirea obișnuită și poate da zecimale. DIV este împărțirea întreagă, care trunchiază spre zero, iar MOD (sau %) dă restul.

MiniScript+
1PRINT 7 / 22PRINT 7 DIV 23PRINT 7 MOD 24PRINT -7 DIV 2
text
13.523314-3

Împărțirea sau restul la zero opresc programul cu Division by zero is not allowed, respectiv Modulo by zero is not allowed.

+ are două roluri. Dacă una dintre părți este text, ambele devin text și se lipesc. Altfel este adunare. Toți ceilalți operatori aritmetici merg doar cu numere și raportează Operator - can only be used with numbers.

MiniScript+
1PRINT "Scor " + 102PRINT 3 + 4
text
1Scor 1027

Comparații. <, >, <= și >= merg doar cu numere! Comparând text cu ele obții eroare. == și != merg cu orice două valori și compară și valoarea, și tipul, așa că 1 == "1" este false.

Logică. AND, OR și NOT își tratează operanzii ca adevărat sau fals și întorc mereu un boolean. Textul gol și 0 contează ca fals.

Funcții predefinite

Există cinci funcții. Argumentele trebuie să fie numere, iar numele nu țin cont de majuscule.

ApelRezultatExemplu
INT(x)Trunchiază spre zeroINT(-2.7)-2
TRUNC(x)Identic cu INTTRUNC(2.7)2
FLOOR(x)Rotunjește în josFLOOR(-2.7)-3
ROUND(x)Cel mai apropiat întreg, jumătățile urcăROUND(2.5)3
ROUND(x, d)Rotunjește la d zecimaleROUND(2 / 3, 2)0.67
ABS(x)Valoarea absolutăABS(-4)4

Apelurile se pot imbrica și se combină cu operatori ca orice altă expresie, așa că PRINT ABS(INT(-9.7) + 2) afișează 7.

Input și output

PRINT primește exact o expresie și scrie câte o linie la fiecare apel. Ca să etichetezi o valoare, lipește-o cu +.

MiniScript+
1total = 122PRINT "Total " + total
text
1Total 12

INPUT nume oprește programul și reține ce tastezi. Editorul transformă în număr ceea ce arată a număr și în boolean valorile true/false; orice altceva rămâne text. Dacă trimiți căsuța goală, primești 0.

MiniScript+
1INPUT varsta2IF varsta >= 18 THEN3PRINT "Adult"4ELSE5PRINT "Minor"6END

Cu 20 tastat, programul afișează Adult.

Condiții

Un bloc IF își execută corpul doar când condiția este adevărată și se închide mereu cu END. THEN este obligatoriu, dacă îl uiți primești Missing THEN in IF statement.

MiniScript+
1scor = 8023IF scor >= 50 THEN4PRINT "Admis"5ELSE6PRINT "Mai încearcă"7END
text
1Admis

ELSE este opțional, iar un bloc poate conține cel mult unul. Indentarea este doar pentru lizibilitate. Interpretorul potrivește IF cu END numărând blocurile, nu uitându-se la spații.

Condițiile se pot imbrica oricât, și așa construiești o alegere cu mai multe ramuri:

MiniScript+
1nota = 723IF nota >= 9 THEN4PRINT "Excelent"5ELSE6IF nota >= 5 THEN7  PRINT "Promovat"8ELSE9  PRINT "Respins"10END11END
text
1Promovat

Bucle

WHILE verifică condiția înainte de fiecare trecere. Când condiția este falsă, pointerul sare dincolo de END-ul pereche; când corpul se termină, END trimite pointerul înapoi sus, la reverificare.

MiniScript+
1numar = 123WHILE numar <= 54PRINT numar5numar = numar + 16END
text
1122334455

Trei lucruri trebuie să se potrivească pentru ca o buclă să se termine: un contor care pornește de undeva, o condiție care poate deveni falsă și un corp care chiar schimbă contorul. Uitarea celui de-al treilea este cauza obișnuită a unei bucle care nu se mai oprește.

Buclele se pot imbrica, iar bucla interioară rulează complet la fiecare trecere a celei exterioare:

MiniScript+
1rand = 123WHILE rand <= 34coloana = 15WHILE coloana <= 36  PRINT rand * coloana7  coloana = coloana + 18END9rand = rand + 110END

O buclă poate și să citească până întâlnește o valoare-santinelă, în loc să numere:

MiniScript+
1total = 02INPUT valoare34WHILE valoare != 05total = total + valoare6INPUT valoare7END89PRINT "Suma " + total

Observă forma: citești o dată înainte de buclă, apoi citești din nou la finalul corpului. Așa condiția are mereu o valoare proaspătă de testat.

Erori și limite

Un program poate executa cel mult 1000 de instrucțiuni. Peste această limită, rularea se oprește cu Possible infinite loop detected. O buclă simplă de numărare consumă aproximativ trei instrucțiuni per trecere, deci plafonul este pe la 330 de repetări.

Erorile indică linia care a eșuat. Cele mai frecvente:

MesajCauză
Unknown instruction "…"Un cuvânt cheie scris cu litere mici, END IF sau două instrucțiuni pe o linie
Variable "x" is not definedCitită înainte să primească vreo valoare / verifică scrierea și majusculele
Missing THEN in IF statementLipsește THEN de pe linia IF
Missing END for IF statementUn bloc a fost deschis și niciodată închis
END without matching blockUn END în plus
ELSE without matching IFELSE în afara unui bloc sau după END-ul care l-a închis
Operator < can only be used with numbersText comparat cu <, >, <= sau >=
Division by zero is not allowedUn împărțitor a ajuns 0! Protejează-l cu un IF
Possible infinite loop detectedCondiția nu a devenit niciodată falsă
Unknown function "SQRT"Există doar INT, TRUNC, FLOOR, ROUND și ABS

Când rezultatul este greșit, dar nu apare nicio eroare, treci de la Rulează la Pas și urmărește panoul Variabile. Aproape orice eroare de logică apare ca o variabilă care ține o valoare neașteptată, cu o trecere mai devreme decât locul în care te uitai.

Referință rapidă

InstrucțiuneFormă
AfișarePRINT expresie
CitireINPUT variabila
Atribuirevariabila = expresie
CondițieIF conditie THENELSEEND
BuclăWHILE conditieEND
Comentariu# text
În loc deScrie
ELSE IFUn IF imbricat în ELSE
END IF, ENDWHILEEND simplu
Comentarii //#
FUNCTION, RETURNCodul scris direct în loc
Tablouri, bucle FORO buclă WHILE peste un contor
SQRT, CEIL, MIN, MAXUn IF sau un WHILE scris de tine