Zwykle można używać funkcji akcesorów ze strukturami.
Twój kod definiuje funkcje dostępowe point-x
i point-y
. Możesz ich użyć.
Można również użyć SLOT-VALUE
ze strukturami na implementacjach, które go obsługują. Sądzę, że to większość implementacji (GCL byłby wyjątkiem). Istnieje oprogramowanie Lisp, które zakłada, że SLOT-VALUE
działa dla struktur. Nie sądzę, że implementacje usuwają wsparcie dla niego. It'a nie jest w standardzie, ponieważ niektórzy implementatorzy nie będą chcieli zapewnić tej funkcjonalności w wdrożonych aplikacjach.
Tak więc oba sposoby są w porządku.
Jeśli chcesz mieć krótkie nazwy, iść z akcesorów:
CL-USER 109 > (defstruct (point :conc-name)
(x 0) (y 0))
POINT
CL-USER 110 > (make-point :x 5 :y 3)
#S(POINT :X 5 :Y 3)
CL-USER 111 > (setf p1 *)
#S(POINT :X 5 :Y 3)
CL-USER 112 > (x p1)
5
CL-USER 113 > (setf p2 (make-point :x 2 :y 3))
#S(POINT :X 2 :Y 3)
CL-USER 114 > (list p1 p2)
(#S(POINT :X 5 :Y 3) #S(POINT :X 2 :Y 3))
CL-USER 115 > (mapcar 'x (list p1 p2))
(5 2)
Nazwa starć między różnymi funkcjami dostępowych następnie musiałby zostać uniemożliwione przez pakiet.
Jeśli chcesz napisać krótszą wersję SLOT-VALUE
, jest to również w porządku. Napisz makro. Lub napisz funkcję inline. Jasne, czemu nie?
Jak już powiedziałem, SLOT-VALUE
działa ze strukturami w większości implementacji. W takim przypadku nie powinieneś przejmować się, że specyfikacja ANSI CL tego nie definiuje. Na wiele sposobów implementacje rozszerzają specyfikację ANSI CL. Na przykład przez SLOT-VALUE
pracując nad strukturami, implementując strumienie jako klasy CLOS, implementując warunki jako klasy CLOS, zapewniając protokół Meta-obiektu, ...
"Możesz ich użyć." Wiem o tym, ale pochodzę z C++, które jest trochę długie/pełne gadek. W C++/C uzyskujesz dostęp do pól przez "." lub "->". To znaczy. 'punkt p; p.x = 0; '. Więc chciałem krótszą składnię. Zdefiniowałem makro "->", ale okazało się, że "wartość szczeliny" nie ma być używana w strukturach (chociaż działa w wielu implementacjach). Właśnie dlatego zadałem to pytanie. – SigTerm
Dzięki, to było całkiem przydatne/informacyjne. – SigTerm