Payamvdn/NorthPersian_fa_wiki huggingface dataset:
Charm یک زبان برنامه نویسی کامپیوتری است که در اوایل ۱۹۹۰ ابداع شده است و شباهت هایی به زبان های RTL/2، Pascal و C دارد و علاوه بر آن ویژگی های منحصر به فرد خود را نیز دارد. زبان Charm توسط یک دستور زبان مستقل از متن تعریف می شود که می تواند توسط تجزیه کننده کاهشی بازگشتی پردازش شود، همانطوری که در کتاب های اصلی طراحی کامپایلر توضیح داده شده است. مجموعه ای از ابزارهای Charm شامل یک کامپایلر، اسمبلر و پیوند دهنده برای پلتفرم سیستم عامل Acorns's RISC در دسترس قرار گرفت. جذابیت بازسازی شده برای پلتفرم های سیستم عامل RISC متعاقباً در مجله Archive بررسی شد. زبان برنامه نویسی Charm بیش تر در کتاب الکترونیکی Programming in Charm on the Raspberry Pi توضیح داده شده است. گرامر. تعریف دستور زبان Charm در ساختار Backus-Naur به همراه نمونه های توصیفی از ساختارهای Charm در صفحه زبان Charm تعریف شده است. زبان دارای ساختار بلاکی است و هر بلاک با یک کلمه کلیدی زبان معرفی می شود که توصیفی از اعمال انجام شده در بلاک است، به عنوان نمونه.for ,while ,repeat (تکرار)،case ,if (انتخاب). هر بلاک توسط جداکننده های "{" و "}" محصور شده ا
ست. علاوه بر این، خطوط زبان در یک بلاک معمولاً برای وضوح، دارای تو رفتگی هستند، اگرچه این مورد نیاز نیست زیرا فضای خالی (space) نادیده گرفته می شود. هر متن منطبق با گرامری، مجموعه ای از کدهای اجرایی و داده های مرتبط را نشان می دهد که می تواند توسط مجموعه ابزار Charm به عنوان مولفه ای هنگام تولید یک برنامه، که می تواند تحت یک سیستم عامل اجرا شود و از خدماتی که برای انجام کارهای مفیدی مانند پردازش داده ها یا تعامل با کاربران از طریق رابط کاربری گرافیکی (GUI) ارائه می دهد، استفاده کند. انواع داده ها. Charm یک زبان با تایپ قوی است، اما برخی از تبدیل های ضمنی بین انواع عددی و ممیز شناور را امکان پذیر می کند. انواع متغیرهای اساسی زیر پشتیبانی می شوند: int – اعداد صحیح char –کاراکترها boolean – مقادیر بولین (صحیح و غلط) real – اعداد ممیز شناور انبوه های داده از همان نوع ممکن است با استفاده از عبارت اعلام شده و به صورت استاتیکی به کمک کلمه کلیدی array مقدار دهی اولیه شوند و حتی ممکن است چند بعدی باشند. انواع مختلف ممکن است با استفاده از کلمه کلیدی record اعلان شوند و برای چنین اعلانی مجاز است که یک union از فیلدهای r
ecord را تعریف کند که از نظر تخصیص ذخیره سازی روی یکدیگر قرار دارند. ماژول ها همچنین ممکن است ترکیبی از اعضای داده ایستا و پویا را جمع آوری کنند. نمونه هایی از رکوردها و ماژول ها (فقط محتوای پویا) می توانند در پشته یا روی هرم از طریقnew operator مقداردهی اولیه شوند. ماژول ها همچنین ممکن است یک تابع سازنده (constructor) را تعریف کنند (~new برای مقداردهی اولیه داده های پویا و متناظر ~delete deconstructor برای انتشار منابع به روشی مشابه زبان C++). ارجاع دادن. داده ها یا رویه های موجود در محدوده یک ماژول ممکن است در اپلیکیشن نهایی global باشند که این امر به کمک کلمه کلیدی export انجام پذیر است. اگر یک ماژول بخواهد از یک رویه یا داده از ماژول دیگر Charm ارجاع شود، این کار را با استفاده از کلمه کلیدی import صورت می گیرد. ماژول ها ممکن است حاوی متغیرهای عضو مبتنی بر نمونه باشند که از طریق رویه های اعلام شده با آن قابل دسترسی هستند که در این صورت با کلمه کلیدی dynamic از طریق پارامتر اول ضمنی اشاره گر this مشخص می شوند. ارجاع به ساختارها و رویه های داده، ممکن است با استفاده ازکلمه کلیدی ref صورت گیرد. اینها را می توا
ن با استفاده ازکلمه کلیدی val غیر ارجاع شوند. هنگام استفاده از متغیرهای مرجع، عملگرهای مقایسه در دسترس هستند تا بررسی کنند که آیا دو متغیر مرجع به یک مورد از داده ها اشاره دارند یا خیر (:=:) یا اینکه اصلاً داده هایی که به آن اشاره می کنند یکسان است (=). مثال برنامه کلاسیک اورجینال Hello world ای که در Charm نوشته شده باشد عبارت است از: ext proc write_string (ref array char); module hello; ent proc start (); write_string ("Hello world"); end_proc; end_module; و آخرین نسخه معادل به دنبال تغییرهای سینتکس تکاملی زبان عبارت است از: import lib.Out; module Hello { export proc ~start (){ Out.vdu.str("Hello world"). nl(); مجموعه ابزار. مجموعه ابزاری که در پیاده سازی انتظار می رود که فراهم کنند، یک کامپایلر و یک اسمبلر برای تولید فایل های شی از کد منبع Charm و کد منبع اسمبلر است که سپس می توانند به همراه فایل های پشتیبانی کتابخانه و زمان اجرا به یکدیگر پیوند داده شوند تا یک برنامه اجرایی تولید کنند. در زمان نگارش تنها یک مجموعه ابزار نصب Charm (رایگان) برای دانلود موجود است. ابزارها خودشان به زبان Charm نوشته شده اند و
کد منبع تحت شرایط مجوز عمومی عموم (GNU) در دسترس است. آنها بر روی کامپیوترهای شخصی سیستم عامل RISC و پلتفرم های دارای پردازنده های ARM (مانند Raspberry Pi) و شبیه سازهای سیستم عامل RISC که بر روی پلتفرم های ویندوز یا لینوکس (مانند RPCEmu) میزبانی می شوند، اجرا می شوند. تولید کد برای عمل های مربوط به ممیز شناور با دقت مضاغف به کمک سخت افزار برای پلتفرم های مبتنی بر تراشه های ARM که از معماری همکاری پردازنده VFP نسخه ۲ پشتیبانی می کنند، پشتیبانی می شود. کامپایلر. کامپایلر Charm یک کامپایلر بازگشتی است که کد منبع Charm را برای تولید چهار برابر فرم نتیجه تجزیه می کند. (: = lhs op rhs) در یک زبان میانی که از اعمال حسابی، منطقی و کنترل جریان پشتیبانی می کند. داده ها به صورت موقت ذخیره می شوند که به رجیسترها و مکان های حافظه در back end کامپایلر اختصاص داده می شوند. دوback end درحال حاضر وجود دارند، یکی زبان اسمبلی موتورولا ۶۸۰۰۰ و دیگری معماری ARM را تولید می کند. خروجی چهارگانه از مثال hello world به صورت زیر است: param l1$ call write_string[proc (ref array char) void] و خروجی اسمبلر: string "hello" xdef _start a
lign _start xref _write_string stmfd sp!,{rp} adr r0,_l1$ bl _write_string address align _l1$ string "Hello world" direct end در اغلب نسخه های اخیر Charm، رویه های I/O به ماژول های داخل و خارج تقسیم شده اند. سایر رویه های استاندارد کتابخانه در مجموعه ای از رکوردها با ارجاع های رویه به عنوان فیلدها سازماندهی شده اند. به عنوان بخشی از این سازماندهی مجدد، روش write_string اکنون از طریق ماژول کتابخانه زمان اجرا Out، از طریق مرجع عضو استاتیک .vdu به عنوان روش str، فراخوانی می شود، یعنی در مثال hello world بالا، عبارتwrite_string ("Hello world")، تبدیل به Out.vdu.str ("Hello world")می شود. اسمبلر. اسمبلر یادداشت های دستورها، اعلان های داده و دستورالعمل ها را می پذیرد و یک فایل شی، ای می سازد که حاوی اطلاعاتی است که به راحتی توسط CPU پردازنده هدف قابل درک است، به ویژه دستورالعمل های کد کد گذاری شده به صورت باینری (دودویی). پیوند دهنده. تنها و فقط ماژول هایی از Charm که برای تشکیل یک برنامه اجرایی پیوند داده شده اند باید دارای رویهای باشد که با یکی از امضاها مطابقت داشته باشد: export proc ~start () export proc ~start
(int argc, ref array ref array char argv) این مشابه تابع اصلی در زبان های C و جاوا است. دراینجا argc شامل تعداد پارامتر های ارسال شده در خط فرمان است و argv دارای ارجاع به آرایه ای از رشته های argc + 1 می باشد (یک رشته به ازای هر پارامتر موقعیتی به ترتیب و یک پایان nil داراست). علاوه بر این، ماژول ها ممکن است به صورت اختیاری دارای رویه های راه اندازی و خاموش شدن باشند که در هنگام راه اندازی و خاموش شدن برنامه فراخوانی شده اند که با آثار مطابقت داشته باشند: export proc ~startup () export proc ~shutdown () پیونددهنده هر گونه اطلاعات لازم header که مورد نیاز سیستم عامل است را برای اجرای برنامه اضافه می کند و مطمئن می شود که کد پشتیبانی اسمبلر کتابخانه زمان اجرا، اجرا می شود که محیط زمان اجرا (اشاره گرهای داده و پشته) را تنظیم می کند و کنترل را به رویه ی آغازین برنامه منتقل می کند. یک فایل راهنما (نقشه) که نام همه ماژول های مرتبط برای تشکیل برنامه را به همراه داده های global و مراجع کد نشان می دهد به صورت اختیاری تولید می شود که می تواند توسط دیباگرها (Debuggers) و profilers استفاده شود. منابع. ISBN D-201-10073-
8 Aho, Ullman Principles of Compiler Design ISBN D-201-10194-7 Aho, Sethi, Ullman Compilers Principles, Techniques and Tools Wade, Stephen (June 1996). "Charm or trinket?". Acorn User. pp. 50–51. Retrieved 28 August 2021. Wraith, Gavin (January 2012). "The Charm language: a review". Archive. Vol. 23, no. 4. p. 13. Retrieved 2021-08-28. June 2013 Kindle e-book Charm Programming on the Raspberry Pi Charm RISC OS, language page ISBN 0-9512579-0-0 Peter Cockerell ARM Assembly Language Programming لینک های خارجی. Charm for RISC OS Risc PC Emulator ARM Information Center
ماه افتخار معمولاً ماه ژوئن است مجموعه ای از جشن ها و بزرگداشت هایی است که به لزبین ها، همجنس گرایان، دوجنس گرایان و تراجنسیتی ها (ال جی بی تی) اختصاص دارد. ماه افتخار پس از شورش های استون وال در سال ۱۹۶۹ آغاز شد و از آن زمان تا کنون در سرتاسر جهان برگزار می شود. تاریخچه. ریشه. مفهوم ماه افتخار با شورش های استون وال آغاز شد، مجموعه ای از شورش ها برای آزادی گی که طی چند روز از ۲۸ ژوئن ۱۹۶۹ شروع شد. شورش ها پس از حمله پلیس به بار استون وال، یک بار همجنس گرایان در منهتن جنوبی در نیویورک سیتی آغاز شد. سال بعد، اولین رژه افتخار در چندین شهر آمریکا برگزار شد. راهپیمایی در نیویورک سیتی، با هدف جشن گرفتن «روز آزادی خیابان کریستوفر»، در کنار راهپیمایی های هماهنگ دیگری در سراسر ایالات متحده، به عنوان نقطه عطفی برای حقوق دگرباشان جنسی در جهان در نظر گرفته می شود. فرد سارجنت، سازمان دهنده برخی از اولین راهپیمایی ها گفت که هدف از بزرگداشت شورش های استون وال، فشار بیشتر برای آزادی بود. او خاطرنشان کرد که در حالی که اولین راهپیمایی ها بیشتر به یک اعتراض شبیه بود تا یک جشن، به یادآوری جامعه دگرباشان جنسی کمک کرد. با این حال،
زنان تراجنسیتی و رنگین پوستان در طول راهپیمایی های اولیه، طرد یا ساکت شدند. گسترش و جشن. به دنبال شورش های استون وال و اولین رژه های افتخار، تعداد گروه های دگرباشان جنسی به سرعت افزایش یافت، و جنبش افتخار پس از چند سال در سراسر ایالات متحده گسترش یافت. از سال ۲۰۲۰، بیشتر جشن های افتخار در مناطق شهری بزرگ در سراسر جهان در ماه ژوئن برگزار می شود، اگرچه برخی از شهرها این جشن ها را در زمان های مختلف سال برگزار می کنند تا حدی به این دلیل که آب و هوای ماه ژوئن برای چنین رویدادهایی در آنجا نامناسب است. روز جهانی افتخار. روز جهانی افتخار ال جی بی تی روزی است که به افتخار ال جی بی تی اختصاص داده شده است. این مراسم در روز ۲۸ ماه ژوئن به مناسبت سالگرد شورش های استون وال برگزار می شود. این روز بخشی از ماه افتخار است. رسمیت. در ژوئن ۱۹۹۹، بیل کلینتون، رئیس جمهور ایالات متحده، «سالگرد [شورش] استون وال را هر ماه ژوئن در آمریکا به عنوان ماه افتخار گی ها و لزبین ها اعلام کرد». ] در سال ۲۰۱۱، پرزیدنت باراک اوباما، ماه افتخار را که رسماً به رسمیت شناخته شده بود، گسترش داد تا کل جامعه ال جی بی تی را دربر گیرد]] در سال ۲۰۱۷، دون
الد ترامپ از ادامه به رسمیت شناختن فدرال ماه افتخار در ایالات متحده خودداری کرد، ] اگرچه بعداً در سال ۲۰۱۹ در توییتی که بعداً به عنوان اعلامیه ریاست جمهوری مورد استفاده قرار گرفت، آن را به رسمیت شناخت. جو بایدن پس از روی کار آمدن در سال ۲۰۲۱، ماه افتخار را به رسمیت شناخت و متعهد شد که برای حقوق جامعه ال جی بی تی در ایالات متحده فشار بیاورد، ] علیرغم اینکه قبلاً علیه ازدواج همجنس و آموزش مدرسه در مورد موضوعات دگرباشان جنسی در سنا رأی داده بود. ]
در برنامه نویسی تابعی، روشِ "ادامه دهی با انتقال پارمتر" یا CPS، یک روش برنامه نویسی است که در آن flow|کنترل به شکل مستقیم و به فرم یک تداوم منتقل می شود (یک تداوم، نمایشی خلاصه از وضعیت کنترل یک برنامه کامپیوتری است و در یک زمان خاص از فرایند اجرا، جریان کامپیوتری را نشان می دهد). این روش در تضاد با روش مستقیم (direct style) است که همان سبک معمول برنامه نویسی است. "جرالد جی ساسمن" و "گای ال استیل جونیور"، در گزارش ها "اِی.آی مِمو ۳۴۹" در سال ۱۹۷۵ این عبارت را ابداع کردند که باعث به کار افتادن اولین ورژن زبان برنامه نویسی "اسکیم" شد. "جان سی رینولدز" شرح مفصلی از اکتشافات متعددِ تداوم ها ارائه می دهد. مثال ها. تابعی که به روش " ادامه دهی با انتقال پارمتر " نوشته شده باشد یک آرگومانِ اضافه دریافت خواهد کرد: یک تداوم صریح؛ یعنی یک تابع با یک آرگومان. وقتی تابع نوشته شده با روش " ادامه دهی با انتقال پارمتر " مقدار نهایی خود را حساب کند، با صدا زدن تابع تداوم و دادن مقدار نهایی به آن به عنوان آرگومان، آن را برمی گرداند. این بدان معناست که هنگام فراخوانی یک تابع CPS، تابع صدا زده شده وظیفه دارد که عملکرد و رویه ای
فراهم کند تا همراه با مقدار بازگشتی زیر-روال فراخوانی شود.( زیر-روال مجموعه ای از دستورالعمل ها با نام یا آدرس خاصی هستند که هنگام احضار توسط برنامه اصلی اجرا می شوند). بیان کردن کد به این شکل، چیزهایی را صریح و مستقیم می کند که در روش برنامه نویسی مستقیم، به صورت ضمنی هستند. این ها عبارتند از : بازگشت های رویه ها، که به عنوان فراخوانی تداوم ها آشکار می شود؛ مقادیر میانی، که همگی اسم های داده شده هستند؛ ترتیب ارزیابی آرگومان ها، که صریح و مستقیم شده اند؛ و فراخوانی انتهایی که به سادگی یک رویه را با همان تداومِ تغییر نیافته که به صداکننده انتقال داده شده بود، فراخوانی می کند. برنامه ها می توانند به شکل خودکار از روش مستقیم به روش CPS تغییر پیدا کنند. کامپایلرهای تابعی و منطقی معمولاً از CPS به عنوان یک نمایش میانی استفاده می کنند در جایی که یک کامپایلر برای یک زبان برنامه نویسی امری یا رویه ای از فرم تخصیص تک ایستا (SSA) استفاده می کند. SSA به شکل رسمی معادل با زیرمجموعه ای از CPS است ( به استثنای جریان کنترل غیرمحلی، که زمانی که CPS به عنوان نمایش میانی استفاده می شود، اتفاق نمی افتد). کامپایلرهای تابعی همچن
ین می توانند به جای استفاده از thunk در CPS، که زیربرنامه ای است برای تزریق محاسبات به زیربرنامه دیگر، از فرم آنرمال (ANF) استفاده کنند (اما فقط برای زبان هایی که نیاز به تکنیک ارزیابی مشتاقانه دارند (تکنیک مشتاقانه یک روش است که در آن یک عبارت، به محض اینکه به یک متغیر محدود شود یا به عنوان یک آرگومان انتقال داده شود، ارزیابی می شود.)). CPS بیشتر توسط کامپایلرها استفاده می شود تا به عنوان یک سبک کلی یا محلی توسط برنامه نویس ها. در CPS هر تابع، یک آرگومان اضافه می گیرد که نمایان کننده این است که باید روی نتیجه ای که تابع محاسبه می کند، چه عملی انجام شود. این موضوع، همراه با یک سبک محدود کننده که انواع مدل هایی که معمولاً در دسترس هستند را ممنوع می کند، استفاده می شود تا معانی برنامه ها را نماش دهد و درنتیجه، تحلیل آن ها را ساده تر کند. این روش همچنین، بیان ساختارهای کنترل غیرمعمولی مثل پرتاب کردن/گرفتن یا سایر انتقال های غیرمحلی را آسان می کند. راز CPS این است که به یاد داشته باشیم : یک) هر تابعی یک آرگومان اضافی با عنوان "تداوم" تابع می گیرد و دو) هر آرگومانی در یک فراخوانی تابع باید یا یک متغیر باشد یا عبار
ت لامبدا (نه یک عبارت پیچیده تر). تاثیر این کار این است که عبارت انگاری پشت ورو می شود؛ زیرا قسمت های داخلی عبارات باید زودتر ارزیابی شوند، که در نتیجه CPS ترتیب ارزیابی را نیز همانند جریان کنترل صریح و مستقیم می کند. تعدادی مثال از کد به روش مستقیم و CPS متناظر با آن در پایین دیده می شود. این مثال ها به زبان برنامه نویسی اسکیم نوشته شده اند؛ طبق قرارداد تابع تداوم با "k" نمایش داده شده است: توجه کنید که در ورژن CPS، متغیرهای اولیه استفاده شده، مثل &amp;+ و &amp;* خودشان CPS هستند نه روش مستقیم، بنابراین برای اینکه مثال های بالا در سیستم زبان اسکیم کار کنند نیاز داریم که ورژن CPS آن ها را بنویسیم. برای مثال &amp;* به این وسیله تعریف می شود: (k (* x y))) برای اینکه این کار را در حالت کلی انجام دهیم، می توانیم یک روال تبدیل بنویسیم: (lambda args (let ((r (reverse args))) ((car r) (apply f (reverse (cdr r))))))) برای اینکه یک رویه را که در CPS نوشته شده است از یک رویه ی دیگر که درون رویه ی مستقیم نوشته شده است فراخوانی کنیم، لازم است که یک تداوم فراهم کنیم که نتیجه محاسبه شده توسط رویه نوشته شده در CPS را دریافت
می کند. در مثال بالا (با این فرض که مقادیر اولیه CPS ارائه شده باشد)، ممکن است تابع زیر را صدا بزنیم: codice_1 در بین کامپایلرها تنوعی برای ارائه توابع اولیه در CPS وجود دارد. در مثال های بالا ما از ساده ترین قرارداد استفاده کردیم، با این حال گاهی اوقات مقادیر اولیه بولین ارائه می شوند که دو thunk می گیرند تا در دو حالت متفاوت فراخوانی بشوند، پس به جای فراخوانیِ codice_2 در داخل تعریفِ codice_3 به این شکل نوشته خواهد شد: codice_4 به همین شکل، گاهی اوقات بخش "if" خودش در CPS موجود نیست بلکه یک تابع به شکل زیر تعریف خواهد شد: codice_5 که سه آرگومان دریافت خواهد کرد: یک شرط با مقدار درست یا غلط، و دو thunk متناظر با دو بازوی شرط. متن بالا نشان می دهد که CPS یک تحول جهانی است. فاکتوریلِ روش مستقیم، همان طور که انتظار می رود، یک آرگومان دریافت خواهد کرد؛ اما فاکتوریل CPS که یک &amp; در آخر اسم خود دارد دو آرگومان می گیرد: خود آرگومان معمول و یک تداوم. هر تابعی که یک تابع CPS شده را فراخوانی می کند باید یا تداوم جدیدی ارائه کند یا تداوم خودش را منتقل کند؛ هر فراخوانی از یک تابع CPS شده به یک تابع غیرCPS از یک تداو
م ضمنی استفاده خواهد کرد. درنتیجه، برای مطمئن شدن از نبود یک استک مربوط به توابع، کل برنامه باید به CPS نوشته شده باشد. سی.پی.اس در هَسکِل. در این بخش ما یک تابع به اسم codice_6 می نویسیم که با استفاده از قضیه فیثاغورث، هیپوتنوز را محاسبه می کند. {هیپوتنوز به معنای طولانی ترین ضلع مثلث قائم الزاویه نسبت به طول قاعده و عمود بر آن است.} یک پیاده سازی سنتی از این تابع به شکل زیر خواهد بود: pow2 :: Float -&gt; Float pow2 a = a ** 2 add :: Float -&gt; Float -&gt; Float add a b = a + b pyth :: Float -&gt; Float -&gt; Float pyth a b = sqrt (add (pow2 a) (pow2 b)) برای اینکه این تابع سنتی را به CPS تبدیل کنیم، نیاز داریم امضای تابع، یعنی شیوه تعریف ورودی و خروجی های آن را عوض کنیم. تابع یک آرگومان دیگه از جنس تابع دریافت خواهد کرد و نوع نتیجه برگشتی آن، به این تابع وابسته خواهد بود: pow2' :: Float -&gt; (Float -&gt; a) -&gt; a pow2' a cont = cont (a ** 2) add' :: Float -&gt; Float -&gt; (Float -&gt; a) -&gt; a add' a b cont = cont (a + b) -- Types a -&gt; (b -&gt; c) and a -&gt; b -&gt; c are equivalent, so CPS funct
ion -- may be viewed as a higher order function sqrt' :: Float -&gt; ((Float -&gt; a) -&gt; a) sqrt' a = cont -&gt; cont (sqrt a) pyth' :: Float -&gt; Float -&gt; (Float -&gt; a) -&gt; a pyth' a b cont = pow2' a (a2 -&gt; pow2' b (b2 -&gt; add' a2 b2 (anb -&gt; sqrt' anb cont))) ابتدا مربع "a" را در تابع محاسبه می کنیم و یک تابع لامبدا را به عنوان تداوم انتقال می دهیم، که مربع "a" را به عنوان آرگومان خواهد پذیرفت. و همین طور ادامه خواهد یافت تا به نتیجه محاسبات برسیم. برای به دست آوردن نتیجه این تابع می توانیم تابع "id" را به عنوان آرگومان نهایی منتقل کنیم که مقداری را که به آن ارسال شده بدون تغییر برمی گرداند: codice_7 کتابخانه mtl که با GHC قابل دسترس می شود، دارای ماژولی به نام زیر است: codice_8 این ماژول تایپ Cont را ارائه می دهد، که تابع های مفیدی مثل تابع Monad را پیاده سازی می کند. قطعه زیر تابع codice_9 را که در بالا نشان دادیم با استفاده از تایپ Cont نشان می دهد: pow2_m :: Float -&gt; Cont a Float pow2_m a = return (a ** 2) pyth_m :: Float -&gt; Float -&gt; Cont a Float pyth_m a b = do a2 &lt;- pow2_
m a b2 &lt;- pow2_m b anb &lt;- cont (add' a2 b2) r &lt;- cont (sqrt' anb) return r نه تنها سینتکس زبان تمیزتر شده است، بلکه این تایپ به ما این امکان را می دهد تا از فانکشن codice_10 با تایپ زیر استفاده کنیم: codice_11 این تابع یک آرگومان از جنس تابع دارد؛ این آرگومان، تابع را نیز می پذیرد، که تمام محاسبات پس از فراخوانی آن را کنار می گذارد. برای مثال، بیایید اجرای تابع pyth را، اگر حداقل یکی از آرگومان های آن منفی باشد با برگرداندن صفر بشکنیم: pyth_m :: Float -&gt; Float -&gt; Cont a Float pyth_m a b = callCC $ exitF -&gt; do -- $ sign helps to avoid parentheses: a $ b + c == a (b + c) when (b &lt; 0 || a &lt; 0) (exitF 0.0) -- when :: Applicative f =&gt; Bool -&gt; f () -&gt; f () a2 &lt;- pow2_m a b2 &lt;- pow2_m b anb &lt;- cont (add' a2 b2) r &lt;- cont (sqrt' anb) return r تداوم به عنوان شئ. برنامه نویسی با تداوم ها، همچنین می تواند زمانی مفید باشد که صدا زننده نمی خواهد منتظر کامل شدن تابعِ صداشده بماند. به عنوان مثال در برنامه نویسی رابط کاربری (UI)، یک روال می تواند کادرهای محاوره ای تنظیم کند و آن ه
ا را به همراه یک تابع تداوم، به چارچوب UI ارسال کند. وقتی کاربر دکمه "OK" را فشار دهد، فریمورک تابع تداوم را با فیلدهای به روزشده صدا می زند. با اینکه این روش کد زدن از تداوم ها استفاده می کند، اما به طور کامل CPS نیست. function confirmName() { fields.name = name; framework.Show_dialog_box(fields, confirmNameContinuation); function confirmNameContinuation(fields) { name = fields.name; زمانی که تابع باید در یک رشته یا پردازدنده متفاوت اجرا شود، می توان از ایده مشابهی استفاده کرد. فریمورک، می تواند تابع صدازده شده را در یک رشته کارگر اجرا کند، سپس تابع تداوم را در رشته اولیه با نتیجه رشته کارگر فراخوانی کند. کد زیر به زبان Java 8 و با استفاده از فریمورکd "UI" به نام Swing نوشته شده است: void buttonHandler() { // This is executing in the Swing UI thread. // We can access UI widgets here to get query parameters. int parameter = getField(); new Thread(() =&gt; { // This code runs in a separate thread. // We can do things like access a database or a // blocking resource like the network to get data. int result = lo
okup(parameter); javax.swing.SwingUtilities.invokeLater(() =&gt; { // This code runs in the UI thread and can use // the fetched data to fill in UI widgets. setField(result); }).start(); فراخوانی های نهایی. هر فراخوانی در CPS یک فراخوانی نهایی است، و تداوم مستقیماً منتقل می شود. استفاده از CPS بدون بهینه سازی فراخوانی نهایی (TCO)، نه تنها باعث می شود که تداوم ساخته شده به طور بالقوه در طول بازگشت رشد کند، بلکه حتی برای فراخوان پشته (کال استک) نیز همین اتفاق می افتد. این اتفاق معمولاً نامطلوب است، اما به روش های جالبی مورد استفاده قرار گرفته است – به کامپایلر Chicken Scheme مراجعه کنید. همان طور که CPS و TCO مفهوم بازگشت ضمنی تابع را حذف می کنند، استفاده ترکیبی از آن ها می تواند نیاز به استکِ زمانِ اجرا (run-time stack) را نیز حذف کند. بسیاری از کامپایلرها و مفسرهای زبان های برنامه نویسی تابعی، از این توانایی به روش های جدیدی استفاده می کنند. استفاده و پیاده سازی. از روش "ادامه دهی با انتقال پارمتر" می توان برای پیاده سازی تداوم ها و کنترل عملگر های جریان در یک زبان تابعی که دارای تداوم های کلاس-اول نیست اما د
ارای توابع کلاس-اول و بهینه سازی فراخوانی نهایی است، استفاده کرد. بدون بهینه سازی فراخوانی نهایی، می توان از تکنیک هایی مانند ترامپولین کردن، یعنی استفاده از حلقه ای که به طور مکرر توابع برگشت دهنده ی thunk را فراخوانی می کند، استفاده کرد. بدون توابع درجه یک، حتی می توان در چنین حلقه ای فراخوانی های نهایی را به فقط گوتوس(gotos، اصطلاح مربوط به فراخوانی های نهایی) تبدیل کرد. کد زدن در CPS، اگرچه غیر ممکن نیست، اغلب مستعد خطاست. ترجمه های مختلفی وجود دارد که معمولاً به عنوان تبدیل های یک انتقاله یا دوانتقاله از محاسبات لامبدای خالص تعریف می شوند که عبارات سبک مستقیم را به عبارت CPS تبدیل می کنند. با این حال، کد زدن به سبک ترامپولین بسیار دشوار است. زمانی که این روش استفاده می شود، معمولاً هدف نوعی تغییر شکل است، مانند کامپایل کردن. توابعِ استفاده کننده از بیش از یک تداوم را می توان برای گرفتن پارادایم های مختلف جریان کنترل تعریف کرد؛ به عنوان مثال (به زبان اسکیم): (=&amp; y 0.0 (lambda (b) (if b (err (list "div by zero!" x y)) (ok (/ x y)))))) شایان ذکر است که تبدیل CPS از نظر مفهومی یک جاسازی یوندا است. همچنین
شبیه جاسازی محاسبات لامبدا در محاسبات عدد پی نیز هست. استفاده در زمینه های دیگر. در خارج از علوم کامپیوتر، CPS به عنوان جایگزینی برای روش مرسوم برای ترکیب عبارات ساده به عبارات پیچیده مورد توجه عمومی است. برای مثال، در معناشناسی زبانی، کریس بارکر و همکارانش پیشنهاد کرده اند که تعیین نشانه های جملات با استفاده از CPS ممکن است پدیده های خاصی را در زبان طبیعی توضیح دهد. در ریاضیات، ایزومورفیسم کوری-هاروارد بین برنامه های کامپیوتری و برهان های ریاضی، ترجمه روش "ادامه دهی به روش انتقال پارامتر" را به تنوعی از تعبیه های دو نفی منطق کلاسیک به منطق شهودی (سازنده) مرتبط می کند. برخلاف ترجمه دو نفی معمولی، که گزاره های اتمی پی را به نگاشت می کند، CPS نماد را با تایپ عبارت نهایی جایگزین می کند. بر این اساس، نتیجه با انتقال تابع همانی به عنوان تداوم عبارت CPS، مانند مثال بالا، به دست می آید. منطق کلاسیک به خودی خود مربوط به دستکاری تداوم برنامه ها به طور مستقیم است، همان طور که در عملگر کنترلیِ فراخوانی-با-تداوم-فعلی در اسکیم که مشاهده ای به دلیل تیم گریفین(با استفاده از عملگر کنترل سیِ بسیار مربوط) است نیز همین گونه اس
ت. همچنین ببینید. بازگشت نهایی درحین تکنیک ترامپولین
لوید گریفیث (؛ زادهٔ ) مجری تلویزیون، کمدین، بازیگر و خواننده اهل انگلستان است. وی از سال ۲۰۱۰ میلادی تاکنون مشغول فعالیت بوده است. از فیلم ها یا مجموعه های تلویزیونی که وی در آن ها نقش داشته است، می توان به "تد لاسو"، "گناه" و "بی نهایت" اشاره نمود.
اسکات ون پلت (؛ ) گزارشگر ورزشی و مجری تاک شوهای ورزشی اهل ایالات متحده آمریکا است. وی از سال ۱۹۹۰ میلادی تاکنون مشغول فعالیت بوده است. وی عضو انجمن برادری پای کاپا آلفا است. از فیلم ها یا مجموعه های تلویزیونی که وی در آن ها نقش داشته است، می توان به "تد لاسو" اشاره نمود.
آرلو وایت (؛ ) گزارشگر ورزشی اهل ایالات متحده آمریکا است. وی پیش تر برای ان بی سی اسپورتس کار می کرد و گزارشگر لیگ برتر فوتبال انگلستان و فوتبال آمریکایی بود و مدتی هم برای باشگاه فوتبال سیاتل ساندرز و باشگاه فوتبال شیکاگو فایر فعالیت نمود. از فیلم ها یا مجموعه های تلویزیونی که وی در آن ها نقش داشته است، می توان به "تد لاسو" اشاره نمود.
جف استلینگ (؛ زادهٔ ) روزنامه نگار، مجری تلویزیون و گزارشگر ورزشی شبکه اسکای اسپورت نیوز اهل بریتانیا است. وی از سال ۱۹۷۸ میلادی تاکنون مشغول فعالیت بوده است. از فیلم ها یا مجموعه های تلویزیونی که وی در آن ها نقش داشته است، می توان به "تد لاسو" اشاره نمود.
کریس کامارا (؛ زادهٔ ) بازیکن پیشین فوتبال اهل بریتانیا است که مابین سال های ۱۹۹۲ تا ۲۰۲۲ به عنوان گزارشگر و تحلیل گر فوتبال در شبکه تلویزیونی اسکای اسپورت فعالیت داشت. از باشگاه هایی که در آن بازی کرده است می توان به باشگاه فوتبال برنتفورد، باشگاه فوتبال میدلزبرو، باشگاه فوتبال استوک سیتی، باشگاه فوتبال سوئیندون تاون، باشگاه فوتبال برادفورد سیتی، باشگاه فوتبال شفیلد یونایتد، باشگاه فوتبال پورتسموث، باشگاه فوتبال لوتون تاون، و باشگاه فوتبال لیدز یونایتد اشاره کرد. از فیلم ها یا مجموعه های تلویزیونی که وی در آن ها نقش داشته است، می توان به "تد لاسو" (در کنار جف استلینگ) اشاره نمود.