Re: Listing slots in CLOS
- From: Pascal Costanza <pc@xxxxxxxxx>
- Date: Mon, 31 Mar 2008 08:46:13 +0200
Ken Tilton wrote:
vanekl wrote:Ken Tilton wrote:
vanekl wrote:
vanekl wrote:
Rupert Swarbrick wrote:
Hi,
Is there a function, which will return a list (or whatever) of the slots in a class that I've got an instance of? I'm working with a weird auto-
generated binding library, which I don't really understand... and I'd like to be able to eyeball the fields I can play with!
The only things I can find are slot-exists-p and slot-bound-p, which of course aren't quite what I'm after. If there's not a portable way to do this, I'm using sbcl.
Rupert
[211]> (asdf:oos 'asdf:load-op :closer-mop)
...
[212]> (defclass c1 () (a b))
#1=#<STANDARD-CLASS C1>
[213]> (defclass c2 (c1) (d e f))
#1=#<STANDARD-CLASS C2>
[214]> (closer-mop:compute-slots (find-class 'c2))
(#<CLOS:STANDARD-EFFECTIVE-SLOT-DEFINITION A #x2052E666>
#<CLOS:STANDARD-EFFECTIVE-SLOT-DEFINITION B #x2052E6A6>
#<CLOS:STANDARD-EFFECTIVE-SLOT-DEFINITION D #x2052E6E6>
#<CLOS:STANDARD-EFFECTIVE-SLOT-DEFINITION E #x2052E726>
#<CLOS:STANDARD-EFFECTIVE-SLOT-DEFINITION F #x2052E766>)
[217]> (dolist (slot (closer-mop:compute-slots (find-class 'c2)))
(print (closer-mop:slot-definition-name slot)))
A
B
D
E
F
NIL
originally posted by
__Pascal Bourguignon__
Disregard. This technique works in clisp 2.44 but not in sbcl,
at least not in sbcl 1.0.15.36.
I was wondering what that was all about. Seems to me compute-slots it is a tad lower-level than some of the other options, and that when it comes to flying in the face of a non-standard, the lower the worser.
kenny
Disregard the earlier disregard. This works on SBCL as long as you call:
(SB-MOP:FINALIZE-INHERITANCE (find-class 'c2))
before messing with the slots.
Great, but it is still the wrong entry point:
"Generic Function class-slots class
Returns a possibly empty set of the slots accessible in instances of class. The elements of this set are effective slot definition metaobjects.
During class finalization finalize-inheritance calls compute-slots to compute the slots of the class. That value is associated with the class metaobject and is returned by class-slots.
This generic function signals an error if class has not been finalized."
http://www.lisp.org/mop/dictionary.html#class-mo-readers
Class finalization is the step that is performed before the very first instance of a class is created (via make-instance). CLOS specifies that this step can be delayed, in order to allow handling of forward referenced classes: A class may have a direct superclass whose definition isn't loaded yet. The only time where it is strictly necessary that it is loaded is when the first instance of a class is created - hence, the separate class finalization step.
Clisp doesn't delay that step but finalizes classes immediately. SBCL delays that step - that's why you get the error when you call compute-slots or class-slots immediately after a class has been defined.
You can call finalize-inheritance yourself to make sure that compute-slots and class-slots don't throw an error. However, note that finalize-inheritance itself may throw an error in case one of the superclasses is a forward referenced class that doesn't exist yet. So there is no way to guarantee that you don't get an error when inspecting certain class properties.
There is a predicate class-finalized-p that you can test. It never throws an error an class metaobjects, but tells you whether you can safely inspect other class properties or not.
The delay of finalizing class definitions comes from the specification of defclass in the HyperSpec, where it says that "it is not required that the superclasses of a class be defined before the defclass form for that class is evaluated" and "all the superclasses of a class must be defined before an instance of the class can be made."
The delay is further detailed in the CLOS MOP specification under the heading "the class finalization protocol."
It is important that you study these protocols in detail, and not just guess and use a try-and-error approach.
Pascal
--
1st European Lisp Symposium (ELS'08)
http://prog.vub.ac.be/~pcostanza/els08/
My website: http://p-cos.net
Common Lisp Document Repository: http://cdr.eurolisp.org
Closer to MOP & ContextL: http://common-lisp.net/project/closer/
.
- References:
- Listing slots in CLOS
- From: Rupert Swarbrick
- Re: Listing slots in CLOS
- From: vanekl
- Re: Listing slots in CLOS
- From: vanekl
- Re: Listing slots in CLOS
- From: Ken Tilton
- Re: Listing slots in CLOS
- From: vanekl
- Re: Listing slots in CLOS
- From: Ken Tilton
- Listing slots in CLOS
- Prev by Date: Re: Parens Matching
- Next by Date: error in unless
- Previous by thread: Re: Listing slots in CLOS
- Next by thread: Re: Listing slots in CLOS
- Index(es):
Relevant Pages
|