قم بإنشاء كائن متعدد الحدود من رقم باستخدام فئة التغيير
-
22-09-2019 - |
سؤال
لقد كتبت فئة متعددة الحدود على طول الخطوط الموضحة في SICP 2.5.3 (باستثناء استخدام defclass). أود أن أكون قادرًا على إضافة عدد متعدد الحدود وضرب الأرقام العادية بسلاسة ، لكن لا يمكنني جعل الفئة المتغيرة تقبل رقمًا.
حاولت تبسيط المشكلة عن طريق تغيير الفصل من عدد صحيح إلى تعويم:
(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]
أحصل على خطأ من نفس النموذج من (FYI):
(change-class 4 'polynomial)
سأمضي قدماً وتنفيذ تحويل يدوي ، لكنني أفضل استخدام المرافق المضمنة.
كما يشير Xach ، يمكنني استخدام Coerce أو Float لتغيير 4 إلى تعويم. كان المقصود ذلك كمثال أبسط لما كنت أحاول القيام به وإزالة أي إمكانية لخطأ من فئة التحديث الخاصة بي.
إليكم الإصدار الأطول لما جربته لم ينجح:
(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)
ما زلت أحصل على خطأ مثل المثال أعلاه:
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]
المحلول
لا يمكنك استخدام فئة التغيير مع الأرقام. الأرقام ليست مثيلات من فصول الإغلاق. يُعتقد أيضًا أن فئة التغيير بشكل مدمر قم بتعديل مثيل إلى فئة جديدة ، دون تغيير هوية المثيل الأصلي.
أود إما:
أضف طرقًا لتغيير الفئة التي تفعل ما تريد
أو اكتب تغييرًا في الوظيفة ، وهو ينفذ قواعد الإكراه المخصصة المختلفة والمكالمات تغيير الفئة لأي تغيير من فئة الإغلاق إلى فئة أخرى.
نصائح أخرى
يمكنك استخدام الاشماء أو التعويم للقيام بذلك:
(float 4) => 4.0
(coerce 4 'float) => 4.0