ब्लॉक का मतलब ब्रैकेट से है. उदाहरण के लिए, जब आपको नीचे दिए गए ब्लॉक दिखते हैं, तो आप यह मान लेते हैं कि इसका मतलब -(5 + 2)
है, न कि -5 + 2
, क्योंकि 5
और 2
एक ब्लॉक का हिस्सा हैं और -
दूसरे ब्लॉक का.
हालांकि, अगर हर ब्लॉक के चारों ओर ब्रैकेट लगाए जाते हैं, तो कोड को पढ़ना बहुत मुश्किल हो जाता है. (((5) * (2)) + (3))
और 5 * 2 + 3
की तुलना करें. इन दोनों एक्सप्रेशन का नतीजा एक ही (13
) होता है. हालांकि, दूसरे एक्सप्रेशन को पढ़ना ज़्यादा आसान है.
Blockly के ऑपरेटर के क्रम के नियमों की मदद से, कम से कम ब्रैकेट वाले कोड जनरेट किए जा सकते हैं, ताकि कोड को आसानी से पढ़ा जा सके.
"सही" आउटपुट जनरेट करना
अगर आपको जनरेट किए गए कोड को मनुष्य के पढ़ने लायक बनाने की ज़रूरत नहीं है, तो ब्रैकेट को कम करने के बारे में चिंता करने की ज़रूरत नहीं है. हर ब्लॉक को रैप करना एक अच्छा तरीका है. इससे यह पक्का होता है कि आपके जनरेट किए गए कोड का हमेशा सही तरीके से आकलन किया जाए.
सही होने की पुष्टि करने के लिए, valueToCode
कॉल में हमेशा Order.ATOMIC
पास करें और अपने ब्लॉक-कोड जनरेटर से हमेशा 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
को कॉल करने पर, उसे इनर ब्लॉक के कोड पर काम करने वाले सबसे ज़्यादा अहम ऑपरेटर की प्राथमिकता दी जाती है. यह वह ऑपरेटर है जिससे इनर ब्लॉक के कोड को सुरक्षित रखना है.
उदाहरण के लिए, नीचे दिए गए ब्लॉक में, यूनीऐरी नेगेटिव ऑपरेटर और ऐडिशन ऑपरेटर, दोनों इनर ब्लॉक के कोड पर काम कर रहे हैं. एक आर्ग्युमेंट वाला नेगेटिव ऑपरेटर, ज़्यादा असरदार होता है. इसलिए, आपको 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];
ऑर्डर enum
हर भाषा जनरेटर मॉड्यूल, एक Order
एनम तय करता है. इसमें उस भाषा के लिए सभी प्राथमिकताएं शामिल होती हैं.
ज़्यादा प्राथमिकता वाले एट्रिब्यूट की बैकिंग वैल्यू कम होती है और कम प्राथमिकता वाले एट्रिब्यूट की बैकिंग वैल्यू ज़्यादा होती है. ज़्यादा प्राथमिकता वाले आइटम को "रैंकिंग में सबसे ऊपर" और कम प्राथमिकता वाले आइटम को "रैंकिंग में सबसे नीचे" माना जा सकता है.
यहां आपको पहले से मौजूद सभी भाषाओं के लिए Order
enums मिल सकते हैं:
खास प्राथमिकताएं
जनरेटर के Order
एनम में मौजूद ज़्यादातर प्राथमिकताएं, टेक्स्ट पर आधारित भाषाओं के हिसाब से तय की गई प्राथमिकताओं से मेल खाती हैं. हालांकि, दो खास प्राथमिकताएं हैं, Order.ATOMIC
और Order.NONE
.
Order.ATOMIC
सबसे ज़्यादा प्राथमिकता है. इसका इस्तेमाल तब किया जाता है, जब:
- आपको यह पक्का करना है कि कोड हमेशा ब्रैकेट में हो, इसलिए आपने इसे
valueToCode
को पास किया है. - आपके ब्लॉक में कोई ऑपरेटर शामिल नहीं है, इसलिए इसे अपने ब्लॉक-कोड जनरेटर से रिटर्न किया जाता है.
Order.NONE
सबसे कम प्राथमिकता है. इसका इस्तेमाल तब किया जाता है, जब:
- आपको पक्का करना है कि कोड हमेशा ब्रैकेट में हो, इसलिए आपको इसे अपने ब्लॉक-कोड जनरेटर से वापस लौटाना होगा.
- इनर ब्लॉक पर कोई ऑपरेटर काम नहीं कर रहा है, इसलिए इसे
valueToCode
को पास किया जाता है.