Bu sayfada, Bazel'de kullanılan dil olan Starlark'a (eski adıyla Skylark) genel bir bakış sunulmaktadır. İşlevlerin ve türlerin 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. Aşağıdakiler Starlark'ta geçerli söz dizimidir:
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:
Metin ek açıklamaları
Deneysel. Tür ek açıklamaları deneysel bir özelliktir ve herhangi bir zamanda değişebilir. Buna güvenmeyin. --experimental_starlark_types işareti kullanılarak Bazel'de HEAD konumunda etkinleştirilebilir.
Bazel'in HEAD sürümündeki Starlark, PEP 484'ten ilham alan bir söz dizimine sahip tür ek açıklamaları için destek eklemektedir.
- Starlark türü ek açıklamaları aktif olarak geliştirilmektedir. İlerleme durumu issue#22935 üzerinden takip edilebilir.
- Spesifikasyon kademeli olarak genişletilir: starlark-with-types/spec.md
- İlk teklif: SEP-001 Starlark türlerini temellendirme
Değişkenlik
Starlark, değişmezliği tercih eder. İki değişken veri yapısı mevcuttur: listeler ve dizinler. 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 da 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. Bu nedenle 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 dosyaları, kurallara çağrı yaparak hedefleri kaydeder. .bzl dosyaları sabitler, 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ünü 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 arasındaki farklar
Genel değişkenler değiştirilemez.
Üst düzeyde
forifadelerine izin verilmez. Bunun yerine işlevler içinde kullanın.BUILDdosyalarında liste kapsamları kullanabilirsiniz.Üst düzeyde
ififadelerine izin verilmez. Ancakififadeleri kullanılabilir:first = data[0] if len(data) > 0 else None.Sözlüklerde iterasyon için belirlenmiş sıra.
Yinelemeye izin verilmez.
Int türü, 32 bitlik işaretli tam sayılarla sınırlıdır. Aşırı dolumlar hata verir.
Döngü sırasında bir koleksiyonun değiştirilmesi hatalıdır.
Eşitlik testleri hariç olmak üzere
<,<=,>=,>vb. karşılaştırma operatörleri değer türleri arasında tanımlanmaz. Özet olarak:5 < 'foo'bir hata atar ve5 == "5"yanlış değerini döndürür.İkili listelerde, son virgül yalnızca ikili liste parantez içinde olduğunda (
1,yerine(1,)yazıldığında) geçerlidir.Sözlük değişmezlerinde 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 iterlenebilir değildir.
Aşağıdaki Python özellikleri desteklenmez:
- Örtülü dize birleştirme (açık
+operatörünü kullanın). - Zincirlenmiş karşılaştırmalar (
1 < x < 5gibi). class(structişlevine bakın).import(loadbeyanına bakın).while,yield.- float ve set türleri.
- oluşturucular ve oluşturucu ifadeleri.
is(bunun yerine==kullanın).try,raise,except,finally(ölümcül hatalar içinfailbölümüne bakın).global,nonlocal.- çoğu yerleşik işlev, çoğu yöntem.