2016-11-22 43 views
5

我有這樣一個有沒有辦法獲得班級的插槽?

(defclass shape() 
((color :initform :black) 
(thickness :initform 1) 
(filledp :initform nil) 
(window :initform nil))) 

類是有共同點,口齒不清的功能如何讓這些插槽的列表,如果我只知道這個類的實例?

+1

密切相關:http://stackoverflow.com/q/38452350/124319 – coredump

+0

好的,謝謝你的回答。但我有另一個問題。我需要了解課堂上的每種方法。即使方法來自繼承類。 '(defclass point(shape) ((x:initform 0) (y:initform 0))) '有沒有辦法,如何得到它? – Micky

+0

查看鏈接的問題。 – coredump

回答

8

許多Common Lisp實現支持CLOS 元對象協議。這爲類,插槽和其他的元對象提供了內省操作。

在LispWorks中,相應的功能可以在包CL-USER中直接訪問。

CL-USER 139 > (defclass shape() 
       ((color :initform :black) 
       (thickness :initform 1) 
       (filledp :initform nil) 
       (window :initform nil))) 
#<STANDARD-CLASS SHAPE 40202910E3> 

CL-USER 140 > (mapcar #'slot-definition-name 
         (class-direct-slots (class-of (make-instance 'shape)))) 
(COLOR THICKNESS FILLEDP WINDOW) 

功能slot-definition-nameclass-direct-slots由用於CLOS元對象協議定義,並且在許多普通的Lisp實現支持 - 只要它們在可能不同的包。例如在SBCL中,人們可以在包SB-MOP中找到它們。

從一堂課我們可以得到直接插槽列表。直接插槽是直接爲該類定義的插槽,它們不會被繼承。如果您想獲得所有插槽的列表,請使用功能class-slots

插槽這裏表示我們得到一個插槽定義對象,它描述了插槽。要獲取插槽的名稱,您必須使用功能slot-definition-name從插槽定義對象中檢索名稱。

+1

@Micky另見https://github.com/pcostanza/closer-mop。你也可以使用'(apropos'slot-definition-name)'來找出在你的實現中定義了哪些包。 – coredump

+1

@coredump謝謝,這幫助我弄清楚如何在sbcl上運行它: – Pascal

+1

(mapcar#'sb-mop:slot-definition-name (sb-mop:class-direct-slots(class-of(make-instance '形狀)))) – Pascal

相關問題