หน้านี้เป็นภาพรวมของ 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 แบบ ได้แก่ ลิสต์และพจนานุกรม การเปลี่ยนแปลงโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ เช่น การต่อท้ายค่าในรายการหรือการลบรายการใน พจนานุกรม จะใช้ได้กับออบเจ็กต์ที่สร้างในบริบทปัจจุบันเท่านั้น หลังจาก บริบทสิ้นสุดลง ค่าของบริบทจะเปลี่ยนแปลงไม่ได้
เนื่องจากการสร้าง 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"
จะแสดงผลเป็นเท็จในทูเพิล คอมมาต่อท้ายจะใช้ได้ก็ต่อเมื่อทูเพิลอยู่ระหว่าง วงเล็บ นั่นคือเมื่อคุณเขียน
(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
- ฟังก์ชันในตัวส่วนใหญ่ เมธอดส่วนใหญ่