মান ব্লক আর্গুমেন্ট ক্যাশিং

কখনও কখনও আপনার ব্লক-কোড জেনারেটরকে তার অভ্যন্তরীণ ব্লকের কোড একাধিকবার উল্লেখ করতে হবে।

উদাহরণস্বরূপ, যদি আপনার একটি ব্লক থাকে যা একটি তালিকার শেষ উপাদান পায়, তাহলে আপনাকে একাধিকবার তালিকা কোড অ্যাক্সেস করতে হবে:

// Incorrect block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);

  // listCode gets referenced twice.
  const code = `${listCode}[${listCode}.length - 1]`;

  return [code, Order.MEMBER];
}

কিন্তু অভ্যন্তরীণ ব্লকের কোডের ফলাফলের মান যদি অসামঞ্জস্যপূর্ণ হয়, বা এর পার্শ্বপ্রতিক্রিয়া থাকে তাহলে এটি সমস্যার সৃষ্টি করতে পারে। উদাহরণস্বরূপ, যদি অভ্যন্তরীণ কোডটি আসলে একটি ফাংশন কল হয়, তবে এই নির্দিষ্ট কোডটি পরিসীমার বাইরের অবস্থার সাথে শেষ হতে পারে:

randomList()[randomList().length - 1]

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

ইউটিলিটি ফাংশন

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

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

// Correct block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.NONE);
  const functionName = generator.provideFunction_(
      'list_lastElement',
      [
        `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(list) {`,
        `  return list[list.length - 1];`,
        `}`
      ]
  );

  // listCode only gets evaluated once.
  const code = `${functionName}(${listCode})`;
  return [code, Order.FUNCTION_CALL];
}

ফাংশন প্রদান

আপনি provideFunction_ ব্যবহার করে ব্লক-কোড জেনারেটরের ভিতরে ইউটিলিটি ফাংশন সংজ্ঞায়িত করতে পারেন। এটি আপনার ইউটিলিটি ফাংশনের জন্য আপনি যে নামটি চান তা লাগে এবং ফাংশনটি কী করে তা নির্ধারণ করে কোড স্ট্রিংগুলির একটি অ্যারে। এটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির সাথে বিরোধ না করার জন্য (সম্ভবত) পরিবর্তন করার পরে আপনার ইউটিলিটি ফাংশনের ফলের নাম প্রদান করে।

provideFunction_ এছাড়াও ইউটিলিটি ফাংশন সংজ্ঞা ডিডুপ করে, যাতে প্রতিটি ইউটিলিটি ফাংশন শুধুমাত্র একবারই বিদ্যমান থাকে, এমনকি যদি ব্লকের ধরনটি সংজ্ঞায়িত করে তা একাধিকবার বিদ্যমান থাকে।

অগ্রাধিকার আপডেট করুন

আপনি যখন একটি ইউটিলিটি ফাংশন সংজ্ঞায়িত করেন, তখন আপনাকে ব্লক-কোড জেনারেটরে অন্তর্ভুক্ত অগ্রাধিকারগুলি (যা কীভাবে বন্ধনী ঢোকানো হয় তা সংজ্ঞায়িত করে) আপডেট করা উচিত।

অগ্রাধিকার সর্বদা ব্লক-কোড জেনারেটর দ্বারা প্রত্যাবর্তিত কোড স্ট্রিং এর উপর ভিত্তি করে। এটি ইউটিলিটি ফাংশনের ভিতরে অপারেটরদের সম্পর্কে চিন্তা করে না। তাই আগের উদাহরণে valueToCode কলটি Order.NONE এ পরিবর্তিত হয়েছে এবং রিটার্ন টিপলটি Order.FUNCTION_CALL এ পরিবর্তিত হয়েছে।