ภาษาสตาร์ลาร์ก

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้เป็นภาพรวมของ 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 ต่อไปนี้ ประเภทที่รองรับ ได้แก่

ความสามารถในการเปลี่ยนแปลง

สตาร์ลาร์กไม่ชอบการเปลี่ยนแปลง โครงสร้างข้อมูลที่เปลี่ยนแปลงได้ 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) การประกาศฟังก์ชัน ไม่อนุญาตให้ใช้ *args และ **kwargs อาร์กิวเมนต์

ความแตกต่างกับ Python

  • ตัวแปรร่วมจะเปลี่ยนแปลงไม่ได้

  • ไม่อนุญาตให้ใช้คำสั่ง for ที่ระดับบนสุด ใช้ภายในฟังก์ชัน แทน ใน BUILD ไฟล์ คุณอาจใช้การทำความเข้าใจรายการได้

  • ไม่อนุญาตให้ใช้คำสั่ง if ที่ระดับบนสุด แต่นิพจน์ if ที่ใช้ได้: first = data[0] if len(data) > 0 else None

  • ลำดับที่กำหนดสำหรับการทำซ้ำผ่านพจนานุกรม

  • ไม่อนุญาตให้ใช้การเกิดซ้ำ

  • ประเภท Int จำกัดอยู่ที่จำนวนเต็มที่มีเครื่องหมาย 32 บิต ส่วนเกินจะทำให้เกิดข้อผิดพลาด

  • การแก้ไขคอลเล็กชันระหว่างการทำซ้ำถือเป็นข้อผิดพลาด

  • ยกเว้นการทดสอบความเท่ากัน โอเปอเรเตอร์การเปรียบเทียบ <, <=, >=, > ฯลฯ ไม่ได้กำหนดในค่าประเภทต่างๆ กล่าวโดยสรุปคือ 5 < 'foo' จะแสดงข้อผิดพลาดและ 5 == "5" จะส่งคืนค่า "เท็จ"

  • ใน Tuples คอมมาต่อท้ายจะใช้ได้เฉพาะเมื่อ 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
  • มีฟังก์ชันในตัวส่วนใหญ่ และเมธอดส่วนใหญ่