Blok menyiratkan tanda kurung. Misalnya, saat melihat blok berikut, Anda
menganggapnya berarti -(5 + 2)
, bukan -5 + 2
, karena 5
dan 2
adalah bagian dari
satu blok, dan -
adalah bagian dari blok lain.
Namun, jika Anda menempatkan tanda kurung di setiap blok, kode akan menjadi jauh lebih
sulit dibaca. Bandingkan (((5) * (2)) + (3))
dengan 5 * 2 + 3
. Kedua ekspresi
ini dievaluasi menjadi hal yang sama (13
), tetapi yang kedua jauh lebih mudah
dibaca.
Aturan prioritas operator Blockly membantu Anda membuat kode dengan jumlah tanda kurung minimum, untuk keterbacaan maksimum.
Menghasilkan output "benar"
Jika Anda tidak perlu kode yang dihasilkan dapat dibaca manusia, Anda tidak perlu khawatir tentang meminimalkan tanda kurung. Menggabungkan setiap blok adalah pendekatan yang baik, dan 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 disisipkan jika kode yang dihasilkan salah tanpa tanda kurung. Hal ini terjadi jika prioritas operator di blok luar lebih kuat daripada prioritas operator di blok dalam.
Misalnya, dalam blok berikut terdapat operator negasi uner dan operator penambahan. Negasi uner memiliki prioritas yang lebih kuat daripada operator penambahan.
Jadi, jika Anda tidak menambahkan tanda kurung, Anda akan mendapatkan -5 + 2
, dan -
dievaluasi
sebelum +
, yang tidak cocok dengan blok.
Anda dapat memberi tahu generator kapan harus menyisipkan tanda kurung dengan memberi tahu seberapa kuat operator yang berbeda. Jika melihat bahwa operator luar lebih kuat daripada operator dalam, operator akan menyisipkan tanda kurung untuk melindungi operator dalam.
valueToCode
menggunakan prioritas operator luar, dan tuple
yang ditampilkan menentukan prioritas operator dalam.
Berikut adalah contoh untuk 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 meneruskan
prioritas operator terkuat yang bertindak pada kode blok
dalam. Ini adalah operator yang harus dilindungi kode blok dalamnya.
Misalnya, dalam blok berikut, operator negasi uner dan
operator penambahan bertindak pada kode blok dalam. Negasi unary
lebih kuat, sehingga itu 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 menampilkan prioritas dari generator kode blok, tampilkan prioritas operator terlemah dalam kode blok. Ini adalah operator yang perlu dilindungi.
Misalnya, blok berikut berisi operator negasi unary dan operator penambahan. Penambahannya lebih lemah, jadi itulah prioritas yang harus Anda kembalikan dari generator kode blok.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Enum urutan
Setiap modul generator bahasa menentukan enum Order
yang menyertakan semua
prioritas untuk bahasa tersebut.
Prioritas yang lebih kuat memiliki nilai dukungan yang lebih rendah, dan prioritas yang lebih lemah memiliki nilai dukungan yang lebih tinggi. Anda dapat menganggap prioritas yang kuat sebagai "peringkat lebih tinggi" dalam kekuatan, dan prioritas yang lebih lemah sebagai "peringkat lebih rendah" - seolah-olah mereka adalah petarung kompetitif.
Di sini Anda dapat menemukan enum Order
untuk semua bahasa bawaan:
Prioritas khusus
Sebagian besar prioritas dalam enum Order
generator cocok dengan prioritas
yang ditentukan oleh bahasa berbasis teks masing-masing. Namun, ada dua prioritas
khusus, Order.ATOMIC
dan Order.NONE
.
Order.ATOMIC
adalah prioritas terkuat. Ini digunakan saat:
- Anda ingin memastikan kode selalu diapit tanda kurung,
sehingga Anda meneruskannya ke
valueToCode
. - Blok Anda tidak menyertakan operator apa pun, sehingga Anda menampilkannya dari generator kode blok.
Order.NONE
adalah prioritas terlemah. Ini digunakan saat:
- Anda ingin memastikan kode selalu diapit tanda kurung, sehingga Anda menampilkannya dari generator kode blok.
- Tidak ada operator yang bertindak pada blok dalam, sehingga Anda meneruskannya ke
valueToCode
.