A Miranda programozási nyelv

Alap gondolatok

Alap gondolatok

A Miranda programozási nyelv teljesen funkcionális - nincs benne semmiféle mellékhatás és imperatív sajátság. A program (tulajdonképpen Mirandában script-nek hívjuk) egyenletek gyûjteménye, amelyek számunkra szükséges különféle függvényeket és adatstruktúrákat definiálják. Az egyenletek sorrendje általában nem lényeges. Például nem kötelezõ az elsõ használat elõtti definíció. Itt egy nagyon egyszerû
Miranda script:

z = sq x / sq y
sq n = n * n
x = a + b
y = a - b
a = 10
b = 5

Megjegyzendõ, hogy nincs szintaktikus teher - a Mirandát úgy tervezték, hogy a kód minél tömörebb legyen. Nincsen kötelezõ típusdeklaráció, bár (mint késõbb látni fogjuk) a nyelv erõsen típusos. Nincsenek pontosvesszõk a definíciók végén - a mondatelemzõ algoritmus intelligensen használja az elrendezést (a bekezdések mélységét veszi alapul). A függvényhívás jelölése a függvénynév és paraméterek egyszerû egymás mellé írása (pl.: sq x). A négyzetfüggvény (sq) definíciójában az n formális paraméter, melynek láthatósága a saját egyenletére korlátozott. Míg a fenti példában bevezetett további nevek (a, b, ...) a teljes script-ben láthatóak.
A leggyakrabban használt adatstruktúra a list (lista), melyet a Mirandában szögletes zárójelek és vesszõk segítségével írunk, pl.:

1:(2:(3:(4:(5:[]))))    || számok listája 1-tôl 5-ig
1:2:3:4:5:[]    || zárójelek elhagyhatók
[1,2,3,4,5]    || egy rövidebb jelölés
True:(False:(False:[]))    || logikai értékek listája

week_days = ["Mon","Tue","Wed","Thur","Fri"]
days = week_days ++ ["Sat","Sun"]
Listákat a ++ operátorral tudunk összefûzni.

A lista végét pedig a [] konstruktor jelzi. További hasznos listaoperátorok: :, mely a lista elejéhez fûz egy elemet, #, mely a lista hosszát adja vissza, és a !, mellyel az indexelés végezhetõ. Például a 0:[1,2,3] eredménye a [0,1,2,3], #days értéke a 7, és a days!0 a "Mon"-nak felel meg.
Létezik egy -- operátor is, mely kivonást valósítja meg. Az [1,2,3,4,5] -- [2,4] megfelel az [1,3,5]-nek. Az aritmetikai sorozatokat tartalmazó listáknak egy rövid jelölése a ... Vegyük például a faktoriális függvény definícióját, és az 1 és 100 közötti páratlan számok összegzését (a sum és a product könyvtári függvények):

fac n = product [1..n]
result = sum [1,3..100]


A lista elemei azonos típusúak. Különbözõ típusú elemek sorozata a tuple, melyet zárójelek segítségével írunk. Például:

employee = ("Jones",True,False,39)

A tuple a Pascal rekordjához hasonlítható (míg a listát a Pascal tömbjéhez hasonlíthatnánk). A tuple-ket nem lehet indexelni - elemeiket mintaillesztéssel kérdezhetjük le (lásd késõbb). Nagy választéka adott az elõre definált infix és prefix operátoroknak. Ezek prioritási sorrendje: <

    operátor                    típusa                          jelentése
----------------------------------------------------------------------------
  :                          *->[*]->[*]                       lista konstruktor
  ++, --                 [*]->[*]->[*]                 lista konkatenáció,különbség
  \/, &                 bool->bool->bool                logikai vagy, és
  ~                         bool->bool                       logikai negáció
  >,>=,=,~=...       *->*->bool                           relációk
  +, -, *, /            num->num->num                     +, -, *, /   
  div, mod           num->num->num              egész hányados, maradék
  ^                      num->num->num                     hatvány
  .               (**->***)->(*->**)->*->***  függvénykompozíció
  #                      [*]->num                                lista hossza
  !                       [*]->num->*                        listaelem értéke