나는 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]
감사합니다. cl은 객체가 항상 아래로 내려져 있지만 실제로는 CLOS가 아님을 상기하기 때문에 혼란스러워합니다. 방금 하이퍼 스펙을 확인한 결과 "모든 객체가 속한 유형의 이름 --- 모든 유형의 상위 유형 (자체 포함) 3. 모든 클래스의 수퍼 클래스 이름 그 자체를 제외하고. " 아마도 나는이 라인들을 따라 새로운 질문을 만들 것입니다. – charlieb
@charlieb : 클래스와 유형은 CL에서 두 가지 다른 점임을 명심하십시오. 또한 CL은 객체를 세 가지 범주로 나눕니다. 1) 숫자, 문자 및 문자열과 같은 내장 클래스. 2) 구조 및 3) CLOS 인스턴스. CLOS를 사용하면 내장 유형 및 구조에 대한 메소드를 작성할 수 있지만, 이것 때문에 CLOS 오브젝트가 아닙니다.CLOS 객체는 모두 STANDARD-OBJECT에서 상속합니다. 예를 들어 숫자는 클래스 NUMBER를 가지며, 그 자체는 표준 클래스가 아니고 BUILT-IN-CLASS입니다. –
혼란의 일부가 "개체"라는 단어라고 생각합니다. 많은 언어에서 "클래스의 인스턴스"를 의미합니다. Common Lisp에서는 "모든 Lisp 데이터"를 의미합니다 - http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_o.htm – Ken