این صفحه یک نمای کلی از 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
- اکثر توابع داخلی، اکثر روش ها.