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

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

इस पेज पर Starlark के बारे में खास जानकारी दी गई है, इसे पहले स्काइलार्क के नाम से जाना जाता था, जो बेज़ल में इस्तेमाल की जाने वाली भाषा है. इनकी पूरी सूची के लिए, फ़ंक्शन और टाइप के बारे में ज़्यादा जानने के लिए, Bagel 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)

स्टारलार्क के सिमेंटिक्स, Python से अलग हो सकते हैं, लेकिन व्यवहार में कुछ फ़र्क़ है ऐसा बहुत कम होता है. हालांकि, उन मामलों में स्टारलार्क कोई गड़बड़ी करता है. नीचे दिया गया Python प्रकार समर्थित हैं:

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

स्टारलार्क में है कि म्यूटेबिलिटी पर कोई असर नहीं पड़ा. दो बदले जा सकने वाले डेटा स्ट्रक्चर उपलब्ध हैं: lists और dicts. म्यूटेबल में किए गए बदलाव डेटा स्ट्रक्चर, जैसे कि किसी सूची में वैल्यू जोड़ना या किसी एंट्री को मिटाना शब्दकोश सिर्फ़ मौजूदा कॉन्टेक्स्ट में बनाए गए ऑब्जेक्ट के लिए मान्य हैं. एक संदर्भ खत्म होता है, तो इसके मान अम्यूटेबल हो जाते हैं.

ऐसा इसलिए होता है, क्योंकि 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 के लोड होने पर, Basel 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.

  • शब्दकोश में दोहराने का तय क्रम.

  • बार-बार होने की अनुमति नहीं है.

  • इंटेजर टाइप, 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.
  • ज़्यादातर बिल्ट-इन फ़ंक्शन का इस्तेमाल करके, कई तरीके अपनाए जा सकते हैं.