Blok menunjukkan tanda kurung. Misalnya, saat Anda 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 tersebut akan jauh lebih sulit
dibaca. Bandingkan (((5) * (2)) + (3))
dengan 5 * 2 + 3
. Kedua ekspresi
ini dievaluasi ke hal yang sama (13
), tetapi yang kedua jauh lebih
mudah dibaca.
Aturan prioritas operator Blockly membantu Anda membuat kode dengan jumlah minimum tanda kurung, agar lebih mudah dibaca.
Menghasilkan output yang "benar"
Jika tidak ingin kode yang dihasilkan dapat dibaca manusia, Anda tidak perlu khawatir tentang memperkecil tanda kurung. Menggabungkan setiap blok adalah pendekatan yang baik, dan akan memastikan kode yang dihasilkan selalu dievaluasi dengan benar.
Untuk memastikan ketepatan, 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 jika tanpanya. Hal ini terjadi jika prioritas operator di blok luar lebih kuat daripada prioritas operator di blok dalam.
Misalnya, dalam blok berikut ada operator negasi unary dan operator penambahan. negasi unary memiliki prioritas yang lebih kuat daripada operator penambahan.
Jadi, jika 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 menyisipkan tanda kurung dengan memberitahukan seberapa kuat operator yang berbeda. Jika terlihat bahwa operator luar lebih kuat dari operator dalam, operator dalam akan menyisipkan tanda kurung untuk melindungi operator dalam.
valueToCode
lebih diutamakan daripada operator luar, dan tuple yang ditampilkan menentukan prioritas operator dalam.
Berikut adalah contoh untuk blok yang mencakup 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 menghasilkan kode blok dalam, Anda akan meneruskan
operator terkuat yang bertindak pada kode
blok dalam. Ini adalah operator yang harus dilindungi oleh kode blok dalam.
Misalnya, dalam blok berikut, operator negasi unary dan operator penambahan bertindak pada kode blok dalam. Negasi unary
lebih kuat, sehingga merupakan 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 sebelumnya
Jika Anda menampilkan prioritas dari generator kode blok, tampilkan operator paling lemah dalam kode blok tersebut. Ini adalah operator yang perlu dilindungi.
Misalnya, blok berikut berisi operator negasi unary dan operator penambahan. Penambahannya lebih lemah sehingga prioritasnya harus Anda kembalikan 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 menyertakan semua prioritas 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 "diberi peringkat lebih tinggi" dalam kekuatan, dan prioritas yang lebih lemah sebagai "diberi peringkat lebih rendah" - seolah-olah mereka adalah petarung yang kompetitif.
Di sini Anda dapat menemukan enum Order
untuk semua bahasa bawaan:
Prioritas khusus
Sebagian besar prioritas di enum Order
generator cocok dengan prioritas yang ditentukan oleh bahasa berbasis teksnya 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 diberi tanda kurung, jadi Anda meneruskannya ke
valueToCode
. - Blok Anda tidak menyertakan operator apa pun, sehingga Anda mengembalikannya dari generator kode blok.
Order.NONE
adalah prioritas paling lemah. Ini digunakan saat:
- Anda ingin memastikan kode selalu diberi tanda kurung, sehingga Anda menampilkannya dari generator kode blok Anda.
- Tidak ada operator yang bertindak pada blok dalam, jadi Anda meneruskannya ke
valueToCode
.