فا نیکسی

5.3. عملگرها

نامنحووابستگی جهتیاولویت
[انتخاب صفت (Attribute selection)]attrset . attrpath [ or expr ]هیچ‌کدام۱
فراخوانی تابع (Function application)func exprچپ‌گرا۲
منفی‌سازی ریاضی (Arithmetic negation)- numberهیچ‌کدام۳
[بررسی وجود صفت (Has attribute)]attrset ? attrpathهیچ‌کدام۴
الحاق لیستlist ++ listراست‌گرا۵
ضرب (Multiplication)number * numberچپ‌گرا۶
تقسیم (Division)number / numberچپ‌گرا۶
تفریق (Subtraction)number - numberچپ‌گرا۷
جمع (Addition)number + numberچپ‌گرا۷
[الحاق رشته (String concatenation)]string + stringچپ‌گرا۷
[الحاق مسیر (Path concatenation)]path + pathچپ‌گرا۷
[الحاق مسیر و رشته]path + stringچپ‌گرا۷
[الحاق رشته و مسیر]string + pathچپ‌گرا۷
نفی منطقی (NOT)! boolهیچ‌کدام۸
[به‌روزرسانی (Update)]attrset // attrsetراست‌گرا۹
کوچک‌تر از (Less than)expr < exprهیچ‌کدام۱۰
کوچک‌تر یا مساوی (Less than or equal to)expr <= exprهیچ‌کدام۱۰
بزرگ‌تر از (Greater than)expr > exprهیچ‌کدام۱۰
بزرگ‌تر یا مساوی (Greater than or equal to)expr >= exprهیچ‌کدام۱۰
[برابری (Equality)]expr == exprهیچ‌کدام۱۱
نابرابریexpr != exprهیچ‌کدام۱۱
[عطف منطقی (Logical conjunction)] (AND)bool && boolچپ‌گرا۱۲
[فصل منطقی (Logical disjunction)] (OR)bool <code>||</code> boolچپ‌گرا۱۳
[استلزام منطقی (Logical implication)]bool -> boolراست‌گرا۱۴
[عملگر پایپ (Pipe operator)] (آزمایشی)expr \|> funcچپ‌گرا۱۵
[عملگر پایپ (Pipe operator)] (آزمایشی)func <\| exprراست‌گرا۱۵

انتخاب صفت

نحو (Syntax)

attrset . attrpath [ or expr ]

صفت مشخص‌شده توسط مسیر صفت attrpath را از [مجموعه ویژگی] attrset انتخاب کنید. اگر صفت وجود نداشته باشد، در صورت ارائه‌شدن expr پس از or، آن را برمی‌گرداند؛ در غیر این صورت، ارزیابی متوقف می‌شود.

فراخوانی تابع

نحو (Syntax)

func expr

مقدار قابل‌فراخوانی func را روی آرگومان expr اعمال کنید. به عدم وجود هرگونه علامت عملگر مشهود توجه کنید. یک مقدار قابل‌فراخوانی یکی از موارد زیر است:

هشدار

آیتم‌های فهرست نیز با فاصله از یکدیگر جدا می‌شوند، به این معنی که فراخوانی‌های تابع در آیتم‌های فهرست باید داخل پرانتز قرار گیرند.

بررسی وجود صفت

نحو (Syntax)

attrset ? attrpath

بررسی کنید که آیا [مجموعه ویژگی] attrset حاوی صفت مشخص‌شده توسط attrpath است یا خیر. نتیجه یک مقدار بولی (Boolean) است.

همچنین ببینید: builtins.hasAttr

پس از ارزیابی attrset و attrpath، پیچیدگی محاسباتی برای n صفت در attrset برابر با O(log(n)) است.

محاسبات ریاضی

اعداد نوع خود را حفظ خواهند کرد مگر اینکه با انواع عددی دیگر ترکیب شوند: عملیات مختص اعداد صحیح همیشه اعداد صحیح بازمی‌گردانند، در حالی که هر عملیاتی که شامل حداقل یک عدد اعشاری باشد، یک عدد اعشاری بازمی‌گرداند.

ارزیابی عملیات عددی زیر باعث بروز خطای ارزیابی می‌شود:

  • تقسیم بر صفر
  • سرریز عدد صحیح، یعنی هر عملیاتی که نتیجه‌ای خارج از محدوده قابل‌نمایش اعداد صحیح زبان Nix تولید کند.

همچنین ببینید مقایسه (Comparison) و برابری (Equality).

عملگر + سربارگذاری شده است تا روی رشته‌ها و مسیرها نیز کار کند.

الحاق رشته

نحو (Syntax)

string + string

دو رشته را به هم متصل کرده و زمینه‌های رشته‌ای آن‌ها را ادغام کنید.

الحاق مسیر

نحو (Syntax)

path + path

دو مسیر را به هم متصل کنید. نتیجه یک مسیر است.

الحاق مسیر و رشته

نحو (Syntax)

path + string

[مسیر] را به [رشته] متصل کنید. نتیجه یک مسیر است.

نکته

رشته نباید دارای زمینه رشته‌ای باشد که به یک [مسیر انبار] ارجاع دهد.

الحاق رشته و مسیر

نحو (Syntax)

string + path

[رشته] را به [مسیر] متصل کنید. نتیجه یک رشته است.

مهم

فایل یا پوشه موجود در path باید وجود داشته باشد و در [انبار] کپی شود. مسیر به عنوان [مسیر انبار] مربوطه در نتیجه ظاهر می‌شود.

به‌روزرسانی (Update)

نحو (Syntax)

attrset1 // attrset2

[مجموعه ویژگی] attrset1 را با نام‌ها و مقادیر حاصل از attrset2 به‌روزرسانی کنید.

مجموعه ویژگی بازگشتی بازگردانده‌شده شامل تمام صفات موجود در attrset1 و attrset2 خواهد بود. اگر نام صفتی در هر دو وجود داشته باشد، مقدار صفت از دومی گرفته می‌شود.

این عملگر در هر دو attrset1 و attrset2 سخت‌گیرانه (strict) است. این بدان معناست که هر دو آرگومان به فرم نرمال سر ضعیف (weak head normal form) ارزیابی می‌شوند، بنابراین خود مجموعه‌های ویژگی ارزیابی می‌شوند، اما مقادیر صفات آن‌ها ارزیابی نمی‌شوند.

مقایسه

مقایسه به صورت زیر انجام می‌شود:

  • حسابی برای اعداد
  • لغت‌نامه‌ای برای رشته‌ها و مسیرها
  • لغت‌نامه‌ای آیتم‌به‌آیتم برای فهرست‌ها: عنصرهای واقع در یک اینдекс در هر دو فهرست بر اساس نوعشان مقایسه شده و اگر برابر باشند، از آن‌ها صرف‌نظر می‌شود.

تمام عملگرهای مقایسه بر اساس < پیاده‌سازی شده‌اند و هم‌ارزی‌های زیر برقرار است:

مقایسهپیاده‌سازی
a <= b! ( b < a )
a > bb < a
a >= b! ( a < b )

برابری

  • مجموعه‌های ویژگی ابتدا بر اساس نام صفات و سپس بر اساس آیتم‌ها تا زمان یافتن اختلاف مقایسه می‌شوند.
  • فهرست‌ها ابتدا بر اساس طول و سپس بر اساس آیتم‌ها تا زمان یافتن اختلاف مقایسه می‌شوند.
  • مقایسه توابع متمایز مقدار false را برمی‌گرداند، اما توابع یکسان ممکن است مشمول بهینه‌سازی همانی مقدار شوند.
  • اعداد از نظر نوع سازگار هستند، به عملگرهای حسابی مراجعه کنید.
  • اعداد اعشاری فقط تا یک دقت محدود با هم تفاوت دارند.

عملگر == در هر دو آرگومان سخت‌گیرانه (strict) است؛ هنگام مقایسه انواع مرکب (مجموعه‌های ویژگی و فهرست‌ها)، در مقادیر درون آن‌ها به طور جزئی سخت‌گیرانه است: آن‌ها تا زمان یافتن اختلاف ارزیابی می‌شوند.

بهینه‌سازی همانی مقدار

نیکس مقایسه‌های برابری مقادیر تو در تو را از طریق برابری اشاره‌گر یا به شکلی انتزاعی‌تر، یعنی همانی (identity) انجام می‌دهد. معناشناسی نیکس در حالت ایده‌آل هویت منحصربه‌فردی را به مقادیر به هنگام ایجاد اختصاص نمی‌دهد، اما برابری از این قاعده مستثنی است. مزیت قابل بحث این کار کارایی بالاتر آن است و به ساختارهای حلقوی اجازه می‌دهد مقایسه شوند؛ به عنوان مثال، عبارت let x = {'{'} x = x; {'}'}; in x == x به true ارزیابی می‌شود. با این حال، در نتیجه‌ی این امر، هنگام انجام مقایسه در یک فهرست یا مجموعه ویژگی، تابع با خودش برابر می‌شود، که در تضاد با یک مقایسه مستقیم ساده است.

عطف منطقی

نحو (Syntax)

bool1 && bool2

AND منطقی. معادل if bool1 then bool2 else false.

این عملگر در bool1 سخت‌گیرانه (strict) است، اما bool2 را تنها در صورتی ارزیابی می‌کند که bool1 برابر با true باشد.

مثال

true && false
=> false

false && throw "never evaluated"
=> false

فصل منطقی (Logical disjunction)

نحو

bool1 || bool2

عملگر OR منطقی. معادل if bool1 then true else bool2 است.

این عملگر روی bool1 سخت‌گیرانه (strict) عمل می‌کند، اما bool2 را تنها در صورتی ارزیابی می‌کند که مقدار bool1 برابر با false باشد.

مثال

true || false
=> true

true || throw "never evaluated"
=> true

اولویت و فرم نرمال فصل

اولویت عملگرهای && و || با فرم نرمال فصل (disjunctive normal form) مطابقت دارد. بدون پرانتز، یک عبارت چندین «وضعیت مجاز» (که با || به هم متصل شده‌اند) را توصیف می‌کند، که در آن هر وضعیت شامل چندین شرط هم‌زمان (که با && به هم متصل شده‌اند) است.

برای مثال، عبارت A || B && C || D && E به شکل A || (B && C) || (D && E) تجزیه (parse) می‌شود که سه وضعیت مجاز را توصیف می‌کند: A برقرار است، یا هم‌زمان B و C برقرارند، یا هم‌زمان D و E برقرارند.

استلزام منطقی

نحو (Syntax)

bool1 -> bool2

استلزام منطقی. معادل است با !bool1 || bool2 (یا if bool1 then bool2 else true).

این عملگر نسبت به bool1 سخت‌گیرانه (strict) است، اما bool2 را تنها در صورتی ارزیابی می‌کند که bool1 برابر با true باشد.

مثال

true -> false
=> false

false -> throw "never evaluated"
=> true

عملگرهای خط لوله

  • a |> b معادل است با b a
  • a <| b معادل است با a b

مثال

nix-repl> 1 |> builtins.add 2 |> builtins.mul 3
9

nix-repl> builtins.add 1 <| builtins.mul 2 <| 3
7

هشدار

این سینتکس بخشی از یک ویژگی آزمایشی است و ممکن است در نسخه‌های آتی تغییر کند.

برای استفاده از این سینتکس، مطمئن شوید که ویژگی آزمایشی pipe-operators فعال است. برای مثال، مورد زیر را در nix.conf لحاظ کنید:

extra-experimental-features = pipe-operators

nix.dev/manual/nix/stable/language/operators.html

نیکسی · یادداشت‌های فارسی Nix local fonts