A Nemerle programhelyességi eszközkészlete elsősorban a Bertrand Meyer által bevezetett "Design by Contract" módszertan elemeit támogatja. Hasonló lehetőségeket nyújtanak például az Eiffel, Chrome vagy a Spec# nyelvek - a Nemerle ez utóbbit veszi mintául.
A helyességi szintaxis használatához importálnunk kell a Nemerle.Assertions makrókönyvtárat:
A módszertant támogató nyelveknek lehetőséget kell biztosítaniuk a program értékeire vonatkozó feltételek explicit specifikációjára, például:
A Nemerle jelenleg még nem támogat mindent a felsorolt lehetőségek közül. Az alábbiakban ismertetjük a jelenleg elérhető eszközöket, valamint a tervezett további szolgáltatásokat.
Előfeltételeket a requires attribútum segítségével adhatunk meg. Egy egyszerű példa a használatra:
Látható, hogy az attribútum használatával oly módon adhatunk meg előfeltételt, hogy az a metódus törzsét nem "szennyezi". A fordítóprogram automatikusan elhelyezi a metódus elején a kifejezés futási idejű ellenőrzését végző kódot. Ha az előfeltétel nem teljesül valamely hívás során, akkor egy AssertionException kivétel váltódik ki, melynek üzenete tartalmazza a sérült kifejezést.
A requires és a többi attribútum többször is szerepelhet egy metódus törzse előtt. Közvetlenül a paraméterlistába is beépíthetők, ezt mutatja az alábbi példa:
Az előfeltételekhez hasonló módon adhatunk meg utófeltételeket is, ehhez az ensures attribútumot kell használnunk.
Ha az eljárás valamilyen értékkel tér vissza, az utófeltételben erre az értékre a value szimbólumon keresztül hivatkozhatunk.
Példa utófeltételek használatára:
Invariánsokat osztályokra definiálhatunk. Ehhez az invariant attribútumot kell használnunk az oszály definíciója előtt.
Egy példa:
Ily módon biztosíthatjuk, hogy az objektumaink állapota "érvényes", vagyis megfelel a definiált kikötéseknek.
Invariánsokkal kapcsolatban gyakran felmerülő probléma, hogy a feltételben szereplő változók egymás értékétől függenek, így gyakorlatilag egyiket sem tudjuk módosítani az invariáns sérülése nélkül. (Például: x == y + 5). Ezért szükség van egy tranzakciós mechanizmus bevezetésére, melynek segítségével az invariáns ideiglenes "kikapcsolható".
Erre ad lehetőséget az alábbi konstrukció:
Az expose-nak azt az objektumot kell megadni, amelyre ideiglenesen ki szeretnénk kapcsolni az invariáns ellenőrzését.
Hatékonysági megfontolásokból az invariánsok ellenőrzése nem történik meg minden egyes értékadás vagy külső függvény hívása során. A Spec#-hoz hasonlóan erre ténylegesen csak az expose blokkok végén és public metódusok hívása után kerül sor.
Az alábbi szolgáltatások még nem kerültek implementálásra, de remélhetőleg a közeljövőben elérhetőek lesznek: