বন্ধনী সন্নিবেশ

ব্লকগুলি বন্ধনীকে বোঝায়। উদাহরণস্বরূপ, আপনি যখন নিম্নলিখিত ব্লকগুলি দেখেন, আপনি ধরে নেন এর অর্থ -(5 + 2) নয় -5 + 2 কারণ 5 এবং 2 একটি ব্লকের অংশ এবং - অন্য ব্লকের অংশ।

ব্লক প্রতিনিধিত্ব করছে -(5 + 2)

কিন্তু আপনি যদি প্রতিটি ব্লকের চারপাশে বন্ধনী রাখেন, এটি কোডটিকে অনেক কম পঠনযোগ্য করে তোলে। (((5) * (2)) + (3)) 5 * 2 + 3 এর সাথে তুলনা করুন। এই উভয় অভিব্যক্তি একই জিনিসের মূল্যায়ন করে ( 13 ) কিন্তু দ্বিতীয়টি পড়া অনেক সহজ।

ব্লকলির অপারেটর অগ্রাধিকার নিয়ম আপনাকে সর্বাধিক পাঠযোগ্যতার জন্য ন্যূনতম সংখ্যক বন্ধনী সহ কোড তৈরি করতে সহায়তা করে।

"সঠিক" আউটপুট তৈরি করুন

মানব-পাঠযোগ্য হওয়ার জন্য আপনার জেনারেট করা কোডের প্রয়োজন না হলে, বন্ধনী ছোট করার বিষয়ে চিন্তা করার দরকার নেই। প্রতিটি ব্লক মোড়ানো একটি সূক্ষ্ম পদ্ধতি, এবং এটি নিশ্চিত করে যে আপনার তৈরি করা কোড সর্বদা সঠিকভাবে মূল্যায়ন করা হয়।

সঠিকতা নিশ্চিত করতে, সর্বদা Order.ATOMIC থেকে valueToCode কলে পাস করুন এবং সর্বদা আপনার ব্লক-কোড জেনারেটর থেকে Order.NONE ফেরত দিন।

সর্বোত্তম বন্ধনী তৈরি করুন

বন্ধনী শুধুমাত্র সন্নিবেশ করা প্রয়োজন যদি উত্পন্ন কোড তাদের ছাড়া ভুল হয়। এটি ঘটে যখন বাইরের ব্লকে একটি অপারেটরের অগ্রাধিকার ভিতরের ব্লকের একটি অপারেটরের অগ্রাধিকারের চেয়ে শক্তিশালী হয়।

উদাহরণস্বরূপ, নিম্নলিখিত ব্লকগুলিতে একটি ইউনারি নেগেশন অপারেটর এবং একটি সংযোজন অপারেটর রয়েছে। সংযোজন অপারেটরের তুলনায় unary negation এর একটি শক্তিশালী অগ্রাধিকার রয়েছে।

negate-এবং-সংযোজন

সুতরাং আপনি যদি বন্ধনী যোগ না করেন তবে আপনি -5 + 2 পাবেন এবং - + এর আগে মূল্যায়ন করা হবে, যা ব্লকের সাথে মেলে না।

আপনার বিভিন্ন অপারেটর কতটা শক্তিশালী তা বলে আপনি জেনারেটরকে কখন বন্ধনী সন্নিবেশ করতে হবে তা বলতে পারেন। যদি এটি দেখে যে বাইরের অপারেটরটি ভিতরের অপারেটরের চেয়ে শক্তিশালী, এটি ভিতরের অপারেটরকে রক্ষা করার জন্য বন্ধনী সন্নিবেশ করায়।

valueToCode বাইরের অপারেটরের অগ্রাধিকার নেয় এবং রিটার্ন টিপল ভিতরের অপারেটরের অগ্রাধিকার নির্দিষ্ট করে।

এখানে দুটি অপারেটর অন্তর্ভুক্ত একটি ব্লকের জন্য একটি উদাহরণ রয়েছে:

একটি unary negation অপারেটর সহ একটি ব্লক, এবং একটি সংযোজন অপারেটর, এবং একটি চাইল্ড ব্লক।

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 কল করেন, তখন আপনি এটিকে সবচেয়ে শক্তিশালী অপারেটরের অভ্যন্তরীণ ব্লকের কোডে কাজ করার অগ্রাধিকার দিয়ে যান। এটি অপারেটর যা থেকে অভ্যন্তরীণ ব্লকের কোড সুরক্ষিত করা প্রয়োজন।

উদাহরণস্বরূপ, নিম্নলিখিত ব্লকগুলিতে অনারী নেগেশান অপারেটর এবং সংযোজন অপারেটর উভয়ই ভিতরের ব্লকের কোডের উপর কাজ করছে। ইউনারি নেগেশানটি শক্তিশালী, তাই আপনার valueToCode পাস করা উচিত অগ্রাধিকার।

একটি unary negation অপারেটর সহ একটি ব্লক, এবং একটি সংযোজন অপারেটর, এবং একটি চাইল্ড ব্লক।

// 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];

অর্ডার enum

প্রতিটি ভাষা জেনারেটর মডিউল একটি Order enum সংজ্ঞায়িত করে যা সেই ভাষার জন্য সমস্ত অগ্রাধিকার অন্তর্ভুক্ত করে।

শক্তিশালী অগ্রাধিকারের কম ব্যাকিং মান থাকে, এবং দুর্বল অগ্রাধিকারের উচ্চতর ব্যাকিং মান থাকে। আপনি শক্তিশালী অগ্রাধিকারগুলিকে শক্তিতে "উচ্চতর স্থান" হিসাবে এবং দুর্বল অগ্রাধিকারগুলিকে "নিম্ন স্থান দেওয়া" হিসাবে ভাবতে পারেন - যেন তারা প্রতিযোগিতামূলক যোদ্ধা।

এখানে আপনি সমস্ত অন্তর্নির্মিত ভাষার জন্য Order enums খুঁজে পেতে পারেন:

বিশেষ অগ্রাধিকার

জেনারেটরের Order এনামগুলির বেশিরভাগ অগ্রাধিকার তাদের নিজ নিজ পাঠ্য-ভিত্তিক ভাষার দ্বারা সংজ্ঞায়িত অগ্রাধিকারের সাথে মেলে। কিন্তু দুটি বিশেষ অগ্রাধিকার আছে, Order.ATOMIC এবং Order.NONE

Order.ATOMIC হল সবচেয়ে শক্তিশালী অগ্রাধিকার। এটি ব্যবহার করা হয় যখন:

Order.NONE হল সবচেয়ে দুর্বল অগ্রাধিকার। এটি ব্যবহার করা হয় যখন: