To zdarza mi się raz po raz: definiuję klasę i zapominam, że chciałem ją wypakować lub jest to, powiedzmy, klasa widgetu Gtk, dlatego trzeba podać metaklas. Jednak po zdefiniowaniu, SBCL nie pozwala mi zmienić metaklasy (nawet jeśli nie ma instancji tej klasy). Na przykład, ocenyJak zmienić metaklum klasy
(defclass foo()
((slot-a)))
a następnie dodanie metaklasa i ponownej oceny:
(defclass foo()
((slot-a))
(:metaclass gobject:gobject-class))
wyniki w błędzie:
Cannot CHANGE-CLASS objects into CLASS metaobjects.
[Condition of type SB-PCL::METAOBJECT-INITIALIZATION-VIOLATION]
See also:
The Art of the Metaobject Protocol, CLASS [:initialization]
Niestety nie ma kopii sztuki protokołu Metaobject, aby sprawdzić, co mówi. Na razie jedyny sposób, jaki mogłem wymyślić, to zrestartować seplenienie, co może być dość uciążliwe.
Ponieważ już niedługo zdaję sobie sprawę z błędu, nie mam nic przeciwko unikaniu całej klasy przez jej usunięcie. Pytania:
- Jeśli utworzyłem instancje klasy, czy istnieje sposób na ich znalezienie, aby unieważnić je i uzyskać GCed?
- Jak usunąć zajęcia? Coś jak
fmakunbound
dla funkcji.