2017-02-28 193 views
0

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 
  1. Hyperspec說爲structure-object的優先級列表只是本身t。 ​​和structure是否在層次結構中沒有類型?

  2. 什麼是t的所有直接亞型?更一般地說,如何檢索任何給定類型的所有直接子類型或超類型(沒有反覆試驗錯誤subtypep)?或者,有沒有辦法遍歷所有類型的列表? MOP是否提供了獲取所有子類/超類的功能?

  3. 通過與集合論的類比,似乎所有Common Lisp類型/類在理論上可以細分爲兩個子類t;即,standard-object(對應於元件與像數字3,字符串「abc」,結構s1中,方法M1,等情況下),和standard-class(對應於與實例如類standard-object,所述類別number,類別structure-object等)。如果這不是t的實際細分,是否與實際實施有關;例如,避免層次結構中的遞歸類關係?

回答

6

類型和類是兩個不同的東西。

不要混淆它們。

某些類型有相應的類。大多數沒有。

​​是類型的名稱,但不是類的名稱。

CL-USER 18 > (find-class 'atom nil) 
NIL 

由於​​不是類,它不能在任何類優先級表。 因此​​不在structure-object的類別優先順序列表中。

structure類型是非標準的,並未由ANSI CL定義。

類型不在類優先級列表中,類是。

的數據類型的接口:

  • 創建一個類型 - >DEFTYPE
  • 是一類的東西嗎? - >TYPEP
  • 是另一種類型的子類型? - >SUBTYPEP
  • 什麼是某種類型的東西? - >TYPE-OF

這基本上都是你可以用類型做的。

CLOS類都有相應的類型

CLOS函數和類優先級列表不工種,但類都有相應的類型。

CL-USER 23 > (defclass bar()()) 
#<STANDARD-CLASS BAR 40200A2413> 

CL-USER 24 > (typep (make-instance 'bar) 'bar) 
T 

CL-USER 25 > (type-of (make-instance 'bar)) 
BAR 

CL-USER 26 > (class-of (make-instance 'bar)) 
#<STANDARD-CLASS BAR 40200A2413> 

CLOS與類一起工作。因此,在擴展的CLOS中,您可以請求子類和超類。但不適用於亞型或超類型。

歷史:類型和CLOS

Common Lisp的開始CLtL1與類型和沒有CLOS。

CLOS和CLOS類已在幾年後添加。它們已被添加,一些類型獲得相應的類,並使類具有相應的類型。

Common Lisp的允許定義使用類型說明符類型,如ANDORSATISFIESMEMBERNOT,...對於那些沒有相應的CLOS類存在。

還有複合類型說明符如(integer 0 100)。這些類型也沒有相應的CLOS類。

CL-USER 31 > (deftype integer100() '(integer 0 100)) 
INTEGER100 

CL-USER 32 > (find-class 'integer100) 

Error: INTEGER100 is not the name of a class 
+0

因爲所有的類都有相應的類型,那麼假設你可以使用'subtypep'來測試子類以及亞型?同樣,如果需要訪問實際的類對象,則可以使用'type-of'來發現任何對象的類型(basic或clos),而使用'class-of'? – davypough

2

所有的類都是類型,但不是所有類型都是類。一些類型是根據其他類型定義的。 原子是任何不是缺點。由於結構的實例不是缺點,它是一個原子。從HyperSpec:

Type ATOM

超類型:

原子,叔

描述:

它等同於(not cons)

作爲另一個常見的例子,考慮類型列表,這相當於(或空缺點)。 NIL(類型爲null)是一個列表,而cons是一個列表。而已。

原子列表是類,但它們是類型。

因爲我們可以有補充的類型和聯合類型和路口類型的類型層次概念變得更加複雜一點,即使仍有適當類層次結構

Hyperspec說結構對象的優先順序只有 本身和t。原子和結構是否在層次結構中不是類型?

這不像HyperSpec所說的。 HyperSpec說t是超類型結構類型。在Common Lisp中,你可以定義任意的新類型。例如,使用簡單的(deftype my-new-type(或結構對象列表)),你會有(typep * p1 *'my-new-type)也會返回true。這並不會突然使HyperSpec關於結構對象的類優先級所說的內容無效。

通過與集理論的比喻,它似乎所有Common Lisp的類型/類理論上可以分爲爲T的兩個子類

這將是這樣做的一種方式,但由於根據類型的聯合,類型的交集和類型的補充來定義新類型的能力,有很多方法可以按類型對Common Lisp的對象進行分區。