Na przykład chcesz wymienić rozmiary czcionek:
(defconstant +large+ 3)
(defconstant +medium+ 2)
(defconstant +small+ 1)
Mogłeś napisać makro, aby to krótsze.
Powyższe definicje stałe są zazwyczaj TYLKO napisane, gdy liczby te należy przekazać do zewnętrznego kodu innego niż Lisp.
W przeciwnym razie wystarczy użyć symboli słów kluczowych:: duży,: średni i: mały.
Możesz je przetestować za pomocą EQ i wszystkiego, co używa jakiegoś testu dla równości.
(let ((size :medium))
(ecase size
(:small ...)
(:medium ...)
(:large ...)))
Można również napisać metod IT:
(defmethod draw-string (message x y (size (eql :large))) ...)
Jak wspomniano można zdefiniować typ zestawie:
(deftype size() '(member :small :medium :large))
Następnie można sprawdzić, czy coś jest jedną z tych:
(let ((my-size :medium))
(check-type my-size size))
Powyżej zasygnalizować błąd, jeśli mój rozmiar nie jest jednym z: small,: medium or: large.
Można również użyć typu w formie defclass:
(defclass vehicle()
((width :type size :initarg :width)))
Teraz można utworzyć obiektów jak tutaj:
(make-instance 'vehicle :width :large)
Niektóre wspólne implementacje Lisp sprawdzi kiedy ustawić gniazdo do niektórych nielegalna wartość.
Jeśli teraz tworzysz obiekty klasy pojazdu, gniazda będą następujące: duży,: średni lub: mały. Jeśli spojrzysz na obiekt w debugerze, inspektorze lub jakimś innym narzędziu, zobaczysz nazwy symboliczne, a nie 1, 2 lub 3 (lub jakiekolwiek wartości, których normalnie używasz).
Jest to część stylu Lisp: w miarę możliwości używaj nazw symbolicznych. Używaj symboli z wartościami liczbowymi tylko w kodzie interfejsu dla obcych funkcji (np. Wywoływanie zewnętrznego kodu C, który używa enums).
Tak, ale lepiej użyj słów kluczowych. – kmkaplan
To dobra uwaga: dzięki słowu kluczowemu unikasz martwienia się o to, w którym pakiecie znajdują się twoje symbole. –
W rzeczywistości funkcje ogólne mogą specjalizować się tylko w klasach, a nie arbitralnie. –