سؤال

مشكلة:

أنا أبحث عن مقدمة جيدة حول اكتب أنظمة، والتي تستند إلى العقود / القيود
(آسف، لا أتذكر المصطلح الذي مناسب لنظام النظام).

أحتاج إلى أن تكون المعلومات قادرة على تنفيذ نظام نوع تجريبي من هذا النوع.

بقدر ما أعرف، يتم استخدام هذا النظام من النوع XSD. (تعريف مخطط XML).

بدلا من تحديد نوع البيانات، يحدد المرء القيود على مجموعة القيم المحتملة.

مثال:

أعرف بعض الطريقة مع معلمة، أي إما "nothing", أو يطابق النطاق الكهربائي [0..100].

هذه الطريقة ستقبل القيم التالية:

"nothing"
0
1
...
100

آمل، يمكنني أن أجعل نفسي واضحة.

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

المحلول

يقدم LISP المشترك اختبار هذا النوع في مدة العرض. وبعد يحتوي على نظام من النوع الموضعي، لكنه غير مستخدم لأنه قد تكون معتادا على لغة مكتوبة ثابتة. ماكرو check-type يقبل أ typespec., ، والتي يمكن أن تكون مواصفات مدمجة أو واحدة محددة من قبل الماكرو deftype. وبعد القيود المعبرية مع Typespecs هي تلك الخاصة بدالة المسند المكتوبة في اللغة المضيفة، والتي ستقول أن أي شيء يمكنك فحص وقت التشغيل يمكن أن يكون معايير ما يشكل نوعك الجديد.

النظر في هذا المثال:

(defun is-nothing (val)
  (when (stringp val)
    (string= val "nothing")))

(deftype strange-range ()
  "A number between 0 and 100 inclusive, or the string \"nothing\"."
  '(or (integer 0 100)
       (satisfies is-nothing)))

هذا يحدد نوع يسمى "المدى الغريب". الآن اختبار بعض القيم ضدها:

CL-USER> (let ((n 0))
           (check-type n strange-range))
NIL
CL-USER> (let ((n 100))
           (check-type n strange-range))
NIL
CL-USER> (let ((n "nothing"))
           (check-type n strange-range))
NIL
CL-USER> (let ((n 101))
           (check-type n strange-range))

آخر واحد يؤدي إلى تشغيل المصحح بالرسالة التالية:

The value of N should be of type STRANGE-RANGE.
The value is: 101
   [Condition of type SIMPLE-TYPE-ERROR]

هذا واحد يثير نفس النتيجة:

CL-USER> (let ((n "something"))
           (check-type n strange-range))

القيود التي يمكن للمرء أن تفرض هذه الطريقة عبارة عن تعبيرية، لكنها لا تخدم نفس الغرض من أن أنظمة النوع الموضحة لغات مثل Haskell أو Scala. في حين أن تعريفات النوع يمكنها اقتناع مترجم LISP المشترك ل EMIT Code مزيد من التصميم والكفاءة لأنواع المعاملات، فإن الأمثلة المذكورة أعلاه هي طريقة موجزة لكتابة الشيكات من نوع وقت التشغيل.

نصائح أخرى

يمكنك إلقاء نظرة على اللغات haskell., ، او حتى agda.. وبعد أيضا، أوليغ لديها الكثير من الموارد العظيمة.

هذا ليس منطقتي من خبرتي، لذلك قد يكون خارج الموضوع، لكن مايكروسوفت أبحاث لديها مشروع عقود الكود, ، والتي "توفر طريقة غير ملائمة للغة للتعبير عن افتراضات الترميز في البرامج.

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