Starlark Dili

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 dizimine ve söz dizimine ilişkin daha fazla bilgi 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:

Değişkenlik

Starlark değişmezliği sever. İki değişken veri yapısı kullanılabilir: listeler ve dizinler. Değişebilir değişiklikler bir listeye değer ekleme veya 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. 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 kendilerini tanımlayan bzl dosyası. 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ı sabit değerler, kurallar, makrolar ve fonksiyonların tanımlarını içerir.

Yerel işlevler ve yerel kurallar BUILD dosya. 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 arasındaki farklar

  • Genel değişkenler değiştirilemez.

  • Üst düzeyde for ifadelerine izin verilmiyor. Bunun yerine işlevler içinde kullanın. BUILD dosyalarında liste kapsamları kullanabilirsiniz.

  • Üst düzeyde if ifadelerine izin verilmez. Ancak if 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 ve 5 == "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 yinelenemez.

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ına bakın).
  • while, yield.
  • türleri belirleyin.
  • oluşturucular ve oluşturucu ifadeleri.
  • is (Bunun yerine == kullanın).
  • try, raise, except, finally (kritik hatalar için fail bölümüne bakın).
  • global, nonlocal.
  • yerleşik işlevlerden ve pek çok yöntemden bahsedeceğiz.