Files
Rex-EMoolator-docs/docs/pl/engine/arithmetic.md
Patryk Gensch df6cf2f3d3
Some checks failed
docs / deploy (push) Has been cancelled
docs / build (push) Has been cancelled
Added part of docs
2026-05-19 20:51:59 +02:00

7.5 KiB

Arytmetyka

Silnik Piklib/BlooMoo wykonuje obliczenia wyłącznie wewnątrz wyrażeń arytmetycznych zamkniętych w nawiasach kwadratowych. Nawiasy okrągłe są zarezerwowane dla list argumentów wywołań metod i nie pełnią roli grupującej w wyrażeniach. Sekcja poniżej opisuje obsługiwane operatory, reguły typowania oraz konwersje pomiędzy typami prymitywnymi.

Składnia

Wyrażenie arytmetyczne zapisuje się w nawiasach kwadratowych. Może być użyte wszędzie, gdzie spodziewana jest wartość — w tym jako argument metody lub jako wartość przypisywana do pola:

NAZWA_ZMIENNEJ^SET([VAL1+VAL2]);
*["ANIMO_"+_I_]^PLAY();

Zagnieżdżanie wyrażeń odbywa się przez kolejne pary nawiasów kwadratowych:

[[VAL1+VAL2]*VAL3]

Reguła typowania

Wszystkie operacje binarne w wyrażeniach kierują się jedną zasadą:

Typ wyniku oraz typ prawego operandu są wyznaczone przez typ lewego operandu.

Prawy operand jest rzutowany na typ lewego przed wykonaniem operacji, a wynik również ma ten typ. Przykłady:

"Wartosc" + 2.5  →  "Wartosc2.50000"   # DOUBLE rzutowany do STRING
2 + "3"          →  5                   # STRING rzutowany do INTEGER

Konsekwencja: kolejność operandów ma znaczenie nie tylko dla operatorów nieprzemiennych, ale również dla samego typu wyniku.

Konwersje typów

W ramach reguły typowania prawy operand jest rzutowany według poniższych zasad.

Z STRING

Cel Reguła
INTEGER Z początkowej części tekstu wyciągana jest liczba całkowita (analogicznie do parseInt). Jeżeli tekst nie zaczyna się od liczby, wynikiem jest 0.
DOUBLE Analogicznie do INTEGER, ale z zachowaniem części ułamkowej. Separatorem dziesiętnym jest kropka.
BOOL Tekst odpowiadający wartości prawdziwej (TRUE lub niezerowa liczba) zwraca TRUE; w pozostałych przypadkach FALSE.
"5"     →  5
"Test"  →  0

Z INTEGER

Cel Reguła
STRING Zapis dziesiętny liczby.
DOUBLE Liczba z zerową częścią ułamkową (pięć zer po przecinku).
BOOL Wartość różna od 0 daje TRUE, równa 0FALSE.
5   →  "5"
3   →  3.00000
-2  →  TRUE
0   →  FALSE

Z DOUBLE

Cel Reguła
STRING Zapis dziesiętny z kropką i pięcioma miejscami po przecinku. Dla wartości równych 0.0 część po przecinku jest pomijana.
INTEGER Zaokrąglenie do najbliższej liczby całkowitej; przy .5 w górę dla liczb dodatnich i w dół dla ujemnych.
BOOL Pośrednie: najpierw rzutowanie do INTEGER (z powyższym zaokrągleniem), potem do BOOL. Wartości z przedziału (-0.5, 0.5) dają FALSE, pozostałe TRUE.
3.5      →  "3.50000",   4,    TRUE
0.0      →  "0",         0,    FALSE
0.45362  →  "0.45362",   0,    FALSE
1.00001  →  "1.00001",   1,    TRUE
-0.5     →  "-0.50000", -1,    TRUE

Z BOOL

Cel Reguła
STRING TRUE"TRUE", FALSE"FALSE".
INTEGER TRUE1, FALSE0.
DOUBLE TRUE1.00000, FALSE0.00000.

Operatory arytmetyczne

W wyrażeniach dostępne są następujące operatory binarne:

Operator Znaczenie
+ dodawanie / konkatenacja
- odejmowanie
* mnożenie
@ dzielenie
% reszta z dzielenia

Dodawanie (+)

Typ lewego operandu Zachowanie
STRING Konkatenacja prawego operandu (po rzutowaniu) do lewego.
INTEGER Suma liczbowa.
DOUBLE Suma liczbowa.
BOOL Koniunkcja logiczna (AND). TRUE + FALSE daje FALSE.

Odejmowanie (-)

Typ lewego operandu Zachowanie
STRING Brak efektu; wynikiem jest lewy operand.
INTEGER Różnica liczbowa.
DOUBLE Różnica liczbowa.
BOOL Brak efektu; wynikiem jest lewy operand.

Mnożenie (*)

Typ lewego operandu Zachowanie
STRING Brak efektu; wynikiem jest lewy operand.
INTEGER Iloczyn liczbowy.
DOUBLE Iloczyn liczbowy.
BOOL Alternatywa logiczna (OR). FALSE * TRUE daje TRUE.

Dzielenie (@)

Typ lewego operandu Zachowanie
STRING Brak efektu; wynikiem jest lewy operand.
INTEGER Iloraz całkowity.
DOUBLE Iloraz zmiennoprzecinkowy.
BOOL Brak efektu; wynikiem jest lewy operand.

Dzielenie przez 0 w typach liczbowych powoduje błąd silnika.

Reszta z dzielenia (%)

Typ lewego operandu Zachowanie
STRING Brak efektu; wynikiem jest lewy operand.
INTEGER Reszta z dzielenia.
DOUBLE Reszta z dzielenia obcięta do liczby całkowitej, a następnie rzutowana z powrotem do DOUBLE. Skutkuje to utratą części ułamkowej, np. 1.5 % 2 daje 1.00000, nie 1.50000.
BOOL Brak efektu; wynikiem jest lewy operand.

Modulo z drugim operandem równym 0 powoduje błąd silnika.

Operatory porównań

W wyrażeniach dostępne są standardowe operatory porównań: ==, !=, <, <=, >, >=. Prawy operand jest najpierw rzutowany na typ lewego (zgodnie z regułą typowania), a następnie porównywany.

Równość i nierówność

== zwraca TRUE, jeżeli oba operandy (po rzutowaniu) są równe; != zwraca przeciwieństwo. Dla typu STRING porównanie odbywa się znak po znaku, dla typów liczbowych — wartościami.

Porównania mniejsze / większe

Typ lewego operandu < zwraca TRUE, jeżeli
STRING Leksykograficznie lewy operand poprzedza prawy (porównanie znak po znaku w kodowaniu CP1250).
INTEGER Wartość liczbowa lewego operandu jest mniejsza.
DOUBLE Wartość liczbowa lewego operandu jest mniejsza.
BOOL Lewy operand to FALSE, a prawy TRUE (FALSE < TRUE).

> zwraca TRUE w sytuacjach przeciwnych. Operatory <= oraz >= są równoważne odpowiednio < lub == oraz > lub ==.

Operatory logiczne

Operatory && (koniunkcja) i || (alternatywa) przyjmują wyłącznie operandy typu BOOL. Podanie operandu innego typu (nawet jeżeli mógłby zostać rzutowany) powoduje błąd silnika.

Operator Wynik
&& TRUE tylko jeżeli oba operandy są TRUE.
`

W warunku złożonym instrukcji @IF operatory && i || zachowują się tak samo, ale zapisywane są jako część ciągu warunku, nie jako operatory wyrażenia arytmetycznego.