2017-02-28 3 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. Hyperspecstructure-object에 대한 우선 순위 목록은 자체 t 말합니다. atomstructure은 계층 구조에없는 유형입니까?

  2. t의 직접 하위 유형은 모두 무엇입니까? 보다 일반적으로, 시행 착오없이 주어진 유형의 모든 직접 부속 유형 또는 수퍼 유형을 검색하는 방법은 무엇입니까? subtypep? 또는 모든 유형의 목록을 반복 할 수있는 방법이 있습니까? MOP가 모든 하위/수퍼 클래스에 참여할 수있는 기능을 제공합니까?

  3. 집합 이론과 유사하게 모든 Common Lisp 유형/클래스는 이론적으로 t의 두 하위 클래스로 세분 될 수 있습니다. 즉, standard-object는 (숫자 3, 문자열 "ABC"구조 (S1)에있어서의 M1, 등과 같은 인스턴스 요소에 대응), 및 standard-class (클래스 standard-object 같은 인스턴스 세트 대응 클래스 number, 클래스 structure-object 등). 이것이 실제 서브 분할이 t이 아닌 경우, 이유는 실제 구현과 관련이 있습니다. 예를 들어 계층 구조에서 재귀 클래스 관계를 피할 수 있습니까?

답변

6

유형 및 클래스는 두 가지가 있습니다.

혼동하지 마십시오.

일부 유형에는 해당 클래스가 있습니다. 대부분은 그렇지 않다.

atom은 유형이 아닌 클래스의 이름입니다.

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

atom은 클래스가 아니므로 어떤 클래스 우선 순위 목록에도 속할 수 없습니다. 따라서 atomstructure-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

커먼 리스프는 유형없이 CLOS와 CLtL1 시작했다.

년 후에 CLOS 및 CLOS 클래스가 추가되었습니다. 일부 유형에 해당하는 클래스가 있고 클래스에 해당 유형이있는 방식으로 추가되었습니다.

일반 리스프 AND, ORSATISFIESMEMBER, NOT는 그 ... 대한 대응 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 '을 사용할 수 있다고 가정하십시오. 마찬가지로'class-of'를 사용하여 실제 클래스 객체에 액세스해야하는 경우'type-of'을 사용하여 객체 유형 (기본 또는 닫음)을 검색 할 수 있습니다. – davypough

2

모든 클래스가 유형이지만 모든 유형이 클래스는 아닙니다. 일부 유형은 다른 유형으로 정의됩니다. 원자은 무엇이든 cons이 아닙니다. 구조의 인스턴스는 죄수가 아니므로 원자입니다. HyperSpec을 보낸 사람 :

Type ATOM

퍼 :

원자, t

설명 :

(not cons) 동일하다.

다른 일반적인 예로서, (또는 널 양론) 동등 유형 리스트를 고려한다. NIL (null 유형)은 목록이고 cons는 목록입니다. 그게 전부 야.

아니요 원자목록도 클래스이지만 유형입니다.

우리가 보완 유형과 조합 유형과 교차 유형을 가질 수 있기 때문에, 형 계층 구조의 개념은 여전히 ​​클래스를 계층 구조 적절한이 있더라도 조금 더 복잡해진다.

하이퍼 스페셜 (Hyperspec)은 구조 객체의 우선 순위 목록이 자신과 t라고 말합니다. 원자와 구조가 계층 구조의 유형이 아닌가?

HyperSpec이 말하는 것은 아닙니다. HyperSpec은 구조 유형의 상위 유형이라고합니다. Common Lisp에서는 임의의 새로운 유형을 정의 할 수 있습니다. 예를 들어 (형식이 다른 새로운 유형 또는 구조체 개체 목록) 인 경우 (typep * p1 * 'my-new-type)도 true를 반환합니다. HyperSpec이 클래스 우선 순위 구조체 객체에 대해 말하는 것을 갑자기 무효화하지 않습니다.

집합 이론에 비유하여

, 모든 CL의 종류/클래스가 이론적 t의 두 서브 클래스로 세분화 될 수있는 것으로 보인다

하지만 때문에의, 그 일을하는 한 가지 방법이 될 것입니다

유형의 교차, 유형의 교차 및 유형의 보완과 관련하여 새로운 유형을 정의 할 수있는 능력을 갖추려면 유형별로 Common Lisp의 객체를 분할 할 수있는 많은 방법이 있습니다.