इस पेज पर, Starlark के बारे में खास जानकारी दी गई है. इसे Skylark के नाम से जाना जाता है, जो Bazel में इस्तेमाल की जाने वाली भाषा है. फ़ंक्शन और टाइप की पूरी सूची के लिए, Bazel API का रेफ़रंस देखें.
भाषा के बारे में ज़्यादा जानने के लिए, Starlark के GitHub रेपो को देखें.
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 टाइप का इस्तेमाल किया जा सकता है:
म्यूटेबिलिटी
स्टारलार्क अचलता का पक्ष लेता है. दो म्यूट किए जा सकने वाले डेटा स्ट्रक्चर उपलब्ध हैं: सूची और शब्द. बदली जा सकने वाली डेटा-संरचना में बदलाव, जैसे किसी सूची में वैल्यू जोड़ना या किसी शब्दकोश में कोई एंट्री मिटाना सिर्फ़ मौजूदा संदर्भ में बनाए गए ऑब्जेक्ट के लिए मान्य होते हैं. किसी संदर्भ के खत्म होने के बाद, उसके मान नहीं बदले जा सकते.
ऐसा इसलिए होता है, क्योंकि 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
का आकलन पूरा होने के बाद, एनवायरमेंट में एक ऐसी एंट्री शामिल होती है जिसमें बदलाव नहीं किया जा सकता
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}
.स्ट्रिंग को डबल कोट (जैसे कि जब आप रिप्रे कहते हैं) के साथ दिखाया जाता है.
स्ट्रिंग को फिर से इस्तेमाल नहीं किया जा सकता.
Python की ये सुविधाएं इस्तेमाल नहीं की जा सकतीं:
- इंप्लिसिट स्ट्रिंग एग्रीगेशन: अश्लील
+
ऑपरेटर का इस्तेमाल करें. - उनकी तुलना करके मिली जानकारी, जैसे कि
1 < x < 5
. class
(struct
फ़ंक्शन देखें).import
(load
स्टेटमेंट देखें).while
,yield
.- फ़्लोट और सेट टाइप.
- जनरेटर और एक्सप्रेशन का कॉम्बिनेशन.
is
(इसके बजाय==
का इस्तेमाल करें).try
,raise
,except
,finally
(गंभीर गड़बड़ियों के लिएfail
देखें).global
,nonlocal
.- ज़्यादातर बिल्ट-इन फ़ंक्शन, इस्तेमाल करने के ज़्यादा तरीके.