AutoCAD... AutoLISP... VisualLISP...

  [39] Symbole, zmienne

index  

  Podobnie jak we wszystkich współczesnych językach programowania AutoLISP posiada możliwość deklarowania zmiennych, przy czym w AutoLISP-ie nie jest rozróżniane pojęcie zmiennej i symbolu (np. funkcji). Właściwie każdy element języka posiadający nazwę jest symbolem. Umownie dla zmiennych można przyjąć określenie "symbolu do przechowywania danych" (będą to zmienne globalne, lokalne, argumenty funkcji), a dla symboli określenie "symbolu przechowującego dane statyczne (czyli funkcje wbudowane, użytkownika, symbole predefiniowane). Niezaprzeczalną zaletą LISP-a jest możliwość tworzenia zmiennych bez określenia typu i wielkości - mało tego, typ danych może ulegać zmianie. Ponadto deklarowanie zmiennych może być wykonane w dowolnym miejscu programu (niektóre programy wymagają deklaracji zmiennych i ich typów na początku programu). Cechy te, jako niezwykle wygodne - dają bardzo szerokie możliwości programującemu, jednocześnie "przerzucając" odpowiedzialność za zarządzanie pamięcią na interpreter LISP-a. Programującemu pozostaje tylko czuwanie nad ilością deklarowanych zmiennych i sposobem ich likwidowania. Częstym błędem programujących w AutoLISP-ie, jest niezwracanie uwagi na rodzaj i ilość zmiennych, co prowadzić może do nieprawidłowego działania programu, "zaśmiecania" pamięci i jest przejawem zwykłego niechlujstwa.

»  Nazwy zmiennych i pamięć

AutoLISP nie rozróżnia w nazwach zmiennych i symboli, wielkości liter, zatem zmienna Obj jest równoważna ze zmienną OBJ lub obj. Nazwa zmiennej nie może zawierać następujących znaków: ( ) . ' " ;. Ponadto nie może składać się z samych cyfr. Pomimo tego że obecnie w środowisku Windows, AutoLISP nie ma zbyt wygórowanych wymagań co do ilości dostępnej pamięci, tworzenie zbyt wielu zmiennych i (lub) absurdalnie długich nazwach, niepotrzebnie zajmuje pamięć, ponadto jest przejawem ujawniającym niskie kwalifikacje programującego. Bardzo przydatnym nawykiem jest definiowanie własnych funkcji z określonym unikalnym prefiksem. Pozwala to łatwiej kontrolować swoje funkcje, pozwala też pisać jasny i czytelny kod.

»  Deklaracja zmiennej

Utworzenie symbolu polega na przypisaniu do nazwy symbolu określonej wartości. Do przypisania służy funkcja setq. Przykładowo wywołanie: (setq VAR 100) tworzy zmienną o nazwie VAR z przypisaną jej wartością 100. Trzeba pamiętać że kolejne przypisania wartości do zmiennej o określonej nazwie, zastępują stare wartości nowymi.

»  Zmienne lokalne i globalne

Zmienne lokalne deklarowane są w obrębie bloku (funkcji). Do zmiennych tego rodzaju można odwoływać się tylko w obrębie tego bloku, wewnątrz którego zostały one zadeklarowane. Deklaracja zmiennej lokalnej polega na umieszczeniu jej nazwy na liście znajdującej się po nazwie funkcji po znaku prawego ukośnika. Przykładowo:
(defun MyFunc ( / a b c)
  (setq a 1
        b "XYZ"
        c T
  )
  ; ... kod programu ...
)
Symbole a b i c zadeklarowano jako zmienne lokalne. Po wykonaniu funkcji MyFunc zostaną im przypisane wartości Nil (zmienne nie będą dostępne dla innych funkcji).
Ważne:
Zmienna jest zmienną globalną tak długo dopóki nie zostanie uczyniona lokalną. Oznacza to że jakiekolwiek wywołanie funkcji setq przypisującej jakiejś zmiennej wartość i brak deklaracji jej jako zmienną lokalną oznacza określenie jej jako zmienną globalną. Do zmiennych globalnych dostęp mogą mieć wszystkie funkcje. Zmienne globalne mogą być tworzone poza funkcjami (na poziomie głównym pliku) lub wewnątrz dowolnej funkcji.

»  W jakim celu używać zmienne globalne?

Pomijam tutaj sytuację używania zmiennych globalnych z powodu niezadeklarowania ich jako lokalne. Jak to zostało wcześniej omówione, dostęp do zmiennej globalnej może mieć dowolna funkcja. W konsekwencji zmiennych globalnych można używać w zastępstwie argumentów dla wielu funkcji korzystających z tych samych danych. Funkcje mogą modyfikować wartości zmiennych globalnych, umożliwiając innym funkcjom dostęp do aktualnych danych. Pomimo tego że zmienna może mieć dowolną nazwę, użytecznym zwyczajem jest aby programujący powinien sam określił sposób nazewnictwa zmiennych globalnych dla swoich programów. Przykładowo, przedstawiane na tych stronach programy mojego autorstwa wykorzystują zmienne globalne których nazwy zaczynają się od znaków "*jk". Taki sposób ułatwia sprawdzanie wartości zmiennych na każdym etapie programu, oraz pozwala je w szybki sposób anulować.
Należy zdawać sobie sprawę żeby korzystać ze zmiennych globalnych w sposób umiarkowany, podyktowany rzeczywistymi potrzebami, generalnie jeśli nie ma takiej potrzeby, należy wszystkie zmienne deklarować zawsze jako lokalne.

»  Zmienne standardowe

AutoLISP oferuje trzy zmienne określane jako zmienne standardowe. Są to:
    PAUSE - typu STRING - wartość to znak lewego ukośnika (\\)
    PI - typu REAL określająca wartość liczby pi (w przybliżeniu 3.141592653589793)
    T - stała T - ma wartość nie-nil
Do czego służą te predefiniowane symbole, wyjaśniać nie trzeba.

»  Na koniec

Łatwość i prostota z jakimi AutoLISP pozwala na deklarowanie, zmienianie czy anulowanie symboli (zmiennych lokalnych, globalnych, oraz funkcji), powoduje że na programującym spoczywa dbałość o zachowanie właściwego (szybkiego i bezbłędnego) środowiska. Deklarowanie zbyt dużo zmiennych globalnych, pozostawianie ich gdy nie są już potrzebne, "zaśmieca" tylko obszary pamięci dla LISP-a, często może powodować błędy (odwołania do tak samo nazwanych zmiennych przez inne programy), które jest bardzo trudno wykryć, przeszkadza w testowaniu programu itp.

Na koniec przedstawiam program (oczywiście LISP-owy) który jest "przeglądarką symboli LISP-a". Wyświetla wszystkie zadeklarowane aktualnie symbole (zmienne, funkcje wbudowane, funkcje użytkownika), wraz z ich typem, oraz aktualną wartością. Pozwala z łatwością "wyśledzić" dowolną zmienną i sprawdzić jej stan. Predefiniowane filtry pozwalają na szybsze przeglądanie symboli. Poniżej okno programu:
Program działa na wszystkich dotychczas znanych wersjach AutoCAD-a począwszy od wersji 2000 włącznie.

  Plik: se.vlx   Polecenie: SE