Köşeli parantez ekleme

Bloklar parantez anlamına gelir. Örneğin, aşağıdaki blokları gördüğünüzde 5 ve 2 bir bloğun, - ise başka bir bloğun parçası olduğu için bunun -5 + 2 değil -(5 + 2) anlamına geldiğini varsayabilirsiniz.

-(5 + 2) değerini temsil eden bloklar

Ancak her bloğun etrafına parantez koyarsanız kod çok daha okunaklı olmaz. (((5) * (2)) + (3)) ile 5 * 2 + 3 metriklerini karşılaştırın. Bu ifadelerin ikisi de aynı sonucu (13) verir ancak ikincisinin okunması çok daha kolaydır.

Blockly'nin operatör önceliği kuralları, maksimum okunabilirlik için minimum sayıda parantez içeren kod oluşturmanıza yardımcı olur.

"Doğru" çıkış oluşturma

Oluşturulan kodunuzun insanlar tarafından okunabilir olması gerekmiyorsa parantezleri en aza indirme konusunda endişelenmenize gerek yoktur. Her bloğu sarmalamak iyi bir yaklaşımdır ve oluşturulan kodunuzun her zaman doğru şekilde değerlendirilmesini sağlar.

Doğruluğu sağlamak için valueToCode çağrılarına her zaman Order.ATOMIC gönderin ve blok kodu oluşturucunuzdan her zaman Order.NONE döndürün.

En uygun parantezleri oluşturma

Parantezlerin yalnızca oluşturulan kod parantez olmadan yanlışsa eklenmesi gerekir. Bu durum, dış bloktaki bir operatörün önceliği iç bloktaki bir operatörün önceliğinden daha güçlü olduğunda ortaya çıkar.

Örneğin, aşağıdaki bloklarda bir tek adımlı olumsuzlama operatörü ve bir toplama operatörü vardır. Birli olumsuzlama, toplama operatöründen daha güçlü bir önceliğe sahiptir.

negate-and-addition

Bu nedenle, parantez eklemezseniz -5 + 2 değerini alırsınız ve -, bloklarla eşleşmeyen + değerinden önce değerlendirilir.

Farklı operatörlerinizin ne kadar güçlü olduğunu söyleyerek jeneratöre ne zaman parantez eklemesi gerektiğini bildirebilirsiniz. Dış operatörün iç operatörden daha güçlü olduğunu görürse iç operatörü korumak için parantez ekler.

valueToCode, dış operatörün önceliğini alır ve döndürülen tuple, iç operatörün önceliğini belirtir.

İki operatör içeren bir blok örneği aşağıda verilmiştir:

Bir tek adımlı olumsuzlama operatörü, bir toplama operatörü ve bir alt blok içeren bir blok.

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 önceliği

Bir iç bloğun kodunu oluşturmak için valueToCode işlevini çağırdığınızda, iç bloğun kodu üzerinde çalışan en güçlü operatörün önceliğini iletirsiniz. Bu, iç bloğun kodunun korunması gereken operatördür.

Örneğin, aşağıdaki bloklarda hem tek adımlı olumsuzlama operatörü hem de toplama operatörü, iç bloğun kodu üzerinde işlem yapmaktadır. Birli olumsuzlama daha güçlüdür. Bu nedenle, valueToCode değerine bu önceliği iletmeniz gerekir.

Bir tek adımlı olumsuzlama operatörü, bir toplama operatörü ve bir alt blok içeren bir blok.

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

Dönüş önceliği

Blok kodu oluşturucunuzdan bir öncelik döndürdüğünüzde, blokun kodundaki en zayıf operatörün önceliğini döndürün. Bu, korunması gereken operatördür.

Örneğin, aşağıdaki blok hem tek adımlı bir olumsuzlama operatörü hem de bir toplama operatörü içerir. Ekleme daha zayıftır. Bu nedenle, blok kodu oluşturucudan döndürmeniz gereken öncelik budur.

Bir tek adımlı olumsuzlama operatörü ve bir toplama operatörü içeren ve alt blok içermeyen bir blok

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

Sıralama enumu

Her dil oluşturucu modülü, ilgili dile ait tüm öncelikleri içeren bir Order enum tanımlar.

Daha güçlü öncelikler daha düşük destek değerlerine, daha zayıf öncelikler ise daha yüksek destek değerlerine sahiptir. Güçlü öncelikleri, güç açısından "daha yüksek sırada", zayıf öncelikleri ise "daha düşük sırada" olarak düşünebilirsiniz.

Tüm yerleşik diller için Order enum'larını burada bulabilirsiniz:

Özel öncelikler

Oluşturucuların Order enum'larındaki önceliklerin çoğu, ilgili metin tabanlı diller tarafından tanımlanan önceliklerle eşleşir. Ancak Order.ATOMIC ve Order.NONE olmak üzere iki özel öncelik vardır.

Order.ATOMIC en yüksek önceliktir. Aşağıdaki durumlarda kullanılır:

Order.NONE en düşük önceliğe sahiptir. Aşağıdaki durumlarda kullanılır: