إضافة قوسَين

تشير الكتل إلى الأقواس. على سبيل المثال، عند رؤية الكتل التالية، تفترض أنّها تعني -(5 + 2) وليس -5 + 2 لأنّ 5 و2 جزءان من كتلة واحدة، و- جزء من كتلة أخرى.

وحدات تمثل -(5 + 2)

ولكن إذا وضعت الأقواس حول كل مجموعة، سيجعل ذلك الرمز البرمجي أقل سهولة في القراءة. قارِن بين (((5) * (2)) + (3)) و5 * 2 + 3. يُحسِّن كلا هذين التعبيرَين القيمة نفسها (13)، ولكن التعبير الثاني أسهل بكثير في قراءة البيانات.

تساعدك قواعد أولوية عوامل التشغيل في Blockly على إنشاء رمز برمجي باستخدام الحد الأدنى لعدد الأقواس، لتحقيق أقصى قدر من السهولة في القراءة.

إنشاء ناتج "صحيح"

إذا لم تكن بحاجة إلى أن يكون الرمز الذي تم إنشاؤه سهل القراءة، ليس عليك القلق بشأن تقليل الأقواس. إنّ لفّ كلّ عنصر هو منهج جيد، ويضمن تقييم الرمز الذي تم إنشاؤه بشكل صحيح في كلّ الأوقات.

لضمان صحة الإجراء، يجب دائمًا تمرير Order.ATOMIC إلى طلبات valueToCode، وإرجاع Order.NONE دائمًا من أداة إنشاء الرموز البرمجية للوحدات.

إنشاء الأقواس المثلى

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

على سبيل المثال، في الكتل التالية، يتوفّر عامل تشغيل سلب أحادي وعامل تشغيل جمع. يكون لعامل النفي الأحادي الأولوية أكثر من عامل الإضافة.

النفي والإضافة

لذلك، إذا لم تُضِف قوسَين، ستحصل على -5 + 2، ويتم تقييم - قبل +، ما لا يتطابق مع الكتل.

يمكنك إخبار أداة الإنشاء بوقت إدراج الأقواس من خلال تحديد مدى فعالية المشغِّلات المختلفة. إذا تبيّن له أنّ المُشغِّل الخارجي أقوى من المُشغِّل الداخلي، يُدخِل قوسَين لحماية المُشغِّل الداخلي.

يأخذ valueToCode الأولوية لعامل التشغيل الخارجي، وتحدِّد مجموعة القيمة المعروضة التي يتم إرجاعها الأولوية لعامل التشغيل الداخلي.

في ما يلي مثال على وحدة تتضمّن عاملَين تشغيل:

وحدة تتضمّن عامل نفي أحادي وعامل جمع ووحدة
طفل

import {javascriptGenerator, Order} from 'blockly/javascript';

javascriptGenerator.forBlock['negate_plus_two'] = function(block, generator) {
  // valueToCode takes in the precedence of the outer operator.
  const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
  const code = `-${innerCode} + 2`;
  // The return tuple specifies the precedence of the inner operator.
  return [code, Order.ADDITION];
}

الأولوية في التحويل من القيمة إلى الرمز

عند استدعاء valueToCode لإنشاء رمز لمجموعة رموز داخلية، يتم تمريرها بأولوية المشغِّل الأقوى الذي يعمل على رمز المجموعة الداخلية. هذا هو عامل التشغيل الذي يجب حماية رمز الكتلة الداخلية من تأثيره.

على سبيل المثال، في الكتل التالية، يعمل كلّ من عامل النفي الأحادي وعامل الجمع على رمز الكتلة الداخلية. إنّ النفي الثنائي هو أقوى، لذا عليك ضبط الأولوية التي يجب تمريرها إلى valueToCode.

وحدة تتضمّن عامل نفي أحادي وعامل جمع ووحدة
طفل

// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;

الأولوية في عرض النتائج

عند عرض الأولوية من أداة إنشاء رموز الكتل، يجب عرض أولوية أضعف عامل تشغيل ضمن رمز الكتلة. هذا هو المشغِّل الذي يجب حمايته.

على سبيل المثال، يحتوي الرمز البرمجي التالي على عامل سلب أحادي وعامل جمع. إنّ الإضافة أضعف، لذا هذه هي الأولوية التي يجب إعادتها من أداة إنشاء الرموز البرمجية.

وحدة تتضمّن عامل نفي أحادي وعامل إضافة، ولا تتضمّن وحدة
طفل

const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];

تعداد الطلبات

تحدِّد كل وحدة من وحدات إنشاء اللغات قائمة Order تتضمّن كل الترتيبات للغة المحدّدة.

تمتلك الأسبقيات الأقوى قيمًا أقلّ للدعم، بينما تمتلك الأسبقيات الأضعف قيمًا أعلى للدعم. يمكنك اعتبار أنّ الأولويات القوية "مرتّبة أعلى" من حيث القوة، وأنّ الأولويات الأضعف "مرتّبة أدنى"، كما لو كانت مصارعين تنافسيين.

في ما يلي مكان العثور على قوائم Order للغات المضمّنة:

الأولويات الخاصة

تتطابق معظم الأولويات في قوائم Order المدرَجة في أداة إنشاء النماذج مع الأولويات التي تحدّدها اللغات المستندة إلى النصوص الخاصة بها. ولكن هناك نوعان خاصان من Order.ATOMIC وOrder.NONE.

Order.ATOMIC هي الأولوية الأعلى. ويُستخدَم في الحالات التالية:

Order.NONE هي أدنى قيمة للأولوية. ويُستخدَم في الحالات التالية: