Hibakeresés, nyomkövetés

19.1. Kérdés.
Sajnos nem emlékszem, hogy a Prolog trace"-eljárásához hasonló van-e az SML-ben. Jól jönne. De van egy olyan érzésem hogy nincs... Az mosml-ben hogyan kell debuggolni? Valahogyan beletracelni az SML-programba? Mert a nagyházi-ellenőrző nagyon informatív "Nulla megoldást találtam" eredményével nem sokat tudok kezdeni. :(

19.1. Válasz.
Hallgató: Nincs, de jó helyen elhelyezett printekkel meg kivételkezeléssel nagyon frankón tudod követni a programjaid... :)

Oktató: Beépített hibakereső (debugger) vagy nyomkövető (trace) nincs az mosml-ben. :-( Csak a kőbaltás módszer van: print és printVal függvényhívásokat rakhat a programszövegbe, és ezekkel tetszőleges debug-üzeneteket írathat ki futás közben. Pl.

(print "f hívása\n"; printVal(f 1 #"2" "3"))
Ez nem túl szép (nem nevezhető deklaratívnak), de nagyon hasznos lehet. Ha a print helyett a TextIO.output függvényt használja, a nyomkövető-üzeneteket tetszőleges fájlba tudja írni.

Szerencsére az sml szigorú típusellenőrzése sok hibára fényt derít már fordítási időben. Sokat segít az is, ha a programját sok rövid, könnyen ellenőrizhető függvényből rakja össze: ha ezeket sikerül hibátlanul megírni, akkor a felhasználásukkal felépített függvények is rövidek, könnyen ellenőrizhetők maradnak, így az ezek felhasználásával felépített függvények is rövidek, könnyen ellenőrizhetők maradnak s.í.t.

Ha ragaszkodik a hibakeresőhöz és a nyomkövetőhöz, a Poly/ML-ben vannak ilyen segédeszközök (de nem olyan fejlettek, kényelmesek, mint a SICStus-ban). Lásd még:

19.2. Kérdés.
Mit jelent az alábbi hibaüzenet? Váratlan fájlvége? Szerintem mindent lezártam, nincs befejezetlen ág, minden if-hez tartozik then ... else ldots Tanácstalan vagyok, nem tudom debuggolni:

File "K.sml", line 262, characters 0-1:
! <EOF>
! J
! Syntax error.

19.2. Válasz.
Hallgató: Valamit mégiscsak elfelejtettél lezárni. Azt javaslom, próbáld meg a fájlt darabokban odaadni az értelmezőnek. Legcélszerűbb felezéssel (először az első felét, ha nincs hiba, a háromnegyedét, ha van, a negyedét stb.)

A másik lehetőség, hogy beszúrsz pontosvesszőket a deklarációk végére, akkor jobban fogod látni, hogy mi az, ami még hibátlan, és mi az, amit már nem fogad el.


Deklaratív programozás - FP-GYIK
2005. március 1.