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 edinmek 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 anlamları Python'dan farklı olabilir ancak davranış farklılıkları (Starlark'ın hata bildirdiği durumlar dışında). Aşağıdaki Python türleri desteklenir:
Değişkenlik
Starlark, değişmezliği tercih eder. İki farklı veri yapısı kullanılabilir: listeler ve dikeyler. 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. Ardından bağlam sona erdiğinde değerleri değiştirilemez.
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 aynı zamanda
kavrayabilmesidir.
foo.bzl
dosyasıyla ilgili bir örneği inceleyelim:
# `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
daha yakından inceleyeceğiz. fct()
çalıştığında bunu foo.bzl
bağlamında yapar. Şu tarihten sonra:
foo.bzl
için değerlendirme tamamlandığında, ortam sabit bir giriş içerir ve
[5]
değerine sahip var
.
Başka bir bar.bzl
, foo.bzl
konumundan semboller yüklediğinde, yüklenen değerler kalır
hiçbir şey değişmez. 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
kendilerini tanımlayan bzl
dosyası. bzl
dosyalarının kullanıldığı yukarıdaki örnekte olduğu gibi,
kuralların döndürdüğü değerler sabittir.
BUILD ve .bzl dosyaları arasındaki farklar
BUILD
dosyaları, kurallara çağrı yaparak hedefleri kaydeder. .bzl
dosyaları
sabit değerler, kurallar, makrolar ve fonksiyonların tanımlarını içerir.
Yerel işlevler ve yerel kurallar
BUILD
dosya. bzl
dosyanın, native
modülünü kullanarak yüklenmesi gerekiyor.
BUILD
dosyalarında iki söz dizimsel kısıtlama vardır: 1) İşlevleri bildirme
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
for
ifadelerine izin verilmez. Bunun yerine işlevler içinde kullanın.BUILD
dosyalarında liste anlama özelliğini 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 tüm değer türlerinde tanımlanmamıştır. Kısacası:5 < 'foo'
bir hata verir 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 bu bir hata:
{"a": 4, "b": 7, "a": 1}
.Dize ç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 < 5
gibi). class
(struct
işlevine bakın).import
(load
beyanını inceleyin).while
,yield
.- float ve set türleri.
- ve yaratan ifadeleri ifade eder.
is
(bunun yerine==
kullanın).try
,raise
,except
,finally
(önemli hatalar içinfail
sayfasını inceleyin).global
,nonlocal
.- yerleşik işlevlerden ve pek çok yöntemden bahsedeceğiz.