LISP-intro – Del 3

Globale og lokale variabler

Hidtil har vi arbejdet med globale variabler forstået på den måde, at når vi én gang har defineret og loadet variabler som f.eks. ES, EN og ED (EntitySelected, EntityName, EntityData) m.fl, som vi definerede tidligere, vil disse variabler være til rådighed i AutoCAD-dokumentet, indtil dokumentet lukkes. Når vi én gang f.eks. har kaldt funktionen STOREBOGSTAVER fra AutoCADs kommandolinje, vil vi efterfølgende kunne tilgå enhver anvendt variabel ved enten blot at taste ! + variabelnavnet på AutoCADs kommandolinje eller ved blot at taste variabelnavnet i VisualLISPs console window.

Her er et eksempel hvor variablen ED (EntityData) er kaldt fra AutoCADs kommandolinje:
Kald variabel med !ed

Det betyder, at AutoCAD-dokumentet ikke “glemmer” variablen, efter at den er blevet brugt i funktionen. Det kan nogle gange være en fordel, men de fleste gange er det faktisk en ulempe, fordi variablens værdi kan “forstyrre” eventuelle andre LISP-funktioner, der f.eks. benytter samme variabel. Derfor vil det de fleste gange være bedst at benytte lokale variabler.

Indtil videre har vores funktions-definition set ud som dette …

hvor vi ikke bekymrede os om at angive, hvilke variabelnavne, vi ønskede at benytte os af. De anvendte variabler blev alle globale variabler.

Nu vil vi i stedet gøre dette …

hvor vi fortæller, hvilke variabler, funktionen skal benytte sig af. Fordelen er, at vi dermed opretter lokale variabler, der kun “lever”, mens funktionen kører og derfor aldrig kommer til at influere på andre LISP-funktioner.

Breakpoints og trinvis debugging

Under udviklingen af en funktion er det rigtig godt at have styr på, hvilke værdier, variablerne antager under afviking af funktionen, så vi effektivt kan debugge funktionen og finde frem til eventuelle fejl (bugs) i koden.

For at vi kan gøre det, afsætter vi først et eller flere breakpoints i koden.

Når et breakpoint er placeret, kan funktionen kaldes igen, hvorefter eksekveringen går i gang, men umiddelbart stopper der, hvor breakpointet er sat. Dermed aktiveres Debug-tools, og vi kan trinvist bevæge os fremad i koden ved at klikke på Step into, Step over eller Step out. Vi kan også vælge at taste F8, som svarer til Step into.
Så længe funktionen er aktiv, kan vi kalde de anvendte variabler i console-vinduet, så vi kan se værdierne undervejs, men når funktionen er færdig, bliver alle variabelværdier “glemt”.

Hvis der stadig findes variabel-værdier, efter at funktionen er afsluttet, vil det skyldes, at der stadig “hænger” globale variabler i systemet. For at komme dette til livs kan du lukke og genåbne AutoCAD-dokumentet. Dermed “glemmes” alle globale variabler.

Defun – igen

Den sidste ting, vi vil berøre i denne introduktion til AutoLISP er muligheden for at lave underordnede funktioner, der tager en eller flere givne variabel-værdier, behandler dem og returnerer en ny værdi.

Her er f.eks. en funktion, der konverterer grader til radianer:

Denne funktion kan kaldes fra andre LISP-funktioner. Den tager ét argument GRADER og indeholder én lokal variabel RAD. Sidst i funktionen returneres variablen RAD, som så kan anvendes i en overordnet funktion. Her er et meget enkelt eksempel:

Funktionen GRADERTILRADIANER kan kaldes fra AutoCADS kommandolinje (fordi funktionsnavnet er skrevet i formen C:GRADERTILRADIANER), og den indeholder én lokal variabel, som defineres, når brugeren angiver et reelt tal (for antal grader).
Det er naturligvis en forudsætning for, at det fungerer, at både funktionen GRADERTILRADIANER og funktionen DTR er loadet.

Her er et eksempel, hvor brugeren har angivet 45 grader:

Hvis brugeren afbryder funktionen, opstår der en fejlsituation, som bør håndteres. Dette ligger dog udenfor denne introduktions ramme.

Hermed afsluttes denne introduktion til AutoLISP.
Har du kommentarer, spørgsmål eller forslag til forbedringer, er du velkommen til at kontakte mig på e-mail.