Blok menyiratkan tanda kurung. Misalnya, jika melihat blok berikut, Anda
menganggap itu berarti -(5 + 2)
bukan -5 + 2
karena 5
dan 2
adalah bagian dari
satu blok, dan -
adalah bagian dari blok lain.
Tetapi jika Anda menempatkan tanda kurung di setiap blok, kodenya akan berkurang
dapat dibaca. Bandingkan (((5) * (2)) + (3))
dengan 5 * 2 + 3
. Keduanya
ekspresi dievaluasi ke hal yang sama (13
), tetapi yang kedua jauh lebih mudah
untuk dibaca.
Aturan prioritas operator Blockly membantu Anda membuat kode dengan jumlah tanda kurung, agar mudah dibaca.
Buat "benar" {i>output<i}
Jika Anda tidak menginginkan kode yang dihasilkan dapat dibaca manusia, maka tidak perlu perlu mengkhawatirkan mengurangi tanda kurung. Menggabungkan setiap blok adalah pendekatan yang bagus, serta memastikan bahwa kode yang dihasilkan selalu dievaluasi dengan benar.
Untuk memastikan kebenaran, selalu teruskan Order.ATOMIC
ke panggilan valueToCode
, dan
selalu tampilkan Order.NONE
dari generator kode blok Anda.
Membuat tanda kurung yang optimal
Tanda kurung hanya perlu dimasukkan jika kode yang dihasilkan salah tanpa mereka. Hal ini terjadi ketika prioritas operator di blok {i>outer<i} adalah lebih kuat daripada prioritas operator di blok dalam.
Misalnya, di blok berikut terdapat operator negasi unary dan operator penjumlahan. Negasi unary memiliki prioritas yang lebih kuat daripada operator penjumlahan.
Jadi, jika Anda tidak menambahkan tanda kurung, Anda akan mendapatkan -5 + 2
, dan -
akan dievaluasi
sebelum +
, yang tidak cocok dengan blok.
Anda dapat memberi tahu generator kapan harus memasukkan tanda kurung dengan memberi tahunya seberapa kuat operator yang berbeda. Jika terlihat bahwa operator {i>outer<i} lebih kuat daripada operator dalam, fungsi ini menyisipkan tanda kurung untuk melindungi operator dalam.
valueToCode
lebih diprioritaskan dari operator outer, sedangkan return
tuple menentukan prioritas operator dalam.
Berikut adalah contoh blok yang menyertakan dua operator:
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];
}
Prioritas valueToCode
Saat memanggil valueToCode
untuk membuat kode blok dalam, Anda meneruskannya
prioritas operator terkuat yang bertindak pada kode operator internal
diblokir. Ini adalah operator yang harus dilindungi kode blok bagian dalam.
Misalnya, dalam blok berikut, operator negasi unary dan
operator penjumlahan bertindak
pada kode blok bagian dalam. Negasi unary
lebih kuat, jadi ini adalah prioritas yang harus Anda teruskan ke valueToCode
.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
Prioritas pengembalian
Saat Anda mengembalikan prioritas dari generator kode blok, tampilkan prioritas operator terlemah dalam kode blok. Ini adalah yang membutuhkan perlindungan.
Misalnya, blok berikut berisi operator negasi unary dan operator penjumlahan. Penambahan lebih lemah, jadi itulah prioritas yang harus Anda dikembalikan dari generator kode blok.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Enum pesanan
Setiap modul generator bahasa menentukan enum Order
yang mencakup semua
yang diutamakan untuk bahasa tersebut.
Prioritas yang lebih kuat memiliki nilai pendukung yang lebih rendah, dan prioritas yang lebih lemah memiliki nilai pendukung yang lebih tinggi. Anda dapat menganggap prioritas yang kuat sebagai "peringkat yang lebih tinggi" kekuatan, dan prioritas yang lebih lemah karena "diberi peringkat lebih rendah" - seolah-olah mereka adalah pejuang yang kompetitif.
Di sini Anda dapat menemukan enum Order
untuk semua bahasa bawaan:
Prioritas khusus
Sebagian besar prioritas di generator Order
enum cocok dengan prioritas
yang ditentukan oleh bahasa berbasis teks masing-masing. Namun ada dua hal spesial
prioritas tertinggi, Order.ATOMIC
dan Order.NONE
.
Order.ATOMIC
adalah prioritas terkuat. Hal ini digunakan saat:
- Anda ingin memastikan kode selalu diberi tanda kurung,
jadi Anda meneruskannya ke
valueToCode
. - Pemblokiran Anda tidak menyertakan operator apa pun, jadi Anda mengembalikannya dari pembuat kode blok.
Order.NONE
adalah prioritas terlemah. Hal ini digunakan saat:
- Anda ingin memastikan kode selalu diberi tanda kurung, jadi Anda mengembalikannya dari generator kode blok.
- Tidak ada operator yang bertindak pada blok dalam, jadi Anda meneruskannya ke
valueToCode
.