2013-06-22 11 views
7

W typowym seplenie, co mogę użyć, aby uzyskać dostęp do slotu struktury za pomocą nazwy/symbolu gniazda?wspólne seplenienie: wartość szczeliny dla struktur zerwanych

Co chcę jest

(defstruct point (x 0) (y 0))  
(defmacro -> (struct slot) `(slot-value ,struct ,slot)) 

(setf p (make-point)) 
(setf (slot-value p 'x) 1) 
(setf (-> p 'y) 2) 

Używam clozure Cl i Na clozure cl to działa. Jednak AFAIK jest to zachowanie niestandardowe (równoważne "nieokreślonemu zachowaniu" C++). Nie mam zamiaru przełączać się na inną implementację CL, więc czy powinienem nadal używać slot-value dla struktur, czy jest lepszy sposób na to?

Odpowiedz

8

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, ...

+0

"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

+0

Dzięki, to było całkiem przydatne/informacyjne. – SigTerm