स्टारलार्क भाषा

7.3 · 7.2 · 7.1 · 7.0 · 6.5

इस पेज पर, Starlark के बारे में खास जानकारी दी गई है. इसे पहले Skylark कहा जाता था. यह Bazel में इस्तेमाल की जाने वाली भाषा है. फ़ंक्शन और टाइप की पूरी सूची के लिए, Bazel API का रेफ़रंस देखें.

भाषा के बारे में ज़्यादा जानने के लिए, Starlark का GitHub रेपो देखें.

Starlark सिंटैक्स और इसके काम करने के तरीके की आधिकारिक जानकारी के लिए, Starlark Language की खास बातें देखें.

सिंटैक्स

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)

स्टारलार्क की सिमेंटिक्स, Python से अलग हो सकती है. हालांकि, व्यवहार में बहुत कम अंतर होता है. हालांकि, स्टारलार्क के वाक्य में कोई गड़बड़ी होती है. इन Python टाइप का इस्तेमाल किया जा सकता है:

म्यूटेबिलिटी

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

foo.bzl लोड होने पर, Bazel var बनाता है. इसलिए, var foo.bzl के कॉन्टेक्स्ट का हिस्सा है. fct(), foo.bzl के कॉन्टेक्स्ट में चलता है. foo.bzl का आकलन पूरा होने के बाद, एनवायरमेंट में [5] वैल्यू के साथ, var की नहीं बदली जा सकने वाली एंट्री शामिल होती है.

जब कोई दूसरा 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 आर्ग्युमेंट की अनुमति नहीं है.

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.
  • ज़्यादातर बिल्ट-इन फ़ंक्शन, ज़्यादातर तरीके.