Halaman ini adalah ringkasan Starlark, sebelumnya dikenal sebagai Skylark, bahasa yang digunakan di Bazel. Untuk mengetahui daftar lengkap fungsi dan jenis, lihat referensi Bazel API.
Untuk mengetahui informasi selengkapnya tentang bahasa tersebut, lihat repositori GitHub Starlark.
Untuk spesifikasi resmi sintaksis dan perilaku Starlark, lihat Spesifikasi Bahasa Starlark.
Sintaksis
Sintaksis Starlark terinspirasi oleh Python3. Ini adalah sintaksis yang valid di Starlark:
def fizz_buzz(n):
"""Print Fizz Buzz numbers from 1 to n."""
for i in range(1, n + 1):
s = ""
if i % 3 == 0:
s += "Fizz"
if i % 5 == 0:
s += "Buzz"
print(s if s else i)
fizz_buzz(20)
Semantik Starlark dapat berbeda dengan Python, tetapi perbedaan perilakunya jarang terjadi, kecuali untuk kasus saat Starlark memunculkan error. Jenis Python berikut didukung:
Mutabilitas
Starlark tidak dapat diubah. Ada dua struktur data yang dapat berubah: daftar dan dek. Perubahan pada struktur data yang dapat diubah, seperti menambahkan nilai ke daftar atau menghapus entri dalam kamus, hanya valid untuk objek yang dibuat dalam konteks saat ini. Setelah konteks selesai, nilainya tidak dapat diubah.
Hal ini karena build Bazel menggunakan eksekusi paralel. Selama proses build, setiap file .bzl
dan setiap file BUILD
mendapatkan konteks eksekusinya sendiri. Setiap aturan juga dianalisis dalam konteksnya sendiri.
Mari kita lihat contohnya dengan file foo.bzl
:
# `foo.bzl`
var = [] # declare a list
def fct(): # declare a function
var.append(5) # append a value to the list
fct() # execute the fct function
Bazel membuat var
saat foo.bzl
dimuat. Oleh karena itu, var
adalah bagian dari konteks foo.bzl
. Saat dijalankan, fct()
akan melakukannya dalam konteks foo.bzl
. Setelah
evaluasi untuk foo.bzl
selesai, lingkungan akan berisi entri yang tidak dapat diubah,
var
, dengan nilai [5]
.
Saat bar.bzl
lain memuat simbol dari foo.bzl
, nilai yang dimuat akan tetap
tidak dapat diubah. Karena alasan ini, kode berikut di bar.bzl
bersifat ilegal:
# `bar.bzl`
load(":foo.bzl", "var", "fct") # loads `var`, and `fct` from `./foo.bzl`
var.append(6) # runtime error, the list stored in var is frozen
fct() # runtime error, fct() attempts to modify a frozen list
Variabel global yang ditentukan dalam file bzl
tidak dapat diubah di luar file bzl
yang menentukannya. Sama seperti contoh di atas yang menggunakan file bzl
,
nilai yang ditampilkan oleh aturan tidak dapat diubah.
Perbedaan antara file BUILD dan .bzl
BUILD
file mendaftarkan target melalui panggilan ke aturan. File .bzl
memberikan definisi untuk konstanta, aturan, makro, dan fungsi.
Fungsi native dan aturan native adalah simbol global dalam
file BUILD
. File bzl
perlu dimuat menggunakan modul native
.
Ada dua batasan sintaksis dalam file BUILD
: 1) mendeklarasikan fungsi
tidak sah, dan 2) argumen *args
dan **kwargs
tidak diizinkan.
Perbedaan dengan Python
Variabel global tidak dapat diubah.
Pernyataan
for
tidak diizinkan di tingkat teratas. Gunakan fungsi tersebut dalam fungsi. Dalam fileBUILD
, Anda dapat menggunakan pemahaman daftar.Pernyataan
if
tidak diizinkan di tingkat teratas. Namun, ekspresiif
dapat digunakan:first = data[0] if len(data) > 0 else None
.Urutan deterministik untuk iterasi melalui Kamus.
Pengulangan tidak diizinkan.
Jenis int terbatas pada bilangan bulat bertanda 32-bit. Overflow akan menampilkan error.
Memodifikasi koleksi selama iterasi adalah kesalahan.
Kecuali untuk pengujian kesetaraan, operator perbandingan
<
,<=
,>=
,>
, dll. tidak ditentukan di seluruh jenis nilai. Singkatnya:5 < 'foo'
akan melemparkan error dan5 == "5"
akan menampilkan false.Dalam tuple, koma di akhir hanya valid jika tuple berada di antara tanda kurung, saat Anda menulis
(1,)
, bukan1,
.Literal kamus tidak boleh memiliki kunci duplikat. Misalnya, ini adalah error:
{"a": 4, "b": 7, "a": 1}
.String direpresentasikan dengan tanda kutip ganda (seperti saat Anda memanggil repr).
String tidak dapat diubah.
Fitur Python berikut tidak didukung:
- Penyambungan string implisit (gunakan operator
+
eksplisit). - Perbandingan berantai (seperti
1 < x < 5
). class
(lihat fungsistruct
).import
(lihat pernyataanload
).while
,yield
.- float dan menetapkan jenis.
- generator dan ekspresi generator.
is
(gunakan==
saja).try
,raise
,except
,finally
(lihatfail
untuk mengetahui error fatal).global
,nonlocal
.- sebagian besar fungsi bawaan, kebanyakan metode.