2010-03-28 5 views
2

나는 SICP 2.5.3에 설명 된 행을 따라 다항식 클래스를 작성했습니다 (defclass 사용 제외). 다항식과 일반 숫자를 자연스럽게 추가하고 곱할 수 있기를 원하지만 숫자를 수락하는 change-class는 만들 수 없습니다. change-class를 사용하여 숫자에서 다항식 객체 만들기

나는 부동의 정수에서 클래스를 변경하여 문제를 단순화하기 위해 노력 :

(change-class 4 'float) 

그러나 그것은 나에게 오류 준 : 저도 같은 형태의 오류에서 얻을

There is no applicable method for the generic function 
#<STANDARD-GENERIC-FUNCTION CHANGE-CLASS (7)> 
when called with arguments 
(4 #<BUILT-IN-CLASS FLOAT>). 
[Condition of type SIMPLE-ERROR] 

을 (참고) :

(change-class 4 'polynomial) 

내가 가서 수동 변환을 구현하는거야하지만 난에 선호 붙박이 닫는 기능을 사용하십시오.

Xach가 지적한 것처럼 강제 변환을 사용하여 4를 float으로 변경할 수 있습니다. 그것은 내가하려고했던 것의 간단한 예로서 의도 된 것이고, 다른 클래스의 인스턴스 (instance-for-different-class)가 잘못되었을 가능성을 제거하기위한 것입니다.

(defclass polynomial() 
((var :accessor var :initarg :var :initform 'x) 
    (terms :accessor terms :initarg :terms :initform (make-empty-term-list)))) 

(defmethod update-instance-for-different-class :before ((old number) 
         (new polynomial) 
         &key) 
    (setf (slot-value new 'terms) (adjoin-term (make-term old 0) 
          (make-empty-term-list)))) 

(change-class 4 'polynomial) 

을 난 아직도 위의 예와 같은 오류가 발생 : 당신이 강제 또는 FLOAT를 사용할 수 있습니다

There is no applicable method for the generic function 
    #<STANDARD-GENERIC-FUNCTION CHANGE-CLASS (7)> 
when called with arguments 
    (4 #<STANDARD-CLASS POLYNOMIAL>). 
    [Condition of type SIMPLE-ERROR] 

답변

1

숫자가있는 CHANGE-CLASS는 사용할 수 없습니다. 숫자는 CLOS 클래스의 인스턴스가 아닙니다. CHANGE-CLASS는 또한 으로 파괴적이라고 생각합니다. 원래 인스턴스의 신원을 변경하지 않고 새 클래스로 인스턴스를 수정하십시오.

나는 것 중 하나

  • 다양한 사용자 정의 강제 변환 규칙을 구현하고 대한 CHANGE-CLASS를 호출하는 기능 변경을, 당신이

  • 를 원하는 것을 그-CLASS를 변경하거나 작성하는 방법을 추가 하나의 CLOS 클래스에서 다른 CLOS 클래스로 변경하십시오.

+0

감사합니다. cl은 객체가 항상 아래로 내려져 있지만 실제로는 CLOS가 아님을 상기하기 때문에 혼란스러워합니다. 방금 ​​하이퍼 스펙을 확인한 결과 "모든 객체가 속한 유형의 이름 --- 모든 유형의 상위 유형 (자체 포함) 3. 모든 클래스의 수퍼 클래스 이름 그 자체를 제외하고. " 아마도 나는이 라인들을 따라 새로운 질문을 만들 것입니다. – charlieb

+0

@charlieb : 클래스와 유형은 CL에서 두 가지 다른 점임을 명심하십시오. 또한 CL은 객체를 세 가지 범주로 나눕니다. 1) 숫자, 문자 및 문자열과 같은 내장 클래스. 2) 구조 및 3) CLOS 인스턴스. CLOS를 사용하면 내장 유형 및 구조에 대한 메소드를 작성할 수 있지만, 이것 때문에 CLOS 오브젝트가 아닙니다.CLOS 객체는 모두 STANDARD-OBJECT에서 상속합니다. 예를 들어 숫자는 클래스 NUMBER를 가지며, 그 자체는 표준 클래스가 아니고 BUILT-IN-CLASS입니다. –

+0

혼란의 일부가 "개체"라는 단어라고 생각합니다. 많은 언어에서 "클래스의 인스턴스"를 의미합니다. Common Lisp에서는 "모든 Lisp 데이터"를 의미합니다 - http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_o.htm – Ken

2

여기

작동하지 않았다 내가 뭘하려의 긴 버전입니다 그렇게하십시오 :

(float 4) => 4.0 
(coerce 4 'float) => 4.0 
+0

안녕하세요 Xach,하지만 커 스터스를 사용하여 사용자 정의 클래스로 번호를 변경할 수 있습니까? – charlieb

+0

아니요. 일반 CL 산술 함수는 자신의 클래스 인스턴스에서 사용할 수 없습니다. 일반 함수가 아닙니다. – Xach