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 0 — FALSE. |
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 |
TRUE → 1, FALSE → 0. |
DOUBLE |
TRUE → 1.00000, FALSE → 0.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.