Starlark Dili

Sorun bildir Kaynağı göster

Bu sayfa, eskiden Skylark olan Bazel'de kullanılan dil olan Starlark'a genel bir bakıştır. İşlev 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 bakın.

Starlark söz dizimi ve davranışının yetkili teknik spesifikasyonu için Starlark Dil Spesifikasyonu'na bakın.

Söz dizimi

Starlark'ın söz dizimi Python3'ten esinlenilmiştir. Starlark'ta şu geçerli bir söz dizimi kullanılır:

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 verdiği durumlar dışında davranışsal farklılıklar nadiren görülür. Aşağıdaki Python türleri desteklenir:

Değişkenlik

Starlark değişmezliği sever. Değişebilir iki veri yapısı kullanılabilir: listeler ve diktler. Bir listeye değer ekleme veya bir sözlükten giriş silme gibi değişken veri yapılarında yapılan değişiklikler, yalnızca geçerli bağlamda oluşturulan nesneler için geçerlidir. Bağlam bittikten sonra değerleri sabit 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ına sahip olur. Ayrıca her kural kendi bağlamında analiz edilir.

foo.bzl dosyasını içeren 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

foo.bzl yüklendiğinde Bazel, var oluşturuyor. Bu nedenle var, foo.bzl bağlamının bir parçasıdır. fct() çalıştırıldığında bu işlemi foo.bzl bağlamında yapar. foo.bzl değerlendirmesi tamamlandıktan sonra ortam, [5] değerine sahip sabit bir giriş (var) içerir.

Başka bir bar.bzl, foo.bzl öğesinden sembolleri yüklediğinde, yüklenen değerler sabit kalır. Bu nedenle, bar.bzl içinde bulunan 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ın kullanıldığı yukarıdaki örnekte olduğu gibi, kurallar tarafından döndürülen değerler sabittir.

BUILD ve .bzl dosyaları arasındaki farklar

BUILD dosya, kurallara çağrı yaparak hedefleri kaydeder. .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 dosyanın, native modülünü kullanarak yüklemesi gerekiyor.

BUILD dosyalarında iki söz dizimi kısıtlaması vardır: 1) işlevlerin bildirilmesi 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 sabittir.

  • for ifadelerine üst düzeyde izin verilmez. Bunları işlevlerin içinde kullanın. BUILD dosyalarında liste anlama özelliğini kullanabilirsiniz.

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

  • Sözlükler aracılığıyla yineleme 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 hataya neden olur.

  • Yineleme sırasında bir koleksiyonun değiştirilmesi bir hatadır.

  • Eşitlik testleri dışında, <, <=, >=, > vb. karşılaştırma operatörleri değer türleri genelinde tanımlanmaz. Kısacası, 5 < 'foo' hata verir, 5 == "5" döndürülür.

  • Tuple'larda, sondaki virgül yalnızca çift parantez arasında olduğunda (1, yerine (1,) yazdığınızda) geçerlidir.

  • Sözlük değişmez değerlerinde 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:

  • kapalı dize birleştirme (açık + operatörü kullanın).
  • Zincirli karşılaştırmalar (1 < x < 5 gibi).
  • class (bkz. struct işlevi).
  • import (load ekstresine bakın).
  • while, yield.
  • kayan ve küme türleridir.
  • oluşturucu ifadeler.
  • is (bunun yerine == kullanın).
  • try, raise, except, finally (önemli hatalar için fail adresine bakın).
  • global, nonlocal.
  • yerleşik işlevleri kullanır.