Bu sayfada, Bazel'de kullanılan dil olan Starlark'a (eski adıyla Skylark) genel bir bakış sunulmaktadır. İşlevlerin ve türlerinin tam listesi için Bazel API referansına bakın.
Dil hakkında daha fazla bilgi için Starlark'ın GitHub deposuna göz atın.
Starlark söz dizimi ve davranışının yetkili spesifikasyonu için Starlark Dil Spesifikasyonu'na bakın.
Söz dizimi
Starlark'ın söz dizimi Python3'ten esinlenmiştir. Starlark'ta şu söz dizimi geçerlidir:
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)
Starlark'ın semantikleri Python'dan farklı olabilir ancak Starlark'ın hata oluşturduğu durumlar hariç davranış farklılıkları nadirdir. Aşağıdaki Python türleri desteklenir:
Değişkenlik
Starlark, değişmezliği tercih eder. İki farklı veri yapısı mevcuttur: listeler ve dikteler. Değiştirilebilir veri yapılarında yapılan değişiklikler (ör. bir listeye değer ekleme veya bir sözlükteki girişi silme) yalnızca geçerli bağlamda oluşturulan nesneler için geçerlidir. Bir bağlam tamamlandıktan sonra değerleri değiştirilemez hale gelir.
Bunun nedeni, Bazel derlemelerinin paralel yürütme kullanmasıdır. Derleme sırasında her .bzl
dosyası ve her BUILD
dosyası kendi yürütme bağlamını alır. Her kural kendi bağlamında
analiz edilir.
foo.bzl
dosyasını içeren bir örnek üzerinden gidelim:
# `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, foo.bzl
yüklendiğinde var
oluşturur. Dolayısıyla var
, foo.bzl
bağlamının bir parçasıdır. fct()
, foo.bzl
bağlamında çalışır. foo.bzl
için değerlendirme tamamlandıktan sonra ortamda [5]
değerine sahip var
adlı değiştirilemez bir giriş bulunur.
Başka bir bar.bzl
, foo.bzl
'dan simge yüklediğinde, yüklenen değerler değiştirilemez durumda kalır. Bu nedenle, bar.bzl
'teki aşağıdaki kod yasa dışıdır:
# `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
bzl
dosyalarında tanımlanan genel değişkenler, bunları tanımlayan bzl
dosyasının dışında değiştirilemez. bzl
dosyalarını kullanan yukarıdaki örnekte olduğu gibi, kurallar tarafından döndürülen değerler değiştirilemez.
BUILD ve .bzl dosyaları arasındaki farklar
BUILD
dosya, kurallara çağrı yaparak hedefleri kaydediyor. .bzl
dosyaları sabit değerler, kurallar, makrolar ve işlevler için tanımlar sağlar.
Yerel işlevler ve yerel kurallar, BUILD
dosyalarındaki genel simgelerdir. bzl
dosyalarının bunları native
modülü kullanarak yüklemesi gerekir.
BUILD
dosyalarında iki söz dizimi kısıtlaması vardır: 1) İşlevleri tanımlamak yasa dışıdır ve 2) *args
ve **kwargs
bağımsız değişkenlerine izin verilmez.
Python ile farklılıklar
Global değişkenler sabittir.
Üst düzeyde
for
ifadelerine izin verilmez. Bunun yerine işlevler içinde kullanın.BUILD
dosyalarında liste kapsamları kullanabilirsiniz.Üst düzeyde
if
ifadelerine izin verilmez. Ancakif
ifadeleri kullanılabilir:first = data[0] if len(data) > 0 else None
.Sözlüklerde iterasyon için belirlenmiş sıra.
Yinelemeye izin verilmez.
Tam sayı türü, 32 bit imzalı tam sayılarla sınırlıdır. Aşırı dolumlar hata verir.
Yineleme sırasında bir koleksiyonu değiştirme işlemi hatadır.
Eşitlik testleri hariç,
<
,<=
,>=
,>
vb. karşılaştırma operatörleri değer türleri genelinde tanımlanmamıştır. Özet olarak:5 < 'foo'
bir hata atar ve5 == "5"
yanlış değerini döndürür.Tuples'ta, sondaki virgül yalnızca parantezler arasında olduğunda (
1,
yerine(1,)
yazdığınızda) geçerlidir.Sözlük değişmez değerlerinin yinelenen anahtarları olamaz. Örneğin, şu hata:
{"a": 4, "b": 7, "a": 1}
.Dizeler çift tırnak içinde gösterilir (ör. repr işlevini çağırdığınızda).
Dizeler yinelenemez.
Aşağıdaki Python özellikleri desteklenmez:
- örtülü dize birleştirme (açık
+
operatörü kullanın). - Zincirlenmiş karşılaştırmalar (
1 < x < 5
gibi). class
(struct
işlevine bakın).import
(load
beyanını inceleyin).while
,yield
.- türleri belirleyin.
- oluşturucular ve oluşturucu ifadeleri.
is
(Bunun yerine==
kullanın).try
,raise
,except
,finally
(kritik hatalar içinfail
bölümüne bakın).global
,nonlocal
.- çoğu yerleşik işlev, çoğu yöntem.