Greg Pfeil的Class Hierarchy圖提供了Common Lisp類型系統的全面圖片。但我試圖更好地理解層次結構頂部的階級關係。舉一個簡單的例子,讓(defstruct person name age)
,然後(defparameter *p1* (make-person :name "Yosh" :age 19)
。現在Common Lisp類層次結構
(typep *p1* 'person)
T
(typep *p1* 'structure)
T
(typep *p1* 'structure-object)
T
(typep *p1* 'atom)
T
(typep *p1* t)
T
的Hyperspec說爲
structure-object
的優先級列表只是本身t
。 和structure
是否在層次結構中沒有類型?什麼是
t
的所有直接亞型?更一般地說,如何檢索任何給定類型的所有直接子類型或超類型(沒有反覆試驗錯誤subtypep
)?或者,有沒有辦法遍歷所有類型的列表? MOP是否提供了獲取所有子類/超類的功能?通過與集合論的類比,似乎所有Common Lisp類型/類在理論上可以細分爲兩個子類
t
;即,standard-object
(對應於元件與像數字3,字符串「abc」,結構s1中,方法M1,等情況下),和standard-class
(對應於套與實例如類standard-object
,所述類別number
,類別structure-object
等)。如果這不是t
的實際細分,是否與實際實施有關;例如,避免層次結構中的遞歸類關係?
因爲所有的類都有相應的類型,那麼假設你可以使用'subtypep'來測試子類以及亞型?同樣,如果需要訪問實際的類對象,則可以使用'type-of'來發現任何對象的類型(basic或clos),而使用'class-of'? – davypough