Řídicí výrazy¤
SP-Lang nabízí celou řadu řídicích výrazů.
!IF: Jednoduché podmíněné větvení¤
Typ: Mapping.
Výraz !IF je rozhodovací výraz, který vede vyhodnocení k rozhodování na základě zadaného testu.
!IF
test: <expression>
then: <expression>
else: <expression>
Na základě hodnoty test se vyhodnotí větev:
thenv případětest !EQ trueelsev případětest !EQ false
Oba případy then a else musejí vracet stejný typ, který bude zároveň typem návratové hodnoty !IF.
Příklad
!IF
test:
!EQ
- !ARG input
- 2
then:
It is two.
else:
It is NOT two.
!WHEN: Násobné větvení¤
Typ: Sequence.
Výraz !WHEN je podstatně silnější než výraz !IF.
Jednotlivé případy mohou odpovídat mnoha různým vzorům, včetně intervalových shod, tuples atd.
!WHEN
- test: <expression>
then: <expression>
- test: <expression>
then: <expression>
- test: <expression>
then: <expression>
- ...
- else: <expression>
Pokud není zadáno else, pak WHEN vrací False.
Příklad
Příklad použití !WHEN pro přesnou shodu, shodu rozsahu a nastavenou shodu:
!WHEN
# Přesná shoda hodnot
- test:
!EQ
- !ARG key
- 34
pak:
"třicet čtyři"
# Shoda rozsahu
- test:
!LT
- 40
- !ARG key
- 50
then:
"čtyřicet až padesát (bez krajních hodnot)"
# In-set match
- test:
!IN
what: !ARG key
where:
- 75
- 77
- 79
then:
"sedmdesát pět, sedm, devět"
- else:
"neznámý"
!MATCH: Porovnávání vzorů¤
Typ: Mapping.
!MATCH
what: <what-expression>
with:
<value>: <expression>
<value>: <expression>
...
else:
<expression>
Výraz !MATCH vyhodnotí výraz what-expression, přiřadí hodnotu výrazu k klauzuli case a provede výraz expression spojený s tímto případem.
Větev else výrazu !MATCH je nepovinná.
Výraz selže s chybou, pokud není nalezena žádná odpovídající <value> a větev else chybí.
Příklad
!MATCH
what: !ARG value
with:
1: "jedna"
2: "dva"
3: "tři"
else:
"jiné číslo"
Použití !MATCH pro strukturování kódu
!MATCH
what: !ARG kód
with:
1: !INCLUDE code-1.yaml
2: !INCLUDE code-2.yaml
else:
!INCLUDE code-else.yaml
!TRY: Provádění operací dž do prvního bezchybného výrazu¤
Typ: Sequence
!TRY
- <expression>
- <expression>
- <expression>
...
Iteruje jednotlivými výrazy (odshora dolů), pokud výraz vrátí nenulový výsledek (None), zastaví iteraci a vrátí tuto hodnotu.
V opačném případě pokračuje k dalšímu výrazu.
Při dosažení konce seznamu vrátí None (chyba).
Poznámka: Zastaralý název tohoto výrazu byl !FIRST. Nepoužívá se od listopadu 2022.
!MAP: Použít výraz na každý prvek v posloupnosti¤
Typ: Mapping.
!MAP
what: <sequence>
apply: <expression>
Výraz apply se aplikuje na každý prvek v posloupnosti what s argumentem x obsahujícím příslušnou hodnotu prvku.
Výsledkem je nový seznam s transformovanými prvky.
Příklad
!MAP
whaz: [1, 2, 3, 4, 5, 6, 7]
apply:
!ADD [!ARG x, 10]
Výsledek je [11, 12, 13, 14, 15, 16, 17].
!REDUCE: Redukce prvků seznamu na jedinou hodnotu¤
Typ: Mapping.
!REDUCE
what: <expression>
apply: <expression>
initval: <expression>
fold: <left|right>
Výraz apply se aplikuje na každý prvek v posloupnosti what s argumentem a obsahujícím agregaci operace reduce a argumentem b obsahujícím příslušnou hodnotu prvku.
Výraz initval poskytuje počáteční hodnotu pro argument a.
Nepovinná hodnota fold určuje "levé skládání" (left, výchozí) nebo "pravé skládání" (right).
Příklad
!REDUCE
what: [1, 2, 3, 4, 5, 6, 7]
initval: -10
apply:
!ADD [!ARG a, !ARG b]
Vypočítá součet posloupnosti s počáteční hodnotou -10.
Výsledek je 18 = -10 + 1 + 2 + 3 + 4 + 5 + 6 + 7.