پسوندهای تطبیق الگو برای سی شارپ بسیاری از مزایای انواع داده های جبری و تطبیق الگوی زبان های کاربردی را امکان پذیر می کند، اما به گونه ای که به راحتی با احساس زبان اصلی ادغام می شود. عناصر این رویکرد از ویژگی های مرتبط در زبان های برنامه نویسی F# و Scala الهام گرفته شده است.
طراحی دقیق و با جزییات
بیان است
عملگر is برای آزمایش یک عبارت در برابر یک الگو گسترش می یابد.
این شکل از relation_expression علاوه بر فرم های موجود در مشخصات C# است. اگر relational_expression در سمت چپ token is مقداری را مشخص نکند یا نوع نداشته باشد، یک خطای زمان کامپایل است.
هر شناسه الگو یک متغیر محلی جدید را معرفی می کند که قطعاً پس از درست بودن عملگر is اختصاص داده می شود (یعنی قطعاً زمانی که درست است اختصاص داده می شود).
توجه: از نظر فنی بین نوع is-expression و regular_patte یک ابهام وجود دارد که هر کدام ممکن است تجزیه معتبر یک شناسه واجد شرایط باشد. ما سعی می کنیم آن را به عنوان یک نوع برای سازگاری با نسخه های قبلی زبان پیوند دهیم. فقط در صورتی که شکست بخورد، آن را همانطور که یک عبارت در زمینه های دیگر انجام می دهیم، به اولین چیزی که یافت می شود (که باید ثابت یا نوع باشد) حل می کنیم. این ابهام فقط در سمت راست عبارت is وجود دارد.
الگوها
الگوها در عملگر is_patte، در یک switch_statement، و در یک switch_expression برای بیان شکل داده هایی که داده های ورودی (که ما آن را مقدار ورودی می نامیم) با آن مقایسه می شوند، استفاده می شوند. الگوها ممکن است بازگشتی باشند به طوری که بخش هایی از داده ها ممکن است با الگوهای فرعی مطابقت داده شوند.
الگوی اعلامیه
declaration_patte هم آزمایش می کند که یک عبارت از نوع خاصی است و هم در صورت موفقیت آمیز بودن آن، آن را به آن نوع می فرستد. این ممکن است یک متغیر محلی از نوع معین را معرفی کند که توسط شناسه داده شده نامگذاری شده است، اگر نامگذاری یک متغیر_تغییر_تعیین باشد. زمانی که نتیجه عملیات تطبیق الگو درست باشد، آن متغیر محلی قطعاً اختصاص داده می شود.
معنای زمان اجرا این عبارت این است که نوع زمان اجرا عملوند relational_expression سمت چپ را در برابر نوع موجود در الگو آزمایش می کند. اگر از آن نوع زمان اجرا (یا یک نوع فرعی) باشد و null نباشد، نتیجه عملگر is درست است.
ترکیبی خاص از نوع استاتیک سمت چپ و نوع داده شده ناسازگار در نظر گرفته می شود و منجر به خطای زمان کامپایل می شود. در صورت وجود تبدیل هویت ، تبدیل مرجع ضمنی ، تبدیل بوکس ، تبدیل مرجع صریح ، یا تبدیل بدون جعبه از E به T ، یا یک تبدیل بدون جعبه از E به T یا یک تبدیل بدون جعبه از E ، یا یک تبدیل بدون جعبه از E به T ، یا یک تبدیل بدون بوکس از E به T ، یا اگر یکی از آنها باشد ، با یک نوع t سازگار است. از این نوع نوع باز است. این یک خطای کامپایل در زمان است اگر ورودی از نوع E با نوع در یک الگوی نوع که با آن مطابقت دارد سازگار نیست.
الگوی نوع برای انجام تست های نوع اجرا از انواع مرجع مفید است و اصطلاحات را جایگزین می کند
با کمی مختصر تر
اگر نوع یک نوع مقدار قابل برگشت باشد ، خطایی است.
از الگوی نوع می توان برای آزمایش مقادیر انواع قابل تهی استفاده کرد: مقدار از نوع قابل تهی (یا یک جعبه جعبه) اگر مقدار غیر تهی باشد و نوع T2 باشد ، یا نوع پایه یا نوع پایه یا نوع پایه یا نوع پایه یا نوع پایه یا نوع پایه یا نوع پایه یا نوع پایه را با یک الگوی T2 مطابقت می دهد. رابط t. به عنوان مثال ، در قطعه کد
شرط بیانیه IF در زمان اجرا صحیح است و متغیر V مقدار 3 نوع INT را در داخل بلوک نگه می دارد. پس از بلوک ، متغیر V در دامنه است اما قطعاً اختصاص نیافته است.
الگوی ثابت
یک الگوی ثابت مقدار یک عبارت را در برابر یک مقدار ثابت آزمایش می کند. ثابت ممکن است هر بیان ثابت مانند یک تحت اللفظی ، نام یک متغیر const اعلام شده یا ثابت شمارش باشد. هنگامی که مقدار ورودی یک نوع باز نیست ، بیان ثابت به طور ضمنی به نوع بیان همسان تبدیل می شود. اگر نوع مقدار ورودی با نوع بیان ثابت سازگار نباشد ، عملکرد تطبیق الگوی یک خطا است.
الگوی C مطابق با مقدار ورودی تبدیل شده در نظر گرفته می شود.
ما انتظار داریم که E NULL به عنوان رایج ترین روش برای تست NULL در کد تازه نوشته شده باشد ، زیرا نمی تواند از یک اپراتور تعریف شده توسط کاربر استفاده کند ==.
الگوی وار
اگر نامگذاری یک simple_designation باشد ، یک عبارت E با الگوی مطابقت دارد. به عبارت دیگر ، یک مسابقه با یک الگوی VAR همیشه با یک simple_designation موفق می شود. اگر Simple_designation یک واحد_دوناسیون _designation باشد ، مقدار E محدودیت به یک متغیر محلی تازه معرفی شده است. نوع متغیر محلی نوع استاتیک e است.
اگر نامگذاری یک tuple_designation باشد ، این الگوی معادل یک position_patte از فرم (تعیین var ،) است که در آن نامگذاری مواردی است که در tuple_designation یافت می شود. به عنوان مثال ، الگوی var (x ، (y ، z)) معادل (var x ، (var y ، var z)) است.
اگر نام VAR به یک نوع متصل شود ، خطایی است.
الگوی
یک عبارت E با الگوی _ همیشه مطابقت دارد. به عبارت دیگر ، هر بیان با الگوی دور انداختن مطابقت دارد.
یک الگوی دور انداختن ممکن است به عنوان الگوی IS_PATTERN_EXPRESSION استفاده نشود.
الگوی موقعیت
یک الگوی مثبت بررسی می کند که مقدار ورودی تهی نیست ، از یک روش ساختارشکنی مناسب استفاده می کند و تطبیق الگوی بیشتر را بر روی مقادیر حاصل انجام می دهد. همچنین از یک الگوی شبیه به Tuple مانند (بدون نوع ارائه شده) پشتیبانی می کند وقتی که نوع مقدار ورودی همان نوع حاوی ساختارشکنی است ، یا اگر نوع مقدار ورودی یک نوع Tuple باشد ، یا اگر نوع آن باشدمقدار ورودی Object یا ItUple است و نوع زمان اجرا عبارت ITUPLE را پیاده سازی می کند.
اگر نوع حذف شود ، ما آن را به عنوان نوع استاتیک مقدار ورودی می گیریم.
با توجه به تطابق مقدار ورودی با نوع الگوی (subpatte_list) ، روشی با جستجوی نوع برای اعلامیه های قابل دسترسی از ساختارشکنی و انتخاب یکی از آنها با استفاده از همان قوانینی که برای اعلام ساختارشکنی انتخاب می شود ، انتخاب می شود.
این یک خطا است اگر یک نوع position_patte نوع را از بین ببرد ، دارای یک زیرمجموعه واحد بدون شناسه باشد ، هیچ ویژگی ای ندارد. این اختلاف بین یک ثابت_پترن که پرانتز است و یک موقعیت_پترن است.
به منظور استخراج مقادیر در برابر الگوهای موجود در لیست ،
- اگر نوع حذف شده و نوع مقدار ورودی یک نوع Tuple است ، تعداد زیرگروه ها لازم است که همان کاردینال بودن Tuple باشد. هر عنصر Tuple در برابر زیرپرات های مربوطه مطابقت دارد و اگر همه اینها موفق شوند ، مسابقه موفق می شود. اگر هر یک از Subpatte دارای شناسه ای باشد ، باید یک عنصر Tuple را در موقعیت مربوطه در نوع Tuple قرار دهد.
- در غیر این صورت ، اگر یک ساختارشکنی مناسب به عنوان عضو نوع وجود داشته باشد ، اگر نوع مقدار ورودی با نوع سازگار با الگوی باشد ، یک خطای زمان کامپایل است. در زمان اجرا ، مقدار ورودی در برابر نوع آزمایش می شود. اگر این کار شکست بخورد ، مطابقت الگوی موقعیتی از بین می رود. در صورت موفقیت ، مقدار ورودی به این نوع تبدیل می شود و ساختارشکنی با متغیرهای تولید کننده تازه برای دریافت پارامترهای OUT فراخوانی می شود. هر مقداری که دریافت شده است در برابر زیرگروه مربوطه مطابقت دارد و اگر همه اینها موفق شوند ، مسابقه موفق می شود. اگر هر یک از Subpatte دارای یک شناسه باشد ، باید یک پارامتر را در موقعیت مربوط به ساختار ساختار نامگذاری کند.
- در غیر این صورت اگر نوع حذف شده باشد ، و مقدار ورودی از نوع شیء یا ITUPLE یا نوعی است که می تواند با تبدیل مرجع ضمنی به ItuPle تبدیل شود ، و هیچ شناسه ای در بین زیرمجموعه ها ظاهر نمی شود ، پس ما با استفاده از ITUPLE مطابقت داریم.
- در غیر این صورت الگوی یک خطای زمان کامپایل است.
نظمی که در آن زیرگروه ها در زمان اجرا مطابقت دارند ، نامشخص است ، و یک مسابقه شکست خورده ممکن است سعی در مطابقت با همه زیرمجموعه ها نداشته باشد.
مثال
این مثال از بسیاری از ویژگی های شرح داده شده در این مشخصات استفاده می کند
الگوی خاص
یک الگوی خاصیت بررسی می کند که مقدار ورودی تهی نیست و به صورت بازگشتی با مقادیر استخراج شده با استفاده از خصوصیات یا زمینه های قابل دسترسی مطابقت دارد.
این یک خطا است اگر هر یک از زیرمجموعه های یک Propert_patte حاوی شناسه نباشد (باید از فرم دوم باشد ، که دارای شناسه ای است). کاما دنباله دار پس از آخرین زیرمجموعه اختیاری است.
توجه داشته باشید که یک الگوی بررسی تهی از یک الگوی خاصیت بی اهمیت خارج می شود. برای بررسی اینکه رشته S غیر تهی است ، می توانید هر یک از فرم های زیر را بنویسید
با توجه به تطبیق یک عبارت E با نوع الگویاگر عبارت E با نوع T تعیین شده توسط نوع سازگار نباشد ، این یک خطای زمان کامپایل است. اگر نوع وجود ندارد ، ما آن را به عنوان نوع استاتیک E می گیریم. اگر شناسه موجود باشد ، متغیر الگوی نوع را اعلام می کند. هر یک از شناسه های ظاهر شده در سمت چپ Property_Patte_List باید یک خاصیت قابل دسترسی یا زمینه T را تعیین کنند. اگر Simple_designation از Propert_patte موجود باشد ، یک متغیر الگوی نوع t را تعریف می کند.
در زمان اجرا ، این عبارت در برابر t آزمایش می شود. اگر این کار شکست بخورد ، مطابقت با الگوی خاصیت از بین می رود و نتیجه آن نادرست است. اگر موفق شود ، هر قسمت از ویژگی ها یا ویژگی های Propert_subpatte خوانده می شود و مقدار آن در برابر الگوی مربوطه مطابقت دارد. نتیجه کل مسابقه فقط در صورتی نادرست است که نتیجه هر یک از این موارد نادرست باشد. ترتیب تطبیق زیرمجموعه ها مشخص نشده است ، و یک مسابقه شکست خورده ممکن است با همه زیرگروه ها در زمان اجرا مطابقت نداشته باشد. اگر مسابقه موفق شود و Simple_designation of Propert_patte یک chone_varable_designation باشد ، متغیر نوع T را تعریف می کند که مقدار همسان را اختصاص می دهد.
توجه: از الگوی خاصیت می توان برای تطبیق با انواع ناشناس استفاده کرد.
مثال
بیان سوئیچ
یک سوئیچ_ اظهارات برای پشتیبانی از معناشناسی مانند سوئیچ برای یک زمینه بیان اضافه می شود.
نحو زبان C# با تولیدات نحوی زیر افزایش می یابد:
Switch_Expression به عنوان یک بیان_ستاسیون مجاز نیست.
ما به دنبال آرامش این موضوع در یک تجدید نظر در آینده هستیم.
The type of the switch_expression is the best common type (§11.6.3.15) of the expressions appearing to the right of the =>اگر چنین نوع وجود داشته باشد و بیان در هر بازوی بیان سوئیچ به طور ضمنی به آن نوع تبدیل شود. علاوه بر این ، ما یک تبدیل بیان سوئیچ جدید اضافه می کنیم ، که یک تبدیل ضمنی از پیش تعریف شده از بیان سوئیچ به هر نوع T است که برای آن یک تبدیل ضمنی از بیان هر بازو به t وجود دارد.
این یک خطا است اگر برخی از الگوی switch_expression_arm نتوانند نتیجه را تحت تأثیر قرار دهند زیرا برخی از الگوی قبلی و نگهبان همیشه مطابقت دارند.
گفته می شود اگر برخی از بازوهای بیان سوئیچ هر مقدار از ورودی خود را کنترل کند ، بیان سوئیچ جامع است. در صورت عدم بیان سوئیچ ، کامپایلر باید هشدار دهنده تولید کند.
در زمان اجرا ، نتیجه SWITCH_EXPRESSION مقدار بیان اولین switch_expression_arm است که برای آن عبارت در سمت چپ سوئیچ_ اظهارات مطابق با الگوی switch_expression_arm است ، و در صورت وجود مورد case_guard از switch_expression_arm.، ارزیابی را به درست ارزیابی می کند. اگر چنین switch_expression_arm وجود نداشته باشد ، Switch_Expression نمونه ای از استثناء System. runtime.compilerservice. switchExpressionException را پرتاب می کند.
پارنزهای اختیاری هنگام روشن کردن یک لفظی Tuple
به منظور روشن کردن یک لفظی Tuple با استفاده از Switch_Statement ، باید آنچه را که به نظر می رسد parens زائد است بنویسید
پرانتز عبارت سوئیچ اختیاری است وقتی که عبارت روشن است ، یک لفظی Tuple است.
ترتیب ارزیابی در تطبیق الگوی
ارائه انعطاف پذیری کامپایلر در تنظیم مجدد عملیات انجام شده در حین تطبیق الگوی می تواند انعطاف پذیری را فراهم کند که می تواند برای بهبود کارآیی تطبیق الگوی استفاده شود. نیاز (غیر اجباری) این است که خواصی که به یک الگوی دسترسی پیدا می کنند ، و روش های ساختارشکنی لازم است "خالص" باشد (عاری از عوارض جانبی ، idempotent و غیره). این بدان معنا نیست که ما به عنوان یک مفهوم زبان خلوص می کنیم ، فقط این که ما به انعطاف پذیری کامپایلر در تنظیم مجدد عملیات اجازه می دهیم.
وضوح 2018-04-04 LDM: تأیید شده: کامپایلر مجاز است تماسهای برای ساختارشکنی ، دسترسی به املاک و دعوت از روشهای موجود در ITUPLE را مرتب کند و ممکن است فرض کند که مقادیر برگشتی از چندین تماس یکسان است. کامپایلر نباید توابع را که نمی تواند بر نتیجه تأثیر بگذارد ، فراخوانی کند و ما قبل از ایجاد هرگونه تغییر در ترتیب ارزیابی کامپایلر در آینده بسیار مراقب خواهیم بود.
برخی بهینه سازی های احتمالی
تطبیق تطبیق الگوی می تواند از قسمت های مشترک الگوهای استفاده کند. به عنوان مثال ، اگر آزمون نوع سطح بالا از دو الگوی پی در پی در یک سوئیچ_ستاتم همان نوع باشد ، کد تولید شده می تواند از آزمون نوع برای الگوی دوم استفاده کند.
هنگامی که برخی از الگوهای عدد صحیح یا رشته ها هستند ، کامپایلر می تواند همان نوع کدی را که برای یک سوئیچ در نسخه های قبلی زبان ایجاد می کند ، تولید کند.
استراتژی های مؤثر فارکس...
ما را در سایت استراتژی های مؤثر فارکس دنبال می کنید
برچسب :
نویسنده : توران میرهادی
بازدید : <-PostHit->
تاريخ : چهارشنبه
31 خرداد
1402 ساعت: 15:13