موضوع مقاله: اسکیم (زبان برنامه‌نویسی) | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # اسکیم (زبان برنامه‌نویسی) | مقدمه: برعکس Common Lisp، اسکیم از فلسفه طراحی حداقل گرا استفاده می کند، بر اساس این فلسفه هسته استاندارد باید کوچک باشد، ضمن این که برای توسعه زبان ابزار های قدرتمندی را دارا باشد. | ## بخش 1: اسکیم (زبان برنامه‌نویسی) | این زبان از اولین زبان‌های برنامه‌نویسی بود که از تداوم کلاس اول پشیبانی می‌کند. و عملاً استانداردی که گزارش تجدید نظر در طرح زبان الگوریتمی اسکیم (RnRs) نامیده می‌شود. بزرگترین استاندارد پیاده‌سازی شده R5RS است (۱۹۹۸); یک استاندراد جدید، R6RS، در سال ۲۰۰۷ تصویب شده‌است.اسکیم پایه کاربری متنوعی را به دلیل فشردگی و ظرافت دارد، اما فلسفه حداقل گرای آن باعث واگرایی میان پیاده‌سازی‌های کاربردی آن شده‌است، به‌طوری‌که کمیته فرمان اسکیم آن را «سیار ترین زبان برنامه‌نویسی» و «یک خانواده از گویش ها» می‌نامد تا یک زبان برنامه‌نویسی تنها. نام حال حاضر نتیجه از استفاده نویسندگان از سیستم عامل ITS است، که نام فایل‌ها را به دو بخش از که هر کدام حد اکثر شش کارکتر می‌پذیرند سات. نحو بسیار ساده اسکیم بر پایهٔ عبارات، لیست‌های پرانتزی است که در آن یک عملگر پیشوند با آرگومانهایش دنبال می‌شود. برنامه‌های اسکیم می‌توانند به راحتی بخش‌های کد اسکیم را به صورت پویا ایجاد و ارزیابی کنند. اسکیم، یک مجموعه غنی از اولویت‌های پردازش لیست از جمله "cons", "car" و "cdr" را از نمونه‌های قدیمی تر لیسپ (اجداد لیسپ) به ارث می‌برد. اسکیم به شدت اما به صورت پویا از متغیرهای تایپ شده‌استفاده می‌کند و از رویه‌های (procedures) کلاس اولیه پشتیبانی می‌کند؛ بنابراین، رویه‌ها را می‌توان به عنوان مقادیر به متغیرها یا آرگومان‌ها تعیین نمود. این بخش به‌طور عمده بر ویژگی‌های نوآورانه این زبان تمرکز می‌کند، از جمله ویژگی‌هایی که اسکیم را از سایر لیسپ‌ها متفاوت می‌کند. در نمونه‌هایی که در این بخش ارائه شده است، از علامت "(نتیجه) result ===>"، برای نشان دادن نتیجهٔ ارزیابی عبارت خط ماقبل استفاده می‌شود. ویژگی‌های طراحی بنیادی این بخش، آن ویژگی‌های اسکیم را توصیف می‌کند که آن را از دیگر زبان‌های برنامه‌نویسی (از همان ابتدا) متمایز می‌کند. این‌ها جنبه‌هایی از اسکیم هستند که بیشترین تأثیر را بر هر محصول زبان اسکیم دارند، و جنبه‌هایی هستند که تمامی نسخه‌های نسخه‌های زبان برنامه‌نویسی اسکیم، از سال ۱۹۷۳ به بعد، آن را دارا هستند. این سهولت را می‌توان به استفاده از محاسبات لامبدا تا بسیاری از نحو این زبان، از فرم‌های ابتدایی تر نسبت داد. به عنوان مثال از ۲۳ ساختار نحوی مبتنی بر عبارات s در استاندارد R5RS، ۱۱ تا به عنوان فرم مشتق یا فرم کتابخانه‌ای طبقه‌بندی شده‌اند، که می‌تواند به صورت ماکروی شامل اشکال اساسی بیشتر، به ویژه لامبدا نوشته شود. در ۱۹۹۸، ساسمَن و استیل اشاره کردند که اسکیمِ مینیمالیسم یک هدف طراحی آگاهانه نخواهد بود، بلکه به نوعی نتیجهٔ ناخواسته فرایند طراحی است. «ما در واقع تلاش می‌کردیم چیزی پیچیده و کشف شده را بسازیم، که به‌طور تصادفی چیزی ساختیم که تمام اهداف ما را دربر گرفته بود اما خیلی ساده‌تر از آنچه ما قبلاً در نظر داشتیم. محدوده واژگانی (Lexical Scope) همانند بسیاری از زبان‌های برنامه‌نویسی مدرن و برخلاف لیسپ‌های قدیمی تر مانند ماکلیسپ(Maclisp)، اسکیم به صورت واژگانی محدود می‌شود (= در scope قرار می‌گیرد): تمام انقیاد متغیرهای ممکن در یک واحد برنامه می‌تواند با خواندن متن یک واحد برنامه بدون در نظر گرفتن مفاد آن تحلیل کند. در آن لیسپ‌ها، برای یک مرجع متغیر آزاد درون یک رویه، کاملاً امکان‌پذیر بود که به انقیادهای کاملاً مجزا خارج از رویه (بسته به فراخوانی) منتسب نماید. محاسبات لامبدا نشانه ریاضیاتی آلونزو چِرچ (Alonzo Church)، محاسبات لامبدا، الهام بخش استفاده از «لامبدا» به عنوان یک کلید واژه برای معرفی رویه، همچنین تأثیر در توسعه تکنیک‌های برنامه‌نویسی تابعی شامل استفاده از توابع درجه بالاتر در لیسپ می‌باشد. اما لیسپ‌های ابتدایی تر، عبارات مناسبی از محاسبات لامبدا نبودند؛ به دلیل رفتار متغیرهای آزادش. معرفی محدوده لغوی، مسئله را با ایجاد همبستگی (هم‌ارزی) میان برخی اَشکال لامبدا و بیان عملی آن‌ها در یک زبان برنامه‌نویسی کارا حل کرده‌است. ساسمَن و استیل نشان دادند که زبان جدید می‌تواند برای استنتاج تمام معانی اِخباری و دستوری زبان‌های برنامه‌نویسی دیگر مانند الگول و فرترن و محدوده پویا دیگر لیسپ‌ها، با استفاده از عبارات لامبدا، نه به عنوان رویه ساده، بلکه به عنوان «ساختارهای کنترل و اصلاح‌کننده‌های محیط» استفاده شود. ساختار بلوک اسکیم، ساختار بلوکی خود را از زبان‌های با ساختار بلوکی قدیمی تر به ارث برده است، به ویژه الگول. استفاده از ساختار بلوک برای ایجاد انقیادها، خطر برخورد فضای نام را کاهش می‌دهد که در غیر این صورت ممکن است اتفاق بیفتد. 5 (دنباله‌های مرد و زن هوفستادر برای تعاریف مورد استفاده در این مثال را ببینید) تمامی رویه‌های محدود در یک “letrec”، می‌توانند با نام به دیگری اشاره کنند، همچنین مقادیر متغیرهایی که قبلاً در همان “letrec” تعریف شدند، اما ممکن است به مقادیر تعریف شده بعدی در همان “letrec” اشاره نکنند. این متغیرهای "let" را به آرگومان‌های یک رویه که نامش همان "شناسهٔ داده شده" و بدنه آن همان بدنه فرم "let" است، به هم می‌پیوندد (مقید می‌کند). پیاده‌سازی استاندارد اسکیم برای بهینه‌سازی فراخوانی‌های دنباله به منظور پشتیبانی از تعداد نامحدودی از فراخوانی‌های فعال دنباله مورد نیاز هستند(R5RS بخش ۳٫۵). یک ویژگی که اسکیم به عنوان بازگشت دنباله مناسب توصیف می‌کند _ و آن را برای برنامه نویسان اسکیم برای نوشتن الگوریتم‌های تکراری با استفاده از ساختارهای بازگشتی آسان‌تر می‌کند، که بعضی اوقات بیشتر بصری و حسی هستند. | ## بخش 2: اسکیم (زبان برنامه‌نویسی) | این استاندارد، یا این‌ها مانند انتزاع برخورد می‌کند، و پیاده‌ساز را به هیچ نمایش خاص داخلی متعهد نمی‌کند. یک عدد دقیق تنها می‌تواند توسط یک دنباله از عملیات دقیق که با دیگر اعداد دقیق درگیر هستند تولید شود—بنابریان نادقیق بودن واگیری است. استاندارد مشخص می‌کند که هر یک از دو پیاده‌سازی باید نتایج یکسانی را برای تمام عملیات بر روی اعداد دقیق داشته باشند. در استاندارد R5RS، پیاده‌سازی‌های اسکیم نیاز به پیاده‌سازی کل برج عددی ندارند، بلکه آن‌ها باید «یک زیر مجموعه منسجم شامل هردوی مقصود پیاده‌سازی و روح زبان اسکیم» را پیاده‌سازی کنند. استاندارد R6RS جدید نیاز به پیاده‌سازی تمام برج دارد، و «شی‌های عدد صحیح دقیق و شی‌های عدد منطقی دقیق از عملاً اندازه نامحدود و دقت، و پیاده‌سازی کردن رویه‌های مخصوص… که آن‌ها همیشه نتایج دقیقی را هنگامی که آرگومان‌های دقیق به آن‌ها می‌دهیم بازمی‌گردانند» (R6RS sec. این نخستین‌ها، که مقادیر شناخته را یه عنوان قول تولید یا رسیدگی می‌کنند، می‌توانند برای ساختارهای پیاده‌سازی ارزیابی تنبل پیشرفته مانند جریان‌ها [۲۰] استفاده شوند. SRFI 41 اصطلاح هر دوی دنباله‌های محدود و نامحدود را با صرفه جویی خارق‌العاده‌ای توانمند می‌کند. ترتیب ارزیابی‌ها—شامل ترتیب در اینکه عبارت‌ها در موقعیت عملیات ارزیابی شده‌اند—ممکن است توسط یک پیاده‌سازی روی یک پایه فراخوانی-بوسیله-فراخوانی انتخاب شده باشد، و تنها محدودیت این است که "تاثیر هرکدام از ارزیابی‌های موازی عبارات عملگر و عمولند، محدود است تا با برخی دنباله ترتیب ارزیابی استوار شود." (R5RS sec. در تضاد با Lispهای دیگر، ظاهر یک عبارت در در موقعیت عملگر (اولین گزینه) از یک عبارت اسکیم، تا زمانی که نتیجه عبارت یک رویه در یک موقعیت عملکر دیگر است، کاملاً قانونی است. در فراخوانی رویه "+" برای جمع ۱ و ۲، عبارت (ev +), (ev 1) و (ev 2) ممکن است تا زمانی که ارزیابی موازی آن‌ها بر روی هم تأثیری نداشته باشند، بدون هیچ ترتیبی ارزیابی شوند؛ بنابراین این سه خط که در ادامه آورده شده‌است، ممکن است در هیچ ترتیبی توسط استاندارد اسکیم زمانی ه کد مثال بالا اجرا می‌شود نمایش داده نشوند، اگرچه متن یک خط ممکن است با دیگر عوض نشده باشد بخاطر اینکه ممکن است دنباله تمرکز ارزیابی را نقص کند. استاندارد R5RS یک ماکرو بهداشتی قدرتمند را معرفی می‌کند که به برنامه نویسان اجازه می‌دهد تا ساختار نحوی جدید را به زبان با استفاده از الگوهای ساده که با زیرزبان همخوانی دارد اضافه کنند. با توجه به این، سیستم ماکرو بهداشتی به یک ضمیمه از استاندارد R4RS، یه عنوان یک سیستم سطح بالا همراه با سطح با سیستم ماکرو سطح پایین کاهش یافته‌است، که با هر دوی آن‌ها مانند افزونه‌هایی به اسکیم رفتار می‌شود تا یک بخش ضروری از زبان [۲۱]. پیاده‌سازی سیستم بهداشتی ماکرو، که همچنین syntax-rules نیز می‌گویند، باید دامنه نحوی باقی‌مانده زبان را رعایت کنند؛ که این کار با یک نام‌گذاری خاص و قواعد دامنه برای گسترش ماکرو و اجتناب از خطاهای برنامه‌نویسی رایج که می‌توانند در سیستم ماکرو دیگر زبان‌های برنامه‌نویسی رخ بدهند، خاطر جمع می‌شود. دعوت‌ها از ماکروها و رویه‌ها یک شباهت نزدیک دارند – هر دو s-عبارت هستند—اما با آن‌ها متفاوت رفتار می‌شود. وقتی کامپایلر به یک s-عبارت در برنامه برخورد می‌کند، اول چک می‌کند تا بفهمد که آیا علامت به عنوان یک کلید نحوی درون دامنه نحوی حال حاضر قرار دارد یا خیر. اگر قرار دارد، سپس تلاش می‌کند تا ماکرو را گسترش دهد، با گزینه‌های دنباله s-عبارت مانند آرگومان‌ها بدون کد کامپیایل برای ارزیابی کردن رفتار می‌کند، و این فرایند به صورت بازگشتی تکرار می‌شود تا هیچ ماکرو دعوت دیگری باقی نماند. اگر یک کلید نحوی نباشد، کامپایلر کد را برای ارزیابی آرگومان درون دنباله s-عبارت و سپس ارزیابی متغیر معرفی شده توسط علامت در هد s-عبارت کامپایل می‌کند و آن را به عنوان یک رویه با دنباله ارزیابی عبارات با آرگومان‌های واقعی برای آن‌ها فراخوانی می‌کند. محیط‌ها و ارزیابی با توجه به R5RS، اسکیم هیچ استانداردی برای رویه ارزیابی که در همه Lispهای دیگر وجود دارد، ندارد، اگرچه اولین مقاله لامبدا ارزیابی را "شبیه به تابع ارزیابی Lisp" توصیف کرده بود. [۱۶] و اولین گزارش تجدید نظر شده در ۱۹۷۸ آن را با enclose عوض کرد، که دو آرگومان را می‌گیرد. دومی، سومی و چهارمین گزارش تجدید نظر شده، هر گونه معادل بودن ارزیابی را حذف کردند. دلیل این گیجی این است که در اسکیم با دامنه نحوی نتایج ارزیابی یک عبارت بستگی به جایی دارد که ارزیابی می‌شود. اگر در محیط درونی ارزیابی شود، جایی که علامت "+" است، نتیجه ضرب دو عملگر خواهد بود. R5RS این گیجی را با استفاده از مشخص کردن سه رویه که محیطها را باز میگردانندو فراهم کردن یک رویه ارزیابی که یک s-عبارت و یک محیط را می‌گیرد و عبارت را درمحیط فراهم شده ارزیابی می‌کند حل می‌کند. رفتار مقادیر غیر بول در عبارات بول در بسیاری از لهجه‌های Lisp، شامل Lisp رایج، با قرار دادن مقدار NIL در یک مقدار در یک عبارت بول، آن را غلط تعیین می‌کنند. در اسکیم از زمان استاندارد IEEE در ۱۹۹۱، [۲] تمام مقادیر بجز #f، شامل NILهای معادل در اسکیم که مانند ' نوشته می‌شوند، به عنوان مقدار درست در عبارات بول ارزیابی می‌شوند. 6.3.1 3] از آنجا که در بیشتر Lispها مقدار صحیح T می‌باشد، ثابتی که مقدار درست را در اسکیم نمایندگی می‌کند با #T نشان می‌دهیم. (R5RS sec 3.2 3] درون نوع داده‌های عددی، به وسیله تضاد، مقادیر عددی همپوشانی می‌کنند. - equal? دو ساختار داده را مانند لیست‌ها، بردارها و رشته‌ها مقایسه می‌کند تا مشخص شود آن‌ها ساختار متضاد و محتوای eqv? دارند. | ## بخش 3: اسکیم (زبان برنامه‌نویسی) | بسیار از پیاده‌سازی‌ها کنوانسیون‌های اجازه دهنده به پیام‌گذاری را پشتیبانی می‌کنند که برای بیش از یک خط باشد، و استاندارد R6RS هر دوی آن‌ها را اجازه می‌دهد: یک s-عبارت می‌تواند تماماً با یک علامت #; به یک پیام تبدیل شود و یک دامنه پیام می‌تواند با احاطه شدن توسط علامت‌های #| و |# تولید شود. بیشتر پیاد هسازی‌ها درگاه‌های رشته را با قابلیت‌های شبیه به تغییر مسیر، توامند کردن بسیاری از عملیات ورودی-خروجی که به جای فایل بافر باشند را به وسیلهٔ رویه توصیف شده در SRFI 6.[24] فراهم می‌آورند. استاندارد R6RS رویه‌های درگاه پیچیده‌تر و تواناتر و بسیاری دیگر از انواع جدید درگاه را فراهم می‌آورند. در یک عملیات خواندن، نتیجه باگردانده شده پایان-شی-فایل است اگر درگاه ورودی به آخر فایل رسیده باشد، و این می‌تواند توسط مسند eof-object? آزماش شود. علاوه بر استاندارد، SRFI 28 یک فرمت پایه تعریف شده شبیه به تابع فرمت لیسپ رایج، بعد از اینکه نامگذاری شد را تعریف می‌کند. در استاندارد R5RS زبان کاملاً مجاز است که اتصالات ساخته شده طی رویه متغیر را تغییر دهد، و به‌طور مؤثر آن‌ها را بازتعریف کند. برای مثال، ممکن است + را طوری گسترش دهد که رشته را قبول کند همان‌طور که برای اعداد عمل می‌کند:(set! در عوض، این امکان وجود دارد که رویه‌های مختلف تحت نام‌های رویه‌های استاندارد وارد شوند، که اثر آن شبیه به بازتعریف است. بررسی رویه‌ها و فرم‌های استاندارد زبان رسمی در استانداردهای R5RS (1998) و R6RS (2007) تعریف شده‌است. آن‌ها یک «فرم» استاندارد توصیف می‌کنند: کلمات کلیدی و نحو همراه، که ساختار کنترل زبان را ارائه می‌دهند و رویه‌های استاندارد که کارهای معمول را انجام می‌دهند. بعضی از فرم‌ها در بیش از یک ردیف ظاهر می‌شوند زیرا آن‌ها به راحتی نمی‌توانند به یک تابع در زبان طبقه‌بندی شوند. فرم‌ها با نماد "L" در این جدول به عنوان فرم‌های "کتابخانه" طبقه‌بندی شده و اغلب با استفاده از فرم‌های بنیادی تر به عنوان ماکروها پیاده‌سازی می‌شوند؛ که باعث می‌شود وظیفه پیاده‌سازی بسیار ساده‌تر از سایر زبان‌ها شود. رویه‌های استاندارد دو جدول زیر رویه‌های استاندارد در اسکیم R5RS را توصیف می‌کند. بعضی رویه‌ها در بیشتر از یک خط ظاهر می‌شوند زیرا به راحتی نمی‌توانند به یک تابع در زبان طبقه‌بندی شوند. درخواست‌های طرح برای اجرا (پیاده‌سازی) به دلیل کوچک‌سازی طرح، بسیاری از رایج‌ترین روش‌ها و صورت‌های نحوی به وسیله استاندارد تعریف نمی‌شود. به منظور کوچک نگهداشتن زبان هسته‌ای (اصلی) اما استانداردسازی پسوندها، جامعه طرح دارای درخواست طرح برای فرایند اجراست (srfi) که بدان وسیله مجموعه‌های پسوند از طریق بحث دقیق طرح‌های پیشنهادی پسوند تعریف می‌شوند. , -ساخت پسوند شرطی مبتنی بر ویژگی -مجموعه فهرست -انواع داده‌های برداری عددی همگن -پورت رشته اولیه -دریافت و پیوند با مقادیر متعد -تعریف انواع ثبت -مجموعه رشته پیاده‌سازی‌ها دسته اصلی: Scheme (programming language) طراحی کمینه و ظریف اسکیم را به یک هدف محبوب برای طراحان زبان، دنبال کنندگان سرگرمی و آموزنده‌ها تبدیل کرده‌است و بخاطر اندازه کوچکش به دلیل مفسر کوچک، همچنین یک انتخاب محبوب برای سیستم‌های جاسازی شده و اسکریپتی است. که بسیاری از آن‌ها با هم متفاوت هستند بنابرین حمل برنامه‌ها از یک پیاده‌سازی به پیاده‌سازی‌های دیگر کاملاً دشوار است و اندازه وچک زبان استاندارد به این معناست که نوشتن یک برنامه مفید با هر پیچیدگی دراسکیم استاندارد و قابل حمل تقریباً غیرممکن است. استاندارد R6RS یک زبان خیلی گسترده‌تر را طی تلاشی برای گسترده‌تر کردن درخواست‌های برنامه نویسانش مشخص می‌کند. تقریباً تمامی پیاده‌سازی یک حالت-لیسپ سنتی حلقه خواندن-ارزیابی-چاپ را برای توسعه و خطایابی ارائه می‌دهند. پشتیبانی برای کد اسکیم تعبیه شده در برنامه‌های نوشته شده به دیگر زبان‌ها نیز مانند سادگی نسبی پیاده‌سازی‌های اسکیم که آن را یک انتخاب محبوب برای اضافه کردنقابلیت‌های اسکریپتی به سیستم‌های بزرگتر توسعه یافته در زبان‌هایی مانند c کرده‌است، رایج است. برای مثال Kawa و JSchee یکپارچه‌سازی با کلاس‌های جاوا را فراهم می‌کنند، و اسکیم به مترجم‌های c معمولاً کار راب برای کتابخانه‌های خارجی نوشته شده به زبان c، بسته به اینکه به کد تعبیه شده در c واقعی در سورس اسکیم اجازه دهیم، راحت می‌کند. یک مثال دیگر Pvts است، که یک مجموعه از ابزار بصری را برای پشتیبانی یادگیری اسکیم ارائه می‌دهد. به‌طور ویژه دوره‌های علوم کامپیوتری مقدماتی از این طرح در رابطه با ساختار کتاب درسی و تغییر برنامه‌های کامپیوتری (sicp) استفاده می‌کنند. هر چند ۶٬۰۰۱ با دوره‌های جدید تر جایگزین شد، اما هنوز sicp آموزش به زبان mit را ادامه می‌دهد. کتاب دو چگونه برنامه‌ها را طراحی کنیم (با نویسندگی مایتاس فلیس) به وسیلهٔ چندین مؤسسه آموزش عالی برای دوره‌های علوم کامپیوتری مقدماتی آن‌ها به کار برده می‌شود. هم دانشگاه فورس استرن و هم مؤسسه ورسسترپلی تکنیک از این طرح به‌طور انحصاری برای دوره‌های مقدماتی «اصول علوم کامپیوتری» و مقدمه‌ای برطراحی برنامه استفاده می‌کنند رز_هولمان از این طرح در دوره مفاهیم زبان برنامه‌نویسی پیشرفته تر استفاده می‌کند. | ## جمع‌بندی | ویژگی‌ها روالها در اسکیم، تابع‌های دستهٔ اول هستند که برنامه‌نویسی تابعی را شدنی می‌کند.