سؤال

هذه متابعة ل سؤالي السابق على طبقة ثابتة clojure.

لقد تصفحت رمز مصدر Java للمترجم وهناك عدة أماكن حيث تتحقق من قيمة *warn-on-reflection*, ، ولكن عندما أقوم بتجميع الكود التالي ، أحصل فقط على خطأ في وقت التشغيل:

(defn div-2 [^String s] (/ 2 s))

هل هناك أي ظروف يجب أن هذا الرمز ليس إعطاء تحذير وقت التجميع (لا)؟ ما مدى صعوبة إعطاء التحذير على المترجم تحذيرًا على الكود التالي:

(defn get-length [^String s] (.length s))
(defn test-get-length [] (get-length 2.0))

شكرًا.

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

المحلول

المشكلة هي أن المترجم لا يتتبع نوع defد. نعم ، في مثالك البسيط ، سيكون من الممكن. ولكن كم مرة تمر الحرفي؟ نادرا ، في برنامج حقيقي.

إن جعل الأنواع "تتدفق من خلال" كما تفعل بلغة حقيقية مكتوبة بشكل ثابت يتطلب قدرًا واسعًا من إعادة العمل. يجب عليك تتبع المعلومات من خلال VARS ، وارتدادات الارتداد ديناميكيًا ، وإلغاءات ، وما إلى ذلك ، ثم أنت ما يزال اطلب من مسألة سحب العناصر من المجموعات/التسلسلات ، مما يعني أنواع عامة ، وهي أ تسربت علبة الديدان ...

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

قد يكون الأدوات المترجم بمعلومات الكتابة الثابتة الكاملة أمرًا ممكنًا ، ولكن في هذه المرحلة ، قمت بإعادة كتابة اللغة إلى حد كبير ، وكان عليك اتخاذ العديد من القرارات والمقايضات في كيفية معالجة الأنواع. حقا لن يكون clojure بعد الآن.

نصائح أخرى

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

إذا كنت على استعداد لتحدي أكبر قليلاً ، فيمكنك حتى إجراء استنتاج من النوع وبالتالي خفض عبء التدوين.

متابعة هذا الموضوع ، يوجد الآن مشروع يهدف إلى إحضار الكتابة التدريجية إلى clojure (مثل Dart ، وما إلى ذلك). يستحق اختباره:مكتوبة

إذا كان بإمكان شخص ما تقديم بعض الملاحظات بعد الاستخدام الحقيقي ...

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