قم بإنشاء كائن متعدد الحدود من رقم باستخدام فئة التغيير

StackOverflow https://stackoverflow.com/questions/2532998

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top