Starlark Dili

Sorun bildirin Kaynağı göster

Bu sayfada, Bazel'de kullanılan dil olan Skylark olarak bilinen Starlark'a 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 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. 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 anlamları Python'dan farklı olabilir ancak Starlark'ın hata bildirdiği durumlar dışında davranışsal farklılıklar çok nadirdir. Aşağıdaki Python türleri desteklenir:

Değişkenlik

Starlark değişmezliği sever. İki farklı veri yapısı mevcuttur: listeler ve dikteler. Değişebilir veri yapılarında yapılan değişiklikler (ör. listeye değer ekleme veya sözlükteki girişleri silme) yalnızca geçerli bağlamda oluşturulan nesneler için geçerlidir. Bağlam tamamlandıktan sonra 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 kendi bağlamında analiz edilir.

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 bağlamının bir parçasıdır. fct() çalıştığında bunu foo.bzl bağlamında yapar. foo.bzl değerlendirmesi tamamlandıktan sonra ortamda [5] değerine sahip, sabit bir giriş (var) bulunur.

Başka bir bar.bzl, foo.bzl uygulamasından semboller yüklediğinde, yüklenen değerler sabit kalır. Bu nedenle, bar.bzl içinde aşağıdaki kod kullanılamaz:

# `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ın kullanıldığı yukarıdaki örnekte olduğu gibi, kurallar tarafından döndürülen değerler değiştirilemez.

BUILD ile .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ında genel simgelerdir. bzl dosyanın, native modülünü kullanarak yüklenmesi gerekiyor.

BUILD dosyalarında iki söz dizimsel kısıtlama vardır: 1) İşlevlerin bildirilmesi 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 verilmiyor. Bunun yerine, bunları işlevlerin içinde kullanın. BUILD dosyalarında liste anlama özelliğini kullanabilirsiniz.

  • Üst düzeyde if ifadelerine izin verilmiyor. Ancak if ifadeleri kullanılabilir: first = data[0] if len(data) > 0 else None.

  • Sözlükler aracılığıyla iterasyon için belirli bir sıra.

  • Yinelemeye izin verilmez.

  • Tam sayı türü, 32 bit imzalı tam sayılarla sınırlıdır. Taşmalar 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. Kısacası: 5 < 'foo' hata verir ve 5 == "5" false (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 bir hatadır: {"a": 4, "b": 7, "a": 1}.

  • Dizeler, çift tırnak işaretiyle gösterilir (ör. repr çağrısı yaptığınızda).

  • Dizeler yinelenemez.

Aşağıdaki Python özellikleri desteklenmez:

  • örtülü dize birleştirme (açık + operatörü kullanın).
  • Zincirleme karşılaştırmalar (ör. 1 < x < 5).
  • class (struct işlevine bakın).
  • import (load beyanını inceleyin).
  • while, yield.
  • türleri belirleyin.
  • ve yaratan ifadeleri ifade eder.
  • is (Bunun yerine == kullanın).
  • try, raise, except, finally (önemli hatalar için fail sayfasını inceleyin).
  • global, nonlocal.
  • yerleşik işlevlerden ve pek çok yöntemden bahsedeceğiz.