A Mercury programozási nyelv

Termek

Mercury-ban a kifejezések (termek) szintaktikailag pontosan megegyeznek az ISO Prolog kifejezéseivel, néhány kiterjesztést kivéve. Ilyen bővítés a magasabb rendű term fogalmának bevezetése, az infix operátorok használata visszafelé dőlő ékezetek (`, backquote) között, valamint beépített operátorok egész sora. Szintén különbség, hogy míg Prolog-ban a lista kifejezések konstruktora a ./2, addig Mercury-ban ez a [|]/2 operátor.

Egy kifejezés (term) vagy egy változó, vagy egy funktor.

Egy funktor lehet egy egész, egy tört, egy string, egy névkonstans, egy összetett kifejezés (compound term) vagy egy magasabb rendű kifejezés (high-order term).

Egy összetett kifejezés lehet egy egyszerű összetett kifejezés (simple compound term), egy lista kifejezés (list term), egy tuple term, egy operátor term, vagy egy zárójelezett kifejezés.

Egy egyszerű összetett term áll egy névből, melyet egy nyitó gömbölyű zárójel (vagyis egy open_ct token) követ közbeeső whitespace-ek nélkül, ezután vesszővel elválasztva következik az argumentum termek sorozata, majd legvégül egy bezáró gömbölyű zárójel.

Egy lista term egy nyitó szögletes zárójellel (vagyis egy open_list tokennel) indul, melyet követ az argumentum termek vesszővel elválasztott sorozata, ezt opcionálisan követheti egy függőleges vonal ("|", vagyis egy close_list token), melyet egy term és egy bezáró szögletes zárójel (close_list token) követ. Az üres lista kifejezés egy opern_list és egy close_list tokenből áll. A lista termek értelmezése a következők szerint történik

  parse('[' ']') = [].
parse('[' List) = parse_list(List).
parse_list(Head ',' Tail) = '[|]'(parse_term(Head), parse_list(Tail)).
parse_list(Head '|' Tail ']') = '[|]'(parse_term(Head), parse_term(Tail)).
parse_list(Head ']') = '[|]'(parse_term(Head), []).

A következő kifejezések mindegyike ekvivalens:

  [1, 2, 3]
[1, 2, 3 | []]
[1, 2 | [3]]
[1 | [2, 3]]
'[|]'(1, '[|]'(2, '[|]'(3, [])))

Egy tuple term egy bal kapcsos zárójellel (open_curly tokennel) kezdődik, melyet az argumentum termek vesszővel elválasztott sorozata és egy jobb kapcsos zárójel (close_curly token) követ. Az {1, '2', "three"} egy érvényes tuple kifejezés.

Egy operátor term egy olyan term, melyet - ahogyan Prologban - az operátor jelöléssel adunk meg. Operátort készíthetünk egy névből, egy modulminősített névből (lásd A modul rendszer) vagy egy változóból, ha visszafelé dőlő ékezetek (backquote) közé írjuk őket. Tetszőleges névkonstans vagy változó használható ily módon operátorként. Ha fun egy változó vagy egy névkonstans, akkor az X `fun` Y alakú term ekvivalens a fun(X, Y) formával. Az operátor balasszociatív, és jobban köt minden operátornál a ^ operátort kivéve (lásd a Beépített operátorokat).

Egy zárójelezett kifejezés egy nyitó gömblyű zárójel után álló kifejezésből és az ezután álló csukó gömbölyű zárójelből áll.

Egy magasabb rendű term egy olyan "függvény" ("closure") term, ami egy tetszőleges olyan term, ami nem egy név és nem egy operátor term, melyet közbeeső whitespace-ek nélkül egy nyitó zárójel (vagyis egyopen_ct token) követ, majd vesszőkkel elválasztva az argumentumtermek sorozata, végül egy bezáró zárójel követ. Egy magasabb rendű term ekvivalens azzal az egyszerű összetett termmel, melynek funktora az üres név, argumentumai pedig a "függvény" term, melyet ennek az argumentum termjei követnek. Vagyis a következő term ha Term(Arg1, ..., ArgN) formájuk, akkor az elemzése ''(Term, Arg1, ..., ArgN) formájúként történik meg Vegyük észre, hogy a függvény term lehet zárójelezett is; például a (Term ^ FieldName)(Arg1, Arg2) egy magasabb rendű term, és így az elemzése úgy történik, mintha ''((Term ^ FieldName), Arg1, Arg2) formájú lenne.