سؤال

أحاول تشغيل نموذج رمز تتبع Ray Paul Graham's ansi الشائعة lisp على OS X باستخدام SLIME مع OpenMCL (حسنا ، تسمى الآن CCL). في هذا الرمز ، هناك محدد ثابت له قيمته هي بنية ، وعندما أدعو أي منهما الوحل-إجمالي الحمل أو الوحل- ديفون في أي وظيفة تستخدم الثابت ، أحصل على رسالة خطأ:

لا يتم تعريف أي طريقة من أشكال التحميل لـ #S (النقطة: x 0: y 0: z 200) [شرط النوع البسيط للخطأ

وجدت منشور شرح المضاعفات و واحدة أخرى من الرثاء ، ولكن ما الذي يجب إضافته إلى الكود للتفاوض على هذا الجانب من OpenMCL؟

هل كانت مفيدة؟

المحلول

عندما تظهر الكائنات الهيكلية (وبعض أنواع الكائنات الأخرى) ككائنات حرفية ، يتم معالجتها من خلال ترجمات ترجمة ، فإن ملف الترجم يحتاج إلى معرفة كيفية ترتيب ذلك ، عندما يتم تحميل الملف الثنائي الناتج ، "مكافئ" تم إنشاء الكائن. هناك العديد من التعريفات المحتملة لـ "المكافئ": في بعض الأحيان ، من المهم أن تكون مكونات بنية مشاركة الكائن المحملة مع كائنات أخرى ، وأحيانًا يكون من المهم أن تحدث التهيئة بطريقة معينة ، وأحيانًا لا تكون أي من هذه الأشياء مهمة. لتحديد كيفية إعادة إنشاء الكائن الثابت ، يقوم ترجمة بترجمة استدعاء الوظيفة العامة لتحميل ؛ يجب وصف هذا السلوك في أي مرجع أو تعليمي CL. (يجب أن يلاحظ مرجع أو تعليمي أيضًا أن التنفيذ لا يمكن أن يحدد أساليب الشكل الافتراضية التي قد تنطبق على جميع مثيلات الفئة أو الفئة القياسية ، وينبغي أيضًا أن يلاحظ ذلك توفير الحمل -slots هي وظيفة مناسبة لاستخدامها في طرق تكوين الحمل للكائنات التي لا تحتاج تهيئتها إلى التعقيد ، على سبيل المثال:

(defmethod make-load-form ((p point) &optional env)
  (declare (ignore env))
  (make-load-form-saving-slots p))

لاحظ أنه يجب تحديد هذه الطريقة في وقت الترجمة ، بحيث يمكن لرفع الترجمة الاتصال به لتحديد كيفية حفظ كائن النقطة الثابتة.

لا شيء من هذا هو خاص CCL. ما قد يكون هو السؤال عن الأشياء الثابتة ، والأشياء الحرفية وأي الأشياء ليست كذلك.

في الكود مثل:

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () a-point)

سمح للمترجم (ولكن ليس مطلوبًا) باستبدال قيمة نقطة A للإشارة إليها في نقطة الإرجاع-نقطة. (إذا قام المترجم بذلك ، فهذا يعني أن هناك كائن نقطة حرفي/ثابت في الكود الذي يتم تجميع لا يقوم برنامج التحويل البرمجي بهذا الاستبدال ، ثم لا يلزم استدعاء شكل التحميل في هذا المثال.)

ما إذا كان التنفيذ يقوم بهذا النوع من الاستبدال أم لا. تترك المواصفات أيضًا غير محدد فيما إذا كان يتم تقييم نموذج القيمة في نموذج مسترش نفس القيمة.

يحاول CCL عمومًا تقييم نموذج القيمة المزعجة في وقت الترجمة ، وهو عدواني إلى حد ما حول استبدال قيم الثوابت المسماة للإشارات إليها ؛ في بعض الحالات ، هذا يعني أنه يجب تحديد طرق شكل التحميل على فئات قيم الثوابت. قد تكون التطبيقات الأخرى أقل استعدادًا للقيام بهذا الاستبدال لبعض أنواع الكائنات. كلا الاستراتيجيتين صحيحة ، ولا يمكن أن تفترض الرمز المحمول الاستراتيجيات التي يتم اتباعها (على الرغم من أن الكود المحمول المزعوم يزعم أنه من المؤكد أن هذه الافتراضات.)

يبدو أن المعاملة المختلفة للأشياء المحددة بواسطة defconstant هي السبب المحتمل في الغالب لهذا النوع من الأشياء (المكالمات غير المتوقعة إلى شكل تحميل لا يزعجها أحد). يمكن للمرء تجنب بعض هذه المشكلات بطريقة يجب أن تكون محمولة من خلال القيام:

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () (load-time-value (symbol-value 'a-point)))

سيكون لهذا تأثير مشابه للسماح ببساطة بتنفيذ يريد القيام بذلك (كما يفعل CCL) للقيام بالبديل الثابت ، ولكن استخدام قيمة وقت التحميل سيضمن تقييم القيمة الثابتة فقط في وقت التحميل (و لن يشارك هذا الشكل.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top