9 عبارت

ساخت وبلاگ

در این بخش ، تمام عبارات معتبر Erlang ذکر شده است. هنگام نوشتن برنامه های Erlang ، همچنین مجاز به استفاده از عبارات کلان و ضبط است. با این حال ، این عبارات در حین تدوین گسترش می یابند و به این معنا که عبارات ارلانگ درست نیستند. عبارات کلان و ضبط در بخش های جداگانه ای پوشانده شده است:

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

EXPR1 و EXPR2 ، که همچنین عبارات هستند ، ابتدا قبل از انجام این کار - به هر ترتیب - ارزیابی می شوند.

بسیاری از اپراتورها فقط می توانند برای استدلال از یک نوع خاص استفاده شوند. به عنوان مثال ، اپراتورهای حسابی فقط می توانند برای اعداد اعمال شوند. استدلال از نوع اشتباه باعث ایجاد خطای زمان اجرا Badarg می شود.

ساده ترین شکل بیان یک اصطلاح است ، که یک عدد صحیح ، شناور ، اتم ، رشته ، لیست ، نقشه یا Tuple است. مقدار بازده خود اصطلاح است.

یک متغیر یک عبارت است. اگر یک متغیر به یک مقدار محدود شود ، مقدار بازده این مقدار است. متغیرهای بدون مرز فقط در الگوهای مجاز هستند.

متغیرها با یک حرف بزرگ یا زیرکانه شروع می شوند (_). متغیرها می توانند حاوی کاراکترهای الفبایی ، زیربنایی و @ باشند.

مثال ها:

متغیرها با استفاده از تطبیق الگوی به مقادیر محدود می شوند. ارلانگ از تکالیف تک استفاده می کند ، یعنی یک متغیر فقط یک بار می تواند محدود شود.

متغیر ناشناس توسط زیرکور (_) مشخص می شود و در صورت نیاز به یک متغیر قابل استفاده است اما مقدار آن را می توان نادیده گرفت.

مثال:

متغیرهای شروع شده با زیرکور (_) ، به عنوان مثال ، _height ، متغیرهای عادی هستند ، ناشناس نیستند. با این حال ، آنها توسط کامپایلر نادیده گرفته می شوند به این معنا که هشدارهایی ایجاد نمی کنند.

مثال:

کد زیر:

می توان بازنویسی کرد تا قابل خواندن تر باشد:

اگر کد با مجموعه پرچم WARN_USUSED_VARS تهیه شود ، این هشدار برای یک متغیر بلااستفاده ، ELEM ایجاد می کند. در عوض ، کد را می توان بازنویسی کرد:

توجه کنید که از آنجا که متغیرهای شروع شده با یک زیربنایی ناشناس نیستند ، این مطابقت دارد:

دامنه یک متغیر بند عملکرد آن است. متغیرهای محدود در شاخه ای از IF ، مورد یا بیان باید در همه شاخه ها محدود شوند تا یک مقدار خارج از عبارت داشته باشند. در غیر این صورت آنها به عنوان "ناامن" در خارج از بیان در نظر گرفته می شوند.

برای بیان متغیر بیان ، Scoping محدود است به گونه ای که متغیرهای محدود در عبارت همیشه در خارج از عبارت "ناامن" هستند.

یک الگوی ساختار مشابه یک اصطلاح دارد اما می تواند حاوی متغیرهای بی حد و حصر باشد.

مثال:

الگوهای در سرهای بند ، عبارات موردی و دریافت و عبارات مطابقت مجاز است.

اگر الگوی 1 و الگوی 2 الگوهای معتبر باشند ، موارد زیر نیز یک الگوی معتبر است:

هنگامی که در برابر یک اصطلاح مطابقت داشته باشد ، هر دو الگوی 1 و الگوی 2 با این اصطلاح مطابقت دارند. ایده این ویژگی جلوگیری از بازسازی اصطلاحات است.

مثال:

در عوض می تواند به صورت نوشته شود

هنگام تطبیق رشته ها ، موارد زیر یک الگوی معتبر است:

این قند نحوی برای معادل آن است ، اما خواندن آن سخت تر است:

اگر هر دو دو شرط زیر را برآورده می کند ، می توان از یک بیان حسابی در یک الگوی استفاده کرد:

  • فقط از اپراتورهای عددی یا بیت به سمت استفاده می کند.
  • مقدار آن را می توان در صورت رعایت به صورت ثابت ارزیابی کرد.

مثال:

مسابقات زیر EXPR1 ، یک الگوی ، در برابر EXPR2:

اگر تطبیق موفق شود ، هر متغیر نامحدود در الگوی محدود می شود و مقدار expr2 بازگردانده می شود.

در صورت عدم موفقیت ، یک خطای زمان اجرا Badmatch رخ می دهد.

مثال ها:

در شکل اول تماس های عملکرد ، EXPRM: EXPRF (EXPR1. EXPRN) ، هر یک از ExpRM و ExpRF باید یک اتم یا عبارتی باشند که به یک اتم ارزیابی می شود. گفته می شود که این عملکرد با استفاده از نام عملکرد کاملاً واجد شرایط فراخوانی می شود. این اغلب به عنوان یک تماس عملکردی از راه دور یا خارجی گفته می شود.

مثال:

در شکل دوم تماس های عملکردی ، EXPRF (EXPR1. EXPRN) ، EXPRF باید یک اتم باشد یا برای تفریح ارزیابی شود.

اگر EXPRF یک اتم باشد ، گفته می شود که این عملکرد با استفاده از نام عملکرد واجد شرایط واجد شرایط فراخوانی می شود. اگر عملکرد EXPRF به صورت محلی تعریف شود ، به آن گفته می شود. از طرف دیگر ، اگر EXPRF به صراحت از ماژول M وارد شود ، M: Exprf (expr1. exp) خوانده می شود. اگر EXPRF نه به صورت محلی اعلام شود و نه به صراحت وارداتی ، EXPRF باید نام یک BIF به طور خودکار وارداتی باشد.

مثال ها:

مثالهایی که EXPRF سرگرم کننده است:

توجه کنید که هنگام فراخوانی یک عملکرد محلی ، بین استفاده از نام عملکرد ضمنی یا کاملاً واجد شرایط تفاوت وجود دارد. دومی همیشه به آخرین نسخه ماژول اشاره دارد. به جمع آوری و بارگیری کد و ارزیابی عملکرد مراجعه کنید.

اگر یک عملکرد محلی دارای نام مشابه BIF خودکار باشد ، معناشناسی این است که تماس های عملکردی واجد شرایط به طور ضمنی به عملکرد محلی تعریف شده هدایت می شوند ، نه به BIF. برای جلوگیری از سردرگمی ، یک دستورالعمل کامپایلر در دسترس است ، -compile () ، این باعث می شود BIF به صورت خودکار گزارش نشود. در شرایط خاص ، چنین کامپایل جهت گیری اجباری است.

قبل از OTP R14A (نسخه ERTS 5. 8) ، یک تماس با عملکردی واجد شرایط به یک عملکرد با همان نام BIF گزارش شده خودکار همیشه منجر به فراخوانی BIF می شود. در نسخه های جدیدتر کامپایلر ، به جای آن ، عملکرد محلی نامیده می شود. این امر برای جلوگیری از افزودنیهای آینده در مجموعه BIF های گزارش شده خودکار ، سکوت رفتار کد قدیمی را تغییر نمی دهد.

با این حال ، برای جلوگیری از آن کد قدیمی (Pre R14) رفتار خود را هنگام تهیه با نسخه OTP R14A یا بعد از آن تغییر داد ، محدودیت زیر اعمال می شود: اگر نام BIF را که در نسخه های OTP قبل از R14a گزارش شده بود ، نادیده بگیرید (نسخه ERTS5. 8) و یک تماس واجد شرایط برای آن عملکرد در کد خود داشته باشید ، یا باید صریحاً با استفاده از یک دستورالعمل کامپایلر ، واردات خودکار را حذف کنید ، یا تماس را با یک تماس عملکرد کاملاً واجد شرایط جایگزین کنید. در غیر این صورت خطای تلفیقی دریافت می کنید. مثال زیر را ببینید:

همین منطق در مورد توابع وارداتی صریح از ماژول های دیگر ، مانند توابع محلی تعریف شده اعمال می شود. مجاز به وارد کردن هر دو عملکرد از ماژول دیگر نیست و عملکردی را در ماژول همزمان اعلام کرده است:

برای BIF های گزارش شده خودکار در Erlang/OTP R14A و پس از آن ، بر این نام با یک عملکرد محلی یا واردات صریح همیشه مجاز است. با این حال ، اگ ر-compile (

شاخه های یک بیان IF به صورت متوالی اسکن می شوند تا اینکه یک سکانس گارد نگهبان که به TRUE ارزیابی می شود ، پیدا شود. سپس بدن مربوطه (توالی عبارات جدا شده توسط "،") ارزیابی می شود.

مقدار بازده بدن مقدار بازده عبارت IF است.

اگر هیچ دنباله نگهبان به عنوان صحیح ارزیابی نشود ، یک خطای زمان اجرا IF_Clause رخ می دهد. در صورت لزوم ، بیان گارد درست می تواند در آخرین شاخه استفاده شود ، زیرا این دنباله نگهبان همیشه درست است.

مثال:

بیان EXPR ارزیابی می شود و الگوی الگوهای متوالی با نتیجه مطابقت دارد. اگر یک مسابقه موفق شود و دنباله گارد اختیاری GuardSeq صحیح باشد ، بدن مربوطه ارزیابی می شود.

مقدار بازده بدن مقدار بازده عبارت Case است.

اگر الگوی تطبیق با یک دنباله نگهبان واقعی وجود نداشته باشد ، یک خطای زمان اجرا Case_Clause رخ می دهد.

مثال:

شاید یک ویژگی جدید آزمایشی باشد که در OTP 25 معرفی شده است. به طور پیش فرض ، غیرفعال است. برای فعال کردن شاید ، از گزینه کامپایلر استفاده کنید. این ویژگی همچنین باید در زمان اجرا با استفاده از گزین ه-t e-leture به ERL فعال شود.

عبارات موجود در یک بلوک ممکن است به صورت متوالی ارزیابی شود. اگر همه عبارات با موفقیت ارزیابی شوند ، مقدار بازده بلوک ممکن است Exp باشد. با این حال ، اعدام می تواند با یک بیان مسابقه مشروط کوتاه باشد:

؟ = اپراتور مسابقه شرطی نامیده می شود. فقط مجاز است در سطح بالای یک بلوک ممکن است استفاده شود. با الگوی EXPR1 در برابر EXPR2 مطابقت دارد. اگر تطبیق موفق شود ، هر متغیر نامحدود در الگوی محدود می شود. اگر عبارت آخرین عبارت در بلوک باشد ، مقدار EXPR2 را نیز برمی گرداند. اگر تطبیق ناموفق باشد ، بقیه عبارات موجود در بلوک ممکن است از بین بروند و مقدار بازده بلوک ممکن است expr2 باشد.

هیچ یک از متغیرهای محدود شده در یک بلوک ممکن است در کدی که از بلوک پیروی می کند استفاده شود.

به عنوان مثال:

بگذارید ابتدا فرض کنیم که A () باز می گردد و B () باز می گردد. با این مقادیر بازگشت ، تمام اپراتورهای مسابقه موفق می شوند و مقدار بازده بلوک ممکن است A + B باشد که برابر با 42 + 58 = 100 است.

حال بگذارید فرض کنیم که A () خطای برمی گردد. اپراتور مطابقت شرطی در؟ = a () مطابقت ندارد و مقدار بازده بلوک شاید مقدار عبارتی باشد که نتوانسته است مطابقت داشته باشد ، یعنی خطا. به همین ترتیب ، اگر B () اشتباه برگردد ، مقدار بازده بلوک ممکن است اشتباه باشد.

Finally, let us assume that a() retus -1 . Because true = A>= 0 از اپراتور مسابقه `=` استفاده می کند ، یک خطای زمان اجرا هنگامی رخ می دهد که بیان نتواند با الگوی مطابقت داشته باشد.

مثال را می توان با استفاده از عبارات مورد تو در تو به دست آورد:

ممکن است این بلوک با بندهای دیگر تقویت شود:

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

اگر الگوی تطبیق با یک دنباله نگهبان واقعی وجود نداشته باشد ، یک خطای زمان اجرا در زمان دیگری رخ می دهد.

هیچ یک از متغیرهای محدود در یک بلوک ممکن است در بندهای دیگر استفاده شود. هیچ یک از متغیرهای محدود شده در بندهای دیگر نباید در کد مورد استفاده قرار گیرد که ممکن است بلوک باشد.

در اینجا مثال قبلی که با بندهای دیگری تقویت شده است:

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

مقدار EXPR2 را به عنوان پیام به فرآیند مشخص شده توسط EXPR1 ارسال می کند. مقدار expr2 نیز مقدار بازده عبارت است.

EXPR1 باید یک PID ، نام مستعار (مرجع) ، یک درگاه ، یک نام ثبت شده (اتم) یا یک Tuple را ارزیابی کند. نام یک اتم است و گره یک نام گره است ، همچنین یک اتم است.

  • اگر EXPR1 به یک نام ارزیابی کند ، اما این نام ثبت نشده است ، یک خطای زمان اجرا Badarg رخ می دهد.
  • ارسال پیام به یک مرجع هرگز از بین نمی رود ، حتی اگر مرجع دیگر (یا هرگز نبود) نام مستعار نیست.
  • ارسال پیام به PID هرگز از بین نمی رود ، حتی اگر PID یک فرآیند غیر موجود را مشخص کند.
  • ارسال پیام توزیع شده ، یعنی اگر EXPR1 به یک Tuple (یا یک PID واقع در یک گره دیگر) ارزیابی کند ، همچنین هرگز از بین نمی رود.

پیام دریافت شده موجود در صف پیام روند را دریافت می کند. اولین پیام در صف پیام به طور متوالی در برابر الگوهای از بالا به پایین هماهنگ است. اگر هیچ مسابقه ای پیدا نشد ، دنباله تطبیق برای پیام دوم در صف و غیره تکرار می شود. پیام ها به ترتیب دریافت شده در صف قرار می گیرند. اگر یک مسابقه موفق شود ، یعنی اگر الگوی مطابقت داشته باشد و دنباله گارد اختیاری GuardSeq صحیح باشد ، پیام از صف پیام حذف می شود و بدن مربوطه ارزیابی می شود. تمام پیام های دیگر در صف پیام بدون تغییر باقی می مانند.

مقدار بازده بدن مقدار بازده عبارت دریافت است.

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

مثال:

بیان دریافت را می توان با یک زمان بندی افزوده کرد:

دریافت .. پس از انجام دقیقاً همانطور که دریافت می کند ، به جز این که اگر هیچ پیام تطبیق در میلی ثانیه در خارج از کشور وارد نشده باشد ، در عوض BodyT ارزیابی می شود. مقدار بازده BodyT سپس به مقدار بازده بیان دریافت می شود. EXPRT ارزیابی یک عدد صحیح یا بی نهایت اتم است. دامنه عدد صحیح مجاز از 0 تا 4294967295 است ، یعنی طولانی ترین زمان ممکن تقریباً 50 روز است. در صورت عدم وجود پیام تطبیق در صف پیام ، با یک مقدار صفر ، زمان وقفه بلافاصله اتفاق می افتد.

بی نهایت اتم باعث می شود که این روند به طور نامحدود برای یک پیام تطبیق انتظار داشته باشد. این همان استفاده از زمان بندی نیست. این می تواند برای مقادیر زمانی که در زمان اجرا محاسبه می شوند مفید باشد.

مثال:

استفاده از یک بیان دریافتی بدون شعبه قانونی است:

این ساخت و ساز هیچ پیامی را مصرف نمی کند ، فقط اجرای این روند را برای میلی ثانیه های exprt به حالت تعلیق در می آورد. این می تواند برای اجرای تایمرهای ساده استفاده شود.

مثال:

رفیق شرح
== مساوی با
/= برابر نیست با
= کمتر از یا برابر با
  کمتر از
>= بزرگتر یا مساوی با
> بزرگتر از
=:= دقیقاً برابر با
=/= دقیقاً برابر نیست

جدول 9. 1: اپراتورهای مقایسه مدت.

آرگومان ها می توانند از انواع مختلف داده باشند. سفارش زیر تعریف شده است:

NIL در عبارت قبلی لیست خالی ([]) را نشان می دهد ، که به عنوان یک نوع جداگانه از لیست/0 در نظر گرفته می شود. به همین دلیل صفر است

لیست ها توسط عنصر با عنصر مقایسه می شوند. تاپل ها با اندازه سفارش می شوند ، دو تاپل با اندازه یکسان با عنصر با عنصر مقایسه می شوند.

رشته های بیت بیت به صورت بیت مقایسه می شوند. اگر یک رشته بیت پیشوند دیگری باشد ، رشته بیت کوتاه تر کوچکتر در نظر گرفته می شود.

نقشه ها با اندازه سفارش داده می شوند ، دو نقشه با همان اندازه با کلیدها در ترتیب صعودی و سپس با مقادیر به ترتیب کلید مقایسه می شوند. در نقشه ها ، انواع عدد صحیح سفارشات کمتر از انواع Floats در نظر گرفته می شوند.

اتمها با استفاده از مقدار رشته خود ، CodePoint توسط CodePoint مقایسه می شوند.

هنگام مقایسه یک عدد صحیح با شناور ، اصطلاح با دقت کمتری به نوع اصطلاح دیگر تبدیل می شود ، مگر اینکه اپراتور یکی از =: = یا =/= باشد. یک شناور دقیق تر از یک عدد صحیح است تا زمانی که تمام چهره های مهم شناور در سمت چپ نقطه اعشاری قرار نگیرد. این اتفاق می افتد که شناور بزرگتر/کوچکتر از +/- 9007199254740992. 0 باشد. استراتژی تبدیل بسته به اندازه شناور تغییر می کند زیرا در غیر این صورت مقایسه شناورها و اعداد صحیح باعث انتقال آنها می شود.

اپراتورهای مقایسه مدت مقدار بولی عبارت ، درست یا نادرست را برمی گردانند.

مثال ها:

اپراتور شرح نوع استدلال
+ unary + عدد
- یگانه - عدد
+ عدد
- عدد
* عدد
/ بخش نقطه شناور عدد
بنگاه بیت از نظر حرفی نه عدد صحیح
قسمت تقسیم عدد صحیح عدد صحیح
رگ باقیمانده عدد صحیح x/y عدد صحیح
باند در جهت کمی و عدد صحیح
خم بیت در صورت یا عدد صحیح
بیزاری حسابی بیت به سمت xor عدد صحیح
BSL Bitshift حسابی سمت چپ عدد صحیح
BSR Bitshift درست عدد صحیح

جدول 9. 2: اپراتورهای حسابی.

مثال ها:

اپراتور شرح
نه منطقی نیست
وت منطقی و
or منطقی یا
زور XOR منطقی

جدول 9. 3: اپراتورهای منطقی.

مثال ها:

EXPR2 فقط در صورت لزوم ارزیابی می شود. یعنی expr2 فقط در صورت ارزیابی ارزیابی می شود:

EXPR1 در یک بیان Orelse به False ارزیابی می کند.

EXPR1 در یک بیان Andalso به True ارزیابی می کند.

مقدار expr1 (یعنی درست یا نادرست) یا مقدار expr2 (در صورت ارزیابی expr2) را برمی گرداند.

مثال 1:

این کار حتی اگر A کمتر ا ز-1. 0 باشد ، زیرا در این حالت ، ریاضی: SQRT/1 هرگز ارزیابی نمی شود.

مثال 2:

از Erlang/OTP R13a ، Expr2 دیگر نیازی به ارزیابی مقدار بولی نیست. به عنوان یک نتیجه ، Andalso و Orelse اکنون بازگرداندن دم هستند. به عنوان مثال ، عملکرد زیر در Erlang/OTP R13a و بعد از آن ، دمای دم است:

اپراتور Concatenation List ++ آرگومان دوم خود را به اولین خود اضافه می کند و لیست حاصل را برمی گرداند.

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

مثال:

ساخت نقشه جدید با اجازه دادن به یک عبارت k با عبارت دیگر V انجام می شود:

نقشه های جدید می توانند شامل چندین انجمن در ساخت و ساز با لیست هر انجمن باشند:

نقشه خالی با عدم ارتباط با هیچ شرایطی با یکدیگر ساخته می شود:

تمام کلیدها و مقادیر موجود در نقشه اصطلاحات هستند. هر عبارت ابتدا ارزیابی می شود و سپس اصطلاحات حاصل به ترتیب به عنوان کلید و ارزش استفاده می شود.

Keys and values are separated by the =>پیکان و انجمن ها توسط یک کاما از هم جدا می شوند.

مثال ها:

در اینجا ، A و B هرگونه عباراتی هستند و M0 از طریق M4 اصطلاحات نقشه حاصل است.

اگر دو کلید تطبیق اعلام شود ، کلید دوم مقدم است.

مثال:

نظمی که در آن عبارات ساخت کلیدها (و مقادیر مرتبط با آنها) ارزیابی می شوند تعریف نشده است. ترتیب نحوی جفت های ارزش کلیدی در ساخت و ساز هیچ ارتباطی ندارد ، مگر در مورد اخیراً ذکر شده از دو کلید تطبیق.

به روزرسانی نقشه نحو مشابه ساخت آن را دارد.

عبارتی که نقشه را به روز می کند ، در مقابل عبارتی که کلیدهای به روز شده و مقادیر مربوطه آنها را تعریف می کند قرار داده شده است:

در اینجا m یک اصطلاح از نوع نقشه است و k و v هر عبارتی هستند.

اگر Key K با هیچ کلید موجود در نقشه مطابقت ندارد ، یک انجمن جدید از Key K به Value V ایجاد می شود.

اگر کلید K با یک کلید موجود در نقشه m مطابقت داشته باشد ، مقدار مرتبط آن با مقدار جدید V جایگزین می شود. در هر دو مورد ، بیان نقشه ارزیابی شده نقشه جدیدی را برمی گرداند.

اگر M از نوع نقشه نباشد ، به استثنای نوع badmap پرتاب می شود.

برای به روزرسانی یک مقدار موجود ، از نحو زیر استفاده می شود:

در اینجا m یک اصطلاح از نوع نقشه است ، v یک عبارت است و k عبارتی است که به یک کلید موجود در m ارزیابی می کند.

اگر Key K با هیچ کلیدهای موجود در نقشه M مطابقت نداشته باشد ، استثناء نوع Badarg در زمان اجرا ایجاد می شود. اگر یک کلید تطبیق K در نقشه M وجود داشته باشد ، مقدار مرتبط آن با مقدار جدید V جایگزین می شود و بیان نقشه ارزیابی شده نقشه جدیدی را برمی گرداند.

اگر M از نوع نقشه نباشد ، به استثنای نوع badmap پرتاب می شود.

مثال ها:

در اینجا M0 هر نقشه است. از این رو نتیجه می گیرد که M1 .. M4 نیز نقشه ها هستند.

مثالهای بیشتر:

همانطور که در ساخت و ساز ، نظمی که در آن عبارات کلیدی و ارزش ارزیابی می شود تعریف نشده است. ترتیب نحوی جفت های ارزش کلیدی در بروزرسانی هیچ ارتباطی ندارد ، مگر در مواردی که دو کلید مطابقت دارد. در این حالت از مقدار دوم استفاده می شود.

تطبیق انجمن های ارزش کلیدی از نقشه ها به شرح زیر است:

در اینجا m هر نقشه است. کلید k باید یک عبارت نگهبان باشد ، با تمام متغیرها که قبلاً محدود شده اند. v می تواند هر الگویی با متغیرهای محدود یا بی حد و حصر باشد.

اگر متغیر V بدون مرز باشد ، به مقدار مرتبط با کلید K محدود می شود ، که باید در نقشه m وجود داشته باشد. اگر متغیر V محدود باشد ، باید با مقدار مرتبط با K در m مطابقت داشته باشد.

قبل از OTP 23 ، عبارت تعریف شده کلید K محدود به یک متغیر واحد یا یک تحت اللفظی بود.

مثال:

این متغیر B را به عدد صحیح 2 متصل می کند.

به همین ترتیب ، مقادیر متعدد از نقشه می توانند همسان شوند:

در اینجا کلیدهای K1 .. KN هر عباراتی با معنای واقعی کلمه یا متغیرهای محدود است. اگر همه عبارات کلیدی با موفقیت ارزیابی شوند و تمام کلیدها در نقشه M وجود داشته باشند ، تمام متغیرهای موجود در V1 .. VN با مقادیر مرتبط کلیدهای مربوطه مطابقت دارد.

اگر شرایط تطبیق برآورده نشود ، مسابقه نیز با:

یک استثناء Badmatch.

این در صورتی است که در زمینه اپراتور مسابقه مانند مثال استفاده می شود.

یا در نتیجه بند بعدی در سرهای عملکردی و عبارات مورد آزمایش می شود.

تطبیق در نقشه ها فقط امکان پذیر است: = به عنوان تعیین کننده انجمن ها.

ترتیب اعلام کلیدها در تطبیق هیچ ارتباطی ندارد.

کلیدهای تکراری در تطبیق مجاز هستند و هر الگوی مرتبط با کلیدها را مطابقت می دهند:

مطابقت با بیان در برابر یک نقشه خالی ، با نوع خود مطابقت دارد اما هیچ متغیرهایی محدود نیست:

این عبارت اگر بیان EXPR از نوع نقشه باشد ، مطابقت دارد ، در غیر این صورت با یک بدبک استثناء شکست می خورد.

در اینجا کلید مورد بازیابی از یک عبارت ساخته شده است:

لیست باید یک متغیر از قبل محدود باشد.

نحو تطبیق

تطبیق تحت اللفظی به عنوان کلیدها در سرهای عملکردی مجاز است:

نقشه ها در نگهبانان مجاز هستند تا زمانی که همه زیرزمین ها عبارات نگهبان معتبر باشند.

Guard BIFS زیر نقشه ها را کنترل می کند:

  • is_map/1 در ماژول ارلانگ
  • is_map_key/2 در ماژول erlang
  • MAP_GET/2 در ماژول Erlang
  • MAP_SIZE/1 در ماژول Erlang

هر عنصر EI بخشی از رشته بیت را مشخص می کند. هر عنصر EI یک مقدار است و به دنبال آن یک عبارت اندازه اختیاری و یک لیست مشخص کننده از نوع اختیاری است.

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

مورد استفاده در تطبیق رشته ، مقدار باید یک متغیر یا عدد صحیح ، شناور یا رشته باشد.

Notice that, for example, using a string literal as in> is syntactic sugar for> .

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

اندازه در تطبیق رشته ای مورد استفاده قرار می گیرد ، اندازه باید یک عبارت نگهبان باشد که به یک عدد صحیح ارزیابی می کند. تمام متغیرهای موجود در بیان گارد باید از قبل محدود شوند.

قبل از OTP 23 ، اندازه محدود به یک عدد صحیح یا متغیر محدود به یک عدد صحیح بود.

مقدار اندازه اندازه بخش در واحدها را مشخص می کند (به تصویر زیر مراجعه کنید). مقدار پیش فرض به نوع بستگی دارد (به تصویر زیر مراجعه کنید):

  • برای عدد صحیح 8 است.
  • برای شناور 64 است.
  • برای باینری و بیتسترینگ کل رشته باینری یا بیت است.

در تطبیق ، این مقدار پیش فرض فقط برای آخرین عنصر معتبر است. تمام عناصر بیت یا باینری دیگر در تطبیق باید مشخصات اندازه داشته باشند.

برای انواع UTF8 ، UTF16 و UTF32 ، اندازه نباید داده شود. اندازه بخش به طور ضمنی توسط نوع و ارزش خود تعیین می شود.

typespecifierlist لیستی از انواع خاص است ، به هر ترتیب ، توسط hyphens از هم جدا شده است (-). مقادیر پیش فرض برای هر نوع خاص از نوع حذف شده استفاده می شود.

نوع = عدد صحیح |شناور |باینری |بایت |bitstring |بیت |UTF8 |UTF16 |UTF32 پیش فرض عدد صحیح است. بایت برای باینری یک کوتاه است و بیت ها یک کوتاه برای بیت استرینگ است. برای اطلاعات بیشتر در مورد انواع UTF به زیر مراجعه کنید. امضاء = امضا شده |بدون امضا فقط برای تطبیق و هنگامی که نوع عدد صحیح است ، اهمیت دارد. پیش فرض بدون امضا است. endiaess = بزرگ |کوچک |بومی بومی-اندین به این معنی است که بسته به آنچه که برای CPU که دستگاه Erlang روی آن اجرا می شود ، در زمان بار یا کمین بزرگ یا کم اندکی حل می شود. Endiaess فقط زمانی مهم است که نوع یا عدد صحیح ، UTF16 ، UTF32 یا شناور باشد. پیش فرض بزرگ است. واحد = واحد: Integerliteral محدوده مجاز 1.. 256 است. پیش فرض به 1 برای عدد صحیح ، شناور و بیتسترینگ و 8 برای باینری. برای انواع UTF8 ، UTF16 و UTF32 نباید مشخصات واحد ارائه شود.

مقدار اندازه ضرب شده با واحد تعداد بیت ها را نشان می دهد. بخشی از باینری از نوع باید اندازه ای داشته باشد که به طور مساوی توسط 8 قابل تقسیم باشد. برای بخشی از نوع شناور اندازه باید 64 ، 32 یا 16 باشد.

هنگام ساخت باینری ها ، اگر اندازه n یک قطعه عدد صحیح برای حاوی عدد صحیح داده شده بسیار کوچک باشد ، مهمترین بیت های عدد صحیح به صورت سکوت دور ریخته می شوند و فقط حداقل بیت های قابل توجه در باینری قرار می گیرند.

انواع UTF8 ، UTF16 و UTF32 به ترتیب رمزگذاری/رمزگشایی فرمت تحول یونیکد S UTF-8 ، UTF-16 و UTF-32 را مشخص می کند.

هنگام ساخت بخشی از نوع UTF ، مقدار باید یک عدد صحیح در محدوده 0.. 16#D7FF یا 16#E000 باشد. 16#10ffff. اگر ارزش خارج از محدوده مجاز باشد ، ساخت و ساز با استثناء بدارگ شکست می خورد. اندازه بخش باینری حاصل به نوع یا مقدار یا هر دو بستگی دارد:

  • برای UTF8 ، مقدار در 1-4 بایت رمزگذاری می شود.
  • برای UTF16 ، مقدار در 2 یا 4 بایت رمزگذاری می شود.
  • برای UTF32 ، ارزش همیشه در 4 بایت رمزگذاری می شود.

When constructing, a literal string can be given followed by one of the UTF types, for example:> which is syntactic sugar for> .

یک مسابقه موفق از یک بخش از یک نوع UTF ، منجر به یک عدد صحیح در محدوده 0.. 16#D7FF یا 16 می شود#E000..16#10ffffاگر مقدار برگشتی در خارج از آن محدوده قرار بگیرد ، مسابقه شکست می خورد.

بخشی از نوع UTF8 با 1-4 بایت در باینری مطابقت دارد ، اگر باینری در موقعیت مسابقه حاوی یک دنباله معتبر UTF-8 باشد.(به RFC-3629 یا استاندارد یونیکد مراجعه کنید.)

بخشی از نوع UTF16 می تواند با 2 یا 4 بایت در باینری مطابقت داشته باشد. اگر باینری در موقعیت مسابقه حاوی رمزگذاری حقوقی UTF-16 از یک نقطه کد یونیکد نباشد ، مسابقه شکست می خورد.(به RFC-2781 یا استاندارد یونیکد مراجعه کنید.)

بخشی از نوع UTF32 می تواند 4 بایت را به صورت باینری به همان روش با یک قطعه عدد صحیح با 32 بیت مطابقت دهد. اگر عدد صحیح حاصل خارج از محدوده حقوقی ذکر شده در بالا باشد ، این مسابقه شکست می خورد.

مثال ها:

توجه کنید که الگوهای رشته بیت قابل توخالی نیست.

Notice also that " B=>"به عنوان" b = تعبیر می شود "<> " which is a syntax error. The correct way is to write a space after '=': " B => .

نمونه های بیشتری در نمونه های برنامه نویسی ارائه شده است.

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

متغیرهای موجود در یک سر سرگرم کننده نام عملکرد و هر دو متغیر سایه در بند عملکرد پیرامون بیان سرگرم کننده. متغیرهای محدود در بدن سرگرم کننده از بدن سرگرم کننده محلی هستند.

مقدار بازده عبارت سرگرمی حاصل است.

مثال ها:

عبارات سرگرم کننده زیر نیز مجاز است:

به نام/arity ، نام یک اتم است و arity یک عدد صحیح است. Name/Arity باید یک عملکرد محلی موجود را مشخص کند. این بیان قند نحوی برای:

در ماژول: Name/Arity ، Module و Name Atoms هستند و Arity یک عدد صحیح است. با شروع از Erlang/OTP R15 ، ماژول ، نام و arity نیز می تواند متغیرهایی باشد. یک سرگرمی که از این طریق تعریف شده است به نام عملکرد با Arity Arity در آخرین نسخه ماژول ماژول اشاره دارد. یک سرگرمی که از این طریق تعریف شده است به کد ماژول ای که در آن تعریف شده است بستگی ندارد.

نمونه های بیشتری در نمونه های برنامه نویسی ارائه شده است.

ارزش EXPR را برمی گرداند مگر اینکه یک استثنا در طول ارزیابی رخ دهد. در این حالت ، استثناء گرفتار می شود.

For exceptions of class error , that is, run-time errors,>برگردانده شده است

به استثناء خروج کلاس ، یعنی کدی به نام خروج (مدت) بازگردانده می شود.

به استثناء پرتاب کلاس ، این کد به نام پرتاب (اصطلاح) است ، اصطلاح بازگردانده می شود.

دلیل به نوع خطایی که رخ داده است بستگی دارد و پشته پشته تماس های عملکردی اخیر است ، به دلایل خروج مراجعه کنید.

مثال ها:

پرتاب BIF (هر) می تواند برای بازگشت غیر محلی از یک عملکرد استفاده شود. باید در یک صید ارزیابی شود ، که مقدار آن را برمی گرداند.

مثال:

اگر پرتاب/1 در یک گرفتن ارزیابی نشود ، یک خطای زمان اجرا Nocatch رخ می دهد.

این تقویت صید است. این امکان را فراهم می کند:

  • بین کلاسهای استثنائی مختلف تمایز قائل شوید.
  • انتخاب فقط موارد مورد نظر را انتخاب کنید.
  • عبور دیگران به یک محاصره کننده امتحان یا گرفتن یا به پیش فرض خطای.

توجه کنید که اگرچه گرفتن کلمه کلیدی در بیان امتحان استفاده می شود ، اما در بیان امتحان یک بیان صید وجود ندارد.

این مقدار exprs (دنباله ای از عبارات expr1 ، exp) را برمی گرداند ، مگر اینکه یک استثنا در طول ارزیابی رخ دهد. در این حالت ، استثناء گرفتار شده و الگوهای استثناء با کلاس استثناء صحیح به طور متوالی در برابر استثناء صید مطابقت دارند. اگر یک مسابقه موفق شود و استثناء دنباله گارد اختیاری استثناء است.

StackTrace ، در صورت مشخص شدن ، باید نام یک متغیر باشد (نه یک الگوی). ردیابی پشته هنگامی که مطابقت با استثناء مربوطه به متغیر محدود می شود.

اگر یک استثنا در هنگام ارزیابی EXPR ها اتفاق بیفتد اما هیچ استثنائی از کلاس مناسب با دنباله نگهبان واقعی وجود ندارد ، این استثناء به گونه ای منتقل می شود که گویی Exprs در یک عبارت آزمایشی محصور نشده است.

اگر یک استثنا در هنگام ارزیابی استثناء رخ دهد ، گرفتار نمی شود.

مجاز به حذف کلاس و stacktrace است. یک کلاس حذف شده برای پرتاب کوتاه است:

بیان امتحان می تواند یک بخش را داشته باشد:

اگر ارزیابی EXPR ها بدون استثناء موفق شوند ، الگوی الگوها به طور متوالی در برابر نتیجه به همان روشی که برای یک بیان موردی مطابقت دارد ، مطابقت دارد ، به جز اینکه اگر تطبیق شکست بخورد ، یک خطای زمان اجرا try_clause به جای یک case_clause رخ می دهد.

فقط استثنائاتی که در طول ارزیابی EXPR ها رخ می دهد می تواند توسط بخش صید صید شود. استثنائاتی که در بدن رخ می دهد یا به دلیل یک مسابقه شکست خورده گرفتار نمی شوند.

بیان امتحان همچنین می تواند با یک بخش After ، که در نظر گرفته می شود برای پاکسازی با عوارض جانبی مورد استفاده قرار گیرد ، افزوده شود:

پس از آن پس از هر بدن یا استثناء ارزیابی می شود ، مهم نیست که کدام یک باشد. ارزش ارزیابی شده پس از آن از بین می رود. مقدار بازده بیان امتحان با یک بخش بعد از آن یکسان است.

حتی اگر یک استثنا در هنگام ارزیابی بدن یا استثناء رخ دهد ، پس از آن ارزیابی می شود. در این حالت ، استثناء پس از ارزیابی پس از ارزیابی پس از آن ، منتقل می شود ، بنابراین استثناء از بیان امتحان با یک بخش پس از آن بدون آن یکسان است.

اگر یک استثنا در هنگام ارزیابی خود پس از بدن رخ دهد ، گرفتار نمی شود. بنابراین اگر بعد از یک استثناء در Exprs ، Body یا Steepture ارزیابی شود ، این استثناء از بین می رود و به استثناء در Afterbody از بین می رود.

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

بعدی نمونه ای از استفاده از بعد است. این پرونده را حتی در صورت استثنائات در پرونده بسته می کند: خواندن/2 یا باینری_TO_TERM/1. استثنائات همانند بدون امتحان است. بعد از . بیان پایان:

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

برچسب : نویسنده : عبدالله بوتیمار بازدید : <-PostHit-> تاريخ : يکشنبه 11 تير 1402 ساعت: 17:10