Starlark Dili

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Bu sayfada, Bazel'de kullanılan dil olan ve eski adıyla Skylark olarak bilinen Starlark'a 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 için Starlark'ın GitHub deposuna bakı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 geçerli söz dizimi:

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 semantiği Python'dan farklı olabilir ancak Starlark'ın hata verdiği durumlar dışında davranış farklılıkları nadirdir. Aşağıdaki Python türleri desteklenir:

Değişkenlik

Starlark, değişmezliği tercih eder. Değiştirilebilir iki veri yapısı vardır: listeler ve sözlükler. Değiştirilebilir veri yapılarında yapılan değişiklikler (ör. bir listeye değer ekleme veya sözlükteki bir girişi silme) yalnızca mevcut bağlamda oluşturulan nesneler için geçerlidir. Bir bağlam tamamlandıktan sonra değerleri değişmez hale gelir.

Bunun nedeni, Bazel derlemelerinde paralel yürütme kullanılması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 da 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. Bu nedenle var, foo.bzl'nin bağlamının bir parçasıdır. fct() çalıştırıldığında foo.bzl bağlamında çalışır. foo.bzl değerlendirmesi tamamlandıktan sonra ortamda [5] değeriyle değişmez bir giriş (var) bulunur.

Başka bir bar.bzl, foo.bzl kaynağından sembol yüklediğinde yüklenen değerler değişmez kalır. Bu nedenle, bar.bzl dilindeki 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 dosyaları, kurallara çağrı yaparak hedefleri kaydeder. .bzl dosyaları; sabitler, kurallar, makrolar ve işlevler için tanımlar sağlar.

BUILD dosyalarındaki yerel işlevler ve yerel kurallar genel sembollerdir. bzl dosyalarının, native modülünü kullanarak yüklenmesi gerekir.

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

  • Üst düzeyde for ifadelerine izin verilmez. Bunun yerine işlevlerde kullanın. BUILD dosyalarında liste kavrayışlarını 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 yineleme için deterministik sıra.

  • Özyinelemeye izin verilmez.

  • Int türü, 32 bit imzalı tam sayılarla sınırlıdır. Taşmalar hata verir.

  • Yineleme sırasında koleksiyonu değiştirmek hataya neden olur.

  • Eşitlik testleri hariç olmak üzere, karşılaştırma operatörleri <, <=, >=, > vb. değer türleri arasında tanımlanmaz. Kısaca: 5 < 'foo' hata verir ve 5 == "5" yanlış değerini döndürür.

  • Demetlerde, sondaki virgül yalnızca demet parantez içindeyken geçerlidir. Yani 1, yerine (1,) yazdığınızda geçerlidir.

  • Sözlük değişmezleri yinelenen anahtarlara sahip olamaz. Örneğin, bu bir hatadır: {"a": 4, "b": 7, "a": 1}.

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

  • Dizeler yinelenebilir 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 ifadesine bakın).
  • while, yield.
  • float ve set türleri.
  • üreticiler ve üretici ifadeleri.
  • is (bunun yerine == kullanın).
  • try, raise, except, finally (Önemli hatalar için fail bölümüne bakın).
  • global, nonlocal.
  • Çoğu yerleşik işlev, çoğu yöntem.