Trang này là thông tin tổng quan về Starlark, trước đây được gọi là Skylark, ngôn ngữ được sử dụng ở Bazel. Để xem danh sách đầy đủ hàm và loại, hãy xem tài liệu tham khảo về API Bazel.
Để biết thêm thông tin về ngôn ngữ này, hãy xem kho lưu trữ GitHub của Starlark.
Đối với thông số kỹ thuật có căn cứ của cú pháp Starlark và hãy xem Thông số kỹ thuật ngôn ngữ Starlark.
Cú pháp
Cú pháp của Starlark được lấy cảm hứng từ Python3. Đây là cú pháp hợp lệ trong 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)
Ngữ nghĩa của Starlark có thể khác với Python, nhưng những khác biệt về hành vi là hiếm khi xảy ra, ngoại trừ trường hợp Starlark đưa ra lỗi. Python sau đây các loại được hỗ trợ:
Khả năng thay đổi
Starlark ưa chuộng tính bất biến. Có hai cấu trúc dữ liệu có thể thay đổi: list (danh sách) và dicts (bản chính tả). Các thay đổi thành có thể thay đổi cấu trúc dữ liệu, chẳng hạn như thêm giá trị vào danh sách hoặc xoá mục nhập trong từ điển chỉ hợp lệ với các đối tượng được tạo trong ngữ cảnh hiện tại. Sau một ngữ cảnh kết thúc, các giá trị của ngữ cảnh đó trở nên không thể thay đổi.
Lý do là các bản dựng Bazel sử dụng phương thức thực thi song song. Trong một bản dựng, mỗi .bzl
và mỗi tệp BUILD
sẽ có ngữ cảnh thực thi riêng. Mỗi quy tắc cũng
được phân tích trong bối cảnh riêng của nó.
Hãy xem qua một ví dụ với tệp 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 tạo var
khi foo.bzl
tải. Do đó, var
là một phần của foo.bzl
ngữ cảnh. Khi fct()
chạy, nó sẽ thực hiện việc đó trong ngữ cảnh foo.bzl
. Sau
cho foo.bzl
khi hoàn tất, môi trường chứa một mục không thể thay đổi,
var
với giá trị [5]
.
Khi một bar.bzl
khác tải biểu tượng từ foo.bzl
, các giá trị được tải vẫn sẽ giữ nguyên
bất biến. Vì lý do này, mã sau đây trong bar.bzl
là bất hợp pháp:
# `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
Bạn không thể thay đổi các biến toàn cục được xác định trong tệp bzl
bên ngoài
Tệp bzl
xác định chúng. Cũng giống như ví dụ trên, khi sử dụng tệp bzl
,
các giá trị được trả về theo quy tắc là không thể thay đổi.
Sự khác biệt giữa tệp BUILD và .bzl
Tệp BUILD
đăng ký mục tiêu thông qua việc thực hiện lệnh gọi đến các quy tắc. Cung cấp .bzl
tệp
định nghĩa cho hằng số, quy tắc, macro và hàm.
Hàm gốc và quy tắc gốc là những ký hiệu chung trong
BUILD
tệp. Các tệp bzl
cần tải các tệp này bằng mô-đun native
.
Có hai hạn chế về cú pháp trong tệp BUILD
: 1) việc khai báo hàm là
không hợp lệ và 2) đối số *args
và **kwargs
không được phép.
Điểm khác biệt với Python
Biến toàn cục là không thể thay đổi.
Không được phép sử dụng câu lệnh
for
ở cấp cao nhất. Sử dụng chúng trong hàm thay thế. Trong tệpBUILD
, bạn có thể sử dụng tính năng hiểu danh sách.Không được phép sử dụng câu lệnh
if
ở cấp cao nhất. Tuy nhiên, biểu thứcif
có thể dùng:first = data[0] if len(data) > 0 else None
.Thứ tự xác định cho việc lặp lại thông qua Từ điển.
Không được phép lặp lại.
Loại số nguyên được giới hạn ở số nguyên 32 bit đã ký. Trường hợp tràn sẽ tạo ra lỗi.
Việc sửa đổi một tập hợp trong quá trình lặp lại là một lỗi.
Ngoại trừ kiểm thử bằng nhau, các toán tử so sánh
<
,<=
,>=
,>
, v.v. không được xác định theo loại giá trị. Tóm lại:5 < 'foo'
sẽ gửi một lỗi và5 == "5"
sẽ trả về giá trị false.Trong các bộ dữ liệu, dấu phẩy theo sau chỉ hợp lệ khi bộ dữ liệu nằm giữa dấu ngoặc đơn – khi bạn viết
(1,)
thay vì1,
.Hằng từ điển không được có khoá trùng lặp. Ví dụ: đây là một lỗi:
{"a": 4, "b": 7, "a": 1}
.Chuỗi được biểu thị bằng dấu ngoặc kép (chẳng hạn như khi bạn gọi repr).
Chuỗi không thể lặp lại.
Các tính năng Python sau đây không được hỗ trợ:
- nối chuỗi ngầm ẩn (sử dụng toán tử
+
tường minh). - Thông tin so sánh theo chuỗi (chẳng hạn như
1 < x < 5
). class
(xem hàmstruct
).import
(xem câu lệnhload
).while
,yield
.- độ chính xác đơn và kiểu tập hợp.
- trình tạo và biểu thức trình tạo.
is
(thay vào đó, hãy dùng==
).try
,raise
,except
,finally
(xemfail
để biết lỗi nghiêm trọng).global
,nonlocal
.- hầu hết các hàm tích hợp, hầu hết các phương thức.