Starlark Dili

Sorun bildir Kaynağı görüntüleyin 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 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ş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. Dolayısıyla 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ı 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üklenmesi gerekiyor.

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 farklılıklar

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

  • Üst düzeyde for ifadelerine izin verilmez. 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ü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 koleksiyonu değiştirmek hatadı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 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şmez değerlerinin 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).
  • Zincirleme karşılaştırmalar (ör. 1 < x < 5).
  • 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 (kritik hatalar için fail bölümüne bakın).
  • global, nonlocal.
  • çoğu yerleşik işlev, çoğu yöntem.