इस पेज पर, Starlark के बारे में खास जानकारी दी गई है. इसे पहले Skylark कहा जाता था. यह Bazel में इस्तेमाल की जाने वाली भाषा है. इनकी पूरी सूची के लिए, फ़ंक्शन और टाइप के बारे में ज़्यादा जानने के लिए, Bagel API का रेफ़रंस देखें.
भाषा के बारे में ज़्यादा जानने के लिए, Starlark का GitHub repo देखें.
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 प्रकार समर्थित हैं:
म्यूटेबिलिटी
स्टारलार्क में है कि म्यूटेबिलिटी पर कोई असर नहीं पड़ा. डेटा में बदलाव करने की सुविधा वाले दो स्ट्रक्चर उपलब्ध हैं: सूची और डिकशनरी. म्यूटेबल में बदलाव डेटा स्ट्रक्चर, जैसे कि किसी सूची में वैल्यू जोड़ना या किसी एंट्री को मिटाना शब्दकोश सिर्फ़ मौजूदा कॉन्टेक्स्ट में बनाए गए ऑब्जेक्ट के लिए मान्य हैं. एक संदर्भ खत्म होता है, तो इसके मान अम्यूटेबल हो जाते हैं.
ऐसा इसलिए होता है, क्योंकि Basel का बिल्ड, पैरलल एक्ज़ीक्यूशन का इस्तेमाल करता है. बिल्ड के दौरान, हर .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
का आकलन पूरा होता है. एनवायरमेंट में ऐसी एंट्री मौजूद होती है जिन्हें बदला नहीं जा सकता,
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
फ़ाइलों में सिंटैक्स से जुड़ी दो पाबंदियां हैं: 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
.- ज़्यादातर बिल्ट-इन फ़ंक्शन का इस्तेमाल करके, कई तरीके अपनाए जा सकते हैं.