زبان Starlark

این صفحه یک نمای کلی از Starlark است که قبلاً به عنوان Skylark شناخته می شد، زبانی که در Bazel استفاده می شد. برای فهرست کامل توابع و انواع، به مرجع Bazel API مراجعه کنید.

برای اطلاعات بیشتر در مورد این زبان، به مخزن GitHub Starlark مراجعه کنید.

برای مشخصات معتبر نحو و رفتار Starlark، به مشخصات زبان Starlark مراجعه کنید.

نحو

سینتکس Starlark از Python3 الهام گرفته شده است. این نحو در Starlark معتبر است:

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 می تواند با پایتون متفاوت باشد، اما تفاوت های رفتاری نادر است، به جز مواردی که Starlark خطایی را ایجاد می کند. انواع پایتون زیر پشتیبانی می شوند:

تغییرپذیری

Starlark طرفدار تغییر ناپذیری است. دو ساختار داده قابل تغییر در دسترس هستند: لیست ها و دیکت ها . تغییرات در ساختارهای داده قابل تغییر، مانند افزودن یک مقدار به یک لیست یا حذف یک مدخل در فرهنگ لغت فقط برای اشیایی که در زمینه فعلی ایجاد شده اند معتبر است. پس از اتمام یک زمینه، مقادیر آن تغییر ناپذیر می شود.

این به این دلیل است که بیلدهای Bazel از اجرای موازی استفاده می کنند. در طول ساخت، هر فایل .bzl . و هر فایل BUILD زمینه اجرای خاص خود را دارند. هر قاعده نیز در زمینه خود تجزیه و تحلیل می شود.

بیایید یک مثال را با فایل foo.bzl :

# `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 بارگیری می شود var ایجاد می کند. بنابراین var بخشی از زمینه foo.bzl است. هنگامی که fct() اجرا می شود، این کار را در زمینه foo.bzl انجام می دهد. پس از تکمیل ارزیابی برای foo.bzl ، محیط حاوی یک ورودی تغییرناپذیر var با مقدار [5] است.

وقتی bar.bzl دیگری نمادها را از foo.bzl بارگیری می کند، مقادیر بارگذاری شده تغییرناپذیر می مانند. به همین دلیل، کد زیر در bar.bzl غیرقانونی است:

# `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 را نمی توان خارج از فایل bzl که آنها را تعریف کرده است تغییر داد. درست مانند مثال بالا با استفاده از فایل های bzl ، مقادیر بازگردانده شده توسط قوانین تغییر ناپذیر هستند.

تفاوت بین فایل های BUILD و .bzl

فایل های BUILD اهداف را از طریق برقراری تماس با قوانین ثبت می کنند. فایل های .bzl تعاریفی را برای ثابت ها، قوانین، ماکروها و توابع ارائه می کنند.

توابع بومی و قوانین بومی نمادهای جهانی در فایل های BUILD هستند. فایل های bzl باید با استفاده از ماژول native بارگیری شوند.

دو محدودیت نحوی در فایل های BUILD وجود دارد: 1) اعلام توابع غیرقانونی است، و 2) *args و **kwargs آرگومان مجاز نیستند.

تفاوت با پایتون

  • متغیرهای جهانی تغییر ناپذیر هستند.

  • for بیانیه ها در سطح بالا مجاز نیستند. در عوض از آنها در توابع استفاده کنید. در فایل های BUILD ، می توانید از درک لیست استفاده کنید.

  • if عبارات در سطح بالا مجاز نیستند. با این حال، if می توان از عبارات استفاده کرد: first = data[0] if len(data) > 0 else None .

  • ترتیب قطعی برای تکرار از طریق فرهنگ لغت.

  • بازگشت مجاز نیست.

  • نوع Int محدود به اعداد صحیح امضا شده 32 بیتی است. سرریزها یک خطا ایجاد می کند.

  • اصلاح یک مجموعه در طول تکرار یک خطا است.

  • به جز تست های برابری، عملگرهای مقایسه < , <= , >= , > و غیره در انواع مقادیر تعریف نشده اند. به طور خلاصه: 5 < 'foo' یک خطا ایجاد می کند و 5 == "5" false را برمی گرداند.

  • در تاپل ها، یک کامای انتهایی تنها زمانی معتبر است که تاپل بین پرانتز باشد - وقتی به جای 1, (1,) بنویسید.

  • لغت نامه ها نمی توانند کلیدهای تکراری داشته باشند. به عنوان مثال، این یک خطا است: {"a": 4, "b": 7, "a": 1} .

  • رشته ها با دو گیومه نمایش داده می شوند (مانند زمانی که شما repr را فرا می خوانید).

  • رشته ها تکرارپذیر نیستند.

ویژگی های پایتون زیر پشتیبانی نمی شوند:

  • الحاق رشته ضمنی (از عملگر + صریح استفاده کنید).
  • مقایسه های زنجیره ای (مانند 1 < x < 5 ).
  • class (به تابع struct مراجعه کنید).
  • import (به بیانیه load مراجعه کنید).
  • while , yield .
  • انواع شناور و مجموعه.
  • ژنراتورها و عبارات مولد.
  • is (به جای آن از == استفاده کنید).
  • try ، raise ، except ، finally (به fail برای خطاهای کشنده مراجعه کنید).
  • global ، nonlocal
  • اکثر توابع داخلی، اکثر روش ها.