A Miranda programozási nyelv

Lokális függvények és blokkstruktúra

Lokális függvények és blokkstruktúra

Általában a függvények a Mirandában globális hatáskörűek. Ez azt jelenti, hogy a függvény alkalmazható a programleírás bármely kifejezésében. De lehetőség van lokális hatáskörű függvények definiálására is a where klóz segítségével. Így a lokális függvény egy kisebb blokkban lesz definiálva, és ezen a blokkon kívül a függvény nem látható.
A legtöbb programozási nyelvben egy blokk kezdetét és végét speciális kulcsszavak vagy zárójelek jelzik. A Mirandában a blokkot az elhelyezkedése hozza létre: a blokk azokból a kifejezésekből és definíciókból áll (valamely függvénydefiníció vagy where klóz belsejében), melyek közvetlenül az egyenlőség jel, vagy az attól jobbra lévő szimbólum alatt helyezkednek el. Azt a szimbólumot, mely a definícióban a blokkon kívül helyezkedik el offside szimbólumnak hívjuk.
Egy where klóz definíciókat tartalmazhat, és egész szövegének beljebb kell lennie a környezeténél, hogy látszódjon hogy ez a jobboldal része. A where klózok egymásba ágyazhatóak tetszőleges mélységig, lehetővé téve, hogy a Miranda program egymásba ágyazott blokkstruktúrával legyen felépítve. A offside szabály határozza meg e beágyazás hatáskörét, a szövegszerű bentebb kezdés mértéke által.

globális_függvény a1 ... an = kifejezés1
globális_függvény b1 ... bn = kifejezés2
                              where lokális_függvény1 c1 ... cm =kifejezés3
                                    lokális_függvény2 d1 ... ds =kifejezés4

A lokális definíciók szintaxisa teljesen azonos a felső szinten lévőekkel, attól eltekintve, hogy típust specifikálni csak a legfelső szinten lehet.
Például lássuk a másodfokú egyenletek megoldóképletét (mely vagy visszaad egy vagy két valós gyököt, vagy hibát jelez):

quadsolve a b c = error "complex roots", if delta<0
                = [-b/(2*a)], if delta=0
                = [-b/(2*a)] + radix/(2*a),
                = [-b/(2*a) - radix/(2*a)], if delta>0
                  where delta = b*b - 4*a*c
                        radix = sq delta