หน้านี้เป็นภาพรวมของ 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 อาจแตกต่างจาก Python แต่ความแตกต่างด้านพฤติกรรมคือ ยกเว้นในกรณีที่ Starlark แสดงข้อผิดพลาด Python ต่อไปนี้ ประเภทที่รองรับ ได้แก่
ความสามารถในการเปลี่ยนแปลง
Starlark ให้ความสำคัญกับความคงที่ โครงสร้างข้อมูลที่เปลี่ยนแปลงได้ 2 แบบมีดังนี้ lists และ dicts การเปลี่ยนแปลงโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ เช่น การต่อท้ายค่าในลิสต์หรือลบรายการในพจนานุกรมจะใช้ได้กับออบเจ็กต์ที่สร้างขึ้นในบริบทปัจจุบันเท่านั้น หลังจาก เมื่อบริบทจบแล้ว คุณค่าของเนื้อหาจะกลายเป็นสิ่งที่จะเปลี่ยนแปลงไม่ได้
เนื่องจากบิลด์ 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 สร้าง var
เมื่อโหลด foo.bzl
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
มีข้อจำกัดทางไวยากรณ์ 2 ข้อ ได้แก่ 1) การประกาศฟังก์ชันผิดกฎหมาย และ 2) ไม่อนุญาตให้ใช้อาร์กิวเมนต์ *args
และ **kwargs
ความแตกต่างกับ Python
ตัวแปรร่วมจะเปลี่ยนแปลงไม่ได้
ไม่อนุญาตให้ใช้คำสั่ง
for
ที่ระดับบนสุด ให้ใช้ภายในฟังก์ชันแทน ในBUILD
ไฟล์ คุณอาจใช้การทำความเข้าใจรายการได้ไม่อนุญาตให้ใช้คำสั่ง
if
ที่ระดับบนสุด แต่นิพจน์if
ที่ใช้ได้:first = data[0] if len(data) > 0 else None
ลําดับที่แน่นอนสำหรับการวนซ้ำผ่านพจนานุกรม
ไม่อนุญาตให้ใช้การเกิดซ้ำ
ประเภท Int จำกัดอยู่ที่จำนวนเต็มที่มีเครื่องหมาย 32 บิต ส่วนเกินจะทำให้เกิดข้อผิดพลาด
การแก้ไขคอลเล็กชันระหว่างการทำซ้ำเป็นข้อผิดพลาด
ยกเว้นการทดสอบความเท่ากัน ระบบจะไม่กำหนดโอเปอเรเตอร์การเปรียบเทียบ
<
,<=
,>=
,>
ฯลฯ สำหรับค่าประเภทต่างๆ กล่าวโดยย่อคือ5 < 'foo'
จะแสดงข้อผิดพลาด และ5 == "5"
จะแสดงผลเป็นเท็จใน Tuple คอมมาต่อท้ายจะใช้ได้เฉพาะเมื่อ Tuple อยู่ระหว่าง วงเล็บ — เมื่อคุณเขียน
(1,)
แทนที่จะเป็น1,
ลิเทอรัลของพจนานุกรมต้องไม่มีคีย์ที่ซ้ำกัน ตัวอย่างเช่น นี่คือ ข้อผิดพลาด:
{"a": 4, "b": 7, "a": 1}
สตริงจะแสดงเป็นเครื่องหมายคำพูดคู่ (เช่น เมื่อคุณเรียกใช้ repr)
สตริงทำซ้ำไม่ได้
ระบบไม่รองรับฟีเจอร์ Python ต่อไปนี้
- การต่อสตริงโดยนัย (ใช้โอเปอเรเตอร์
+
แบบโจ่งแจ้ง) - การเปรียบเทียบแบบเชน (เช่น
1 < x < 5
) class
(ดูฟังก์ชันstruct
)import
(ดูคำสั่งload
)while
,yield
- ประเภทที่ลอยได้และชุดข้อมูล
- เครื่องมือสร้าง และนิพจน์ของโปรแกรมสร้าง
is
(ใช้==
แทน)try
,raise
,except
,finally
(ดูข้อผิดพลาดร้ายแรงที่fail
)global
,nonlocal
- ฟังก์ชันในตัวส่วนใหญ่ เมธอดส่วนใหญ่