5.2.5. قوانین محدوده (Scoping)
یک محدوده (scope) در زبان Nix یک دیکشنری است که کلید آن نام است و هر نام را به یک عبارت و یک نوع تعریف نگاشت میکند. نوع تعریف یا صریح (explicit) است یا ضمنی (implicit). هر ورودی در این دیکشنری یک تعریف (definition) محسوب میشود.
تعریفهای صریح توسط عبارتهای زیر ایجاد میشوند:
تعریفهای ضمنی تنها توسط عبارتهای with ایجاد میشوند.
هر عبارت توسط یک محدوده محصور (enclosed) میشود. بیرونیترین عبارت توسط محدوده سراسری و توکار محصور میشود که تنها شامل تعریفهای صریح است. عبارتهای فهرستشده در بالا، محدوده محصور خود را با افزودن تعریفهای جدید یا جایگزینی تعریفهای موجود با همان نام، گسترش میدهند. یک تعریف صریح میتواند جایگزین تعریفی از هر نوعی شود؛ اما یک تعریف ضمنی تنها میتواند جایگزین تعریف ضمنی دیگری شود.
هر یک از عبارتهای فوق مشخص میکند که کدامیک از زیرعبارتهای آن توسط محدوده گسترشیافته محصور میشوند. در تمامی موارد دیگر، همان محدودهای که یک عبارت را محصور میکند، محدوده محصورکننده زیرعبارتهای آن نیز خواهد بود.
زبان Nix دارای محدوده ایستا (statically scoped) است؛ مقدار یک متغیر صرفاً توسط محدوده محصورکننده آن متغیر تعیین میشود، نه توسط زمینه پویا (dynamic context) که در آن ارزیابی میشود.
نکته
عبارتهای واردشده در Nix REPL توسط محدودهای محصور میشوند که میتواند با آرگومانهای خط فرمان یا دستورات قبلی REPL گسترش یابد. این روشهای گسترش محدوده، به بیان دقیق، بخشی از زبان Nix محسوب نمیشوند.