Ří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:
then
v případětest !EQ true
else
v 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
.