Starlark Dili

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada Starlark hakkında Skylark, Bazel'de kullanılan dil olarak bilinir. Projenin tam listesi için işlevlerini ve türlerini öğrenmek 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. 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 davranış farklılıkları (Starlark'ın hata bildirdiği durumlar dışında). Aşağıdaki Python türler desteklenir:

Değişkenlik

Starlark değişmezliği sever. İki farklı veri yapısı kullanılabilir: listeler ve dikeyler. 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. Dolayısıyla var, foo.bzl bağlam. fct() çalıştığında bunu foo.bzl bağlamında yapar. Şu tarihten sonra: foo.bzl için değerlendirme tamamlandığında, ortam değiştirilemez bir giriş içerdiği için [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 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 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 ile .bzl dosyaları arasındaki farklar

BUILD dosya, kurallara çağrı yaparak hedefleri kaydediyor. .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 farklılıklar

  • Global değişkenler sabittir.

  • Üst düzeyde for ifadelerine izin verilmiyor. İşlevlerde kullanma . 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 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.

  • Tuple'larda, sondaki virgül yalnızca demet arasında parantez (1, yerine (1,) yazdığınızda).

  • Sözlük değişmez değerlerinin yinelenen anahtarları olamaz. Örneğin bu bir hata: {"a": 4, "b": 7, "a": 1}.

  • Dizeler çift tırnak işaretleriyle gösterilir (örneğin, repr) içerir.

  • 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.