Halaman ini adalah ringkasan tentang Starlark, sebelumnya dikenal sebagai Skylark, bahasa yang digunakan dalam Bazel. Untuk daftar lengkap fungsi dan jenisnya, lihat referensi Bazel API.
Untuk mengetahui informasi selengkapnya tentang bahasa ini, lihat repo GitHub Starlark.
Untuk spesifikasi otoritatif dari {i>syntax<i} Starlark dan lihat Starlark Language Specification.
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 bisa berbeda dari Python, tetapi ada perbedaan jarang terjadi, kecuali untuk kasus ketika Starlark menimbulkan {i>error<i}. Python berikut jenis yang didukung:
Mutabilitas
Starlark mendukung ketidaktetapan. Tersedia dua struktur data yang dapat berubah: daftar dan dikte. 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 menjadi tidak dapat diubah.
Hal ini karena build Bazel menggunakan eksekusi paralel. Selama proses build, setiap .bzl
dan setiap file BUILD
mendapatkan konteks eksekusinya sendiri. Setiap aturan juga
dianalisa dalam konteksnya sendiri.
Mari kita lihat contoh 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. var
demikian menjadi bagian dari foo.bzl
konteks tambahan. Saat fct()
berjalan, hal ini akan dilakukan dalam konteks foo.bzl
. Setelah
penilaian 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 ada
tidak dapat diubah. Oleh karena itu, 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
File BUILD
mendaftarkan target melalui panggilan ke aturan. File .bzl
memberikan
definisi untuk konstanta, aturan, makro, dan fungsi.
Fungsi native dan aturan native adalah simbol global di
BUILD
. File bzl
harus dimuat menggunakan modul native
.
Ada dua batasan sintaksis dalam file BUILD
: 1) mendeklarasikan fungsi adalah
ilegal, dan 2) argumen *args
dan **kwargs
tidak diperbolehkan.
Perbedaan dengan Python
Variabel global tidak dapat diubah.
Pernyataan
for
tidak diizinkan di tingkat teratas. Menggunakannya dalam fungsi sebagai gantinya. DalamBUILD
file, 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 determenistik untuk iterasi melalui Kamus.
Rekursi tidak diizinkan.
Jenis int dibatasi hingga bilangan bulat 32-bit bertanda. Overflow akan menampilkan error.
Mengubah koleksi selama iterasi merupakan sebuah error.
Kecuali untuk pengujian kesetaraan, operator perbandingan
<
,<=
,>=
,>
, dll. adalah tidak ditentukan di seluruh jenis nilai. Singkatnya:5 < 'foo'
akan menampilkan error dan5 == "5"
akan menampilkan nilai salah.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. Sebagai contoh, ini adalah error:
{"a": 4, "b": 7, "a": 1}
.String direpresentasikan dengan tanda petik ganda (seperti saat Anda memanggil repr).
String tidak dapat iterable.
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
.- jenis {i>float<i} dan {i>set<i}.
- generator dan ekspresi generator.
is
(sebagai gantinya, gunakan==
).try
,raise
,except
,finally
(lihatfail
untuk mengetahui error fatal).global
,nonlocal
.- sebagian besar fungsi bawaan, sebagian besar metode.