موضوع مقاله: لیسپ معمولی | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # لیسپ معمولی | مقدمه: لیسپ معمولی، که معمولاً به صورت CL مخفف می‌شود، یک نوع از لیسپ است که به وسیلهٔ ANSI *۳۰۲۶۶–۱۹۹۴ استاندارد شده و برای استاندارد کردن نسخه‌های منشعب شدهٔ لیسپ که بخش‌هایی از آن را دارا هستند، گسترش یافته‌است. | ## بخش 1: لیسپ معمولی | CL در واقع یک پیاده‌سازی نیست بلکه یک مشخصهٔ زبانی است که پیاده‌سازی‌های لیسپ با آن مطابقت دارد. لیسپ معمولی یک زبان برنامه‌نویسی همه منظوره‌است، در مقایسه با نسخه‌های لیسپ مانند لیسپ ایمکس و آتولیسپ که زبان‌های جامع جاسازی شده در تولیدات ویژه هستند. برخلاف بسیاری از لیسپ‌های اولیه، لیسپ معمولی مانند Scheme از حوزه لغوی برای متغیرها استفاده می‌کند. لیسپ معمولی یک زبان برنامه‌نویسی چندمدلی است که: مدل‌های برنامه‌نویسی مانند برنامه‌نویسی شیءگرا، برنامه‌نویسی تابعی و برنامه‌نویسی امری را پشتیبانی می‌کند. به صورت پویا نوع دار شده‌است، اما با اعلان‌های نوع اختیاری که می‌تواند امنیت یا بازدهی را بهبود بخشد. فراخوانی‌های ماکرو و تابع به صورت لیستی با آوردن نام تابع در ابتدا نوشته شده‌است، مانند مثال زیر: ۲ و ۲ را جمع می‌کند و نتیجه ۴ می‌دهد: (+ 2 2) به متغیر "p" مقدار ۳٫۱۴۱۵ می‌دهد: (setf *p* 3.1415) تعریف یک تابع که مجذور یک عدد را حساب می‌کند: (defun square (x) (* x x اجرای تابع که عدد ۹ را برمی‌گرداند: (square 3) انواع داده لیسپ معمولی انواع داده‌ای زیادی حتی بیشتر از بسیاری زبان‌ها دارد. لیسپ معمولی از bignums برای نشان دادن مقدارهای عددی با دقت و اندازه دلخواه استفاده می‌کند. نوع کسری، کسرها را با دقت نشان می‌دهد، این ویژگی در بسیاری از زبان‌ها وجود ندارد. لیسپ معمولی به صورت اتوماتیک مقدارهای عددی را بین این داده‌ها به صورت مناسب وارد می‌کند. نوع سمبل نیز در زبان‌های لیسپ رایج است، اما عموماً خارج از آن‌ها شناخته شده نیست. سمبل‌ها در لیسپ شبیه شناسه‌ها در زبان‌های دیگر هستند، که به عنوان متغیرها برای نگهداری ارزش‌ها استفاده می‌شوند. استثناهایی نیز وجود دارد: سمبل‌های کلمات کلیدی مثل: foo با خودشان ارزیابی می‌شوند و مقدارهای بولی در لیسپ معمولی به وسیلهٔ سمبل‌های رزرو شدهٔ T و NIL نشان داده می‌شوند. ساختمان‌های داده انواع ترتیبی در لیسپ معمولی شامل لیست‌ها، بردارها، بردارهای بیتی و رشته‌ها می‌باشد. لیسپ معمولی آرایه‌های چند بعدی را پشتیبانی می‌کند، و می‌تواند به صورت پویا در صورت نیاز آرایه‌ها را دوباره سایز دهی بکند. آرایه‌ها می‌توانند هر نوع داده‌ای را به عنوان اعضاء داشته باشند (حتی انواع ترکیبی در همان آرایه) یا می‌توانند برای شامل شدن نوع خاصی از اعضاء، تخصصی شوند مثلاً دربرداری از اعداد صحیح. بسیاری از پیاده‌سازی‌ها می‌توانند توابع آرایه‌ای را وقتی که آرایه‌ها در نوع‌های تخصصی شده به کار می‌روند، بهینه کند. دو نوع آرایه‌ای تخصصی شده، استاندارد هستند: رشته برداری از کاراکترهاست در حالی که بردار بیتی، برداری از بیت‌ها است. جداول Hash نیز مانند آرایه‌ها می‌توانند به صورت اتوماتیک در مواقع نیاز دوباره سایزدهی شوند. بسته‌ها مجموعه‌ای از سمبل‌ها هستند که به‌طور عمده برای جداسازی بخش‌های یک برنامه به فضاهای نامی به کار می‌روند. یک بسته بعضی از سمبل‌ها را خارج کرده و به عنوان بخشی از یک واسط عمومی مشخص می‌کند. ساختارها، شبیه structها در Cو رکوردها در پاسکال، ساختمان‌های داده‌ای پیچیدهٔ دلخواه با هر عدد و نوعی از زمینه‌ها را نشان می‌دهند. | ## بخش 2: لیسپ معمولی | به عنوان نمونه، این امکان وجود دارد که تابعی نوشته شود که توابع دیگر را به عنوان آرگومان می‌پذیرد و همین‌طور به عنوان خروجی برمی‌گرداند. این خواصیت این امکان را فراهم می‌کند که عملیات بسیار عمومی را به توان تشریح کرد. مثلاً تابع sort عملگر مقایسه را به عنوان آرگومان می‌پذیرد؛ بنابراین نه تنها می‌تواند هر نوع داده‌ای را مرتب کند بلکه ساختمان داده را نیز مطابق با یک کلید مرتب می‌کند. .) مواجه می‌شود باید فرض کند که سمبولی که F نامیده می‌شود یکی از گزینه‌های زیر است: یک عملگر ویژه (به آسانی در یک لیست ثابت چک می‌شود). یک عملگر ماکرو (باید قبلاً تعریف شده باشد) نام یک تابع (پیش فرض، که ممکن است یک سمبل یا یک زیر شکل باشد که با سمبل lambda شروع می‌شود. اگر F نام یک تابع باشد، آنگاه آرگومان‌های A1, A۲، … An با ترتیب چپ به راست عرض یابی می‌شوند و آن مقادیر را به عنوان پارامتر می‌گیرد. در CL، نام تابع در یک فضای نامی جستجو می‌شود که از فضای نامی مربوط به متغیرها جدا می‌باشد و فضای نامی تابع نامیده می‌شود. برای فرستادن تابع با اسم به عنوان یک آرگومان به تابع دیگر، بعد از عملگر ویژه تابع که عموماً با علامت # ' خلاصه می‌شود استفاده کرد. مدل ارزیابی Scheme ساده‌تر است تنها یک فضای نامی وجود دارد و همه مکان‌ها در فرم ارزیابی می‌شوند (با هر ترتیب) — نه فقط آرگومان‌ها. چ گاهی برای برنامه نویسان با تجربه، کدی که در یک نسخه نوشته شده در نسخه‌های دیگر گیج‌کننده‌است. به‌طور نمونه، بسیاری از برنامه نویسان CL ممکن است از نام‌های متغیر توصیفی مثل لیست یا رشته استفاده کنند که در Scheme غیرمجاز است و آن‌ها با نام‌های توابع برخورد پیدا می‌کنند. اگر چه فضای نامی مجزا برای توابع یک حسن است، یک منبع مجادله در خانوادهٔ لیسپ می‌باشد؛ که معمولاً به عنوان Lisp-۱ و Lisp-۲ مورد ارجاع قرار می‌گیرد. سرانجام، در حالی که تعریف یک تابع (شکل befun) یک لیست است، توابع عموماً به صورت داخلی به صورت لیست نشان داده نمی‌شوند. انواع دیگر انواع دیگر داده‌ای در لیسپ معمولی شامل موارد زیر است: نام مسیر که نماینده فایل‌ها و شاخه‌ها در سیستم فایلی است. چون از لحاظ قدمت Lisp جدای از Unix بود، ویژگی نام مسیر لیسپ معمولی عمومی تر از قراردادهای نام فایل بیشتر سیستم‌عامل‌ها است و این ویژگی دسترسی به فیل‌ها را در برنامه‌های Lisp به‌طور گسترده‌ای قابل انتقال در سیستم‌های گوناگون می‌کند. جریان‌های ورودی و خروجی نشان دهنده تخلیه و تغذیهٔ داده‌های متنی یا باینری هستند مانند فایل‌های باز یا نمایی. شرایط یک نوع ویژه‌است که برای نشان دادن خطاها، استثناها و دیگر وقایع که یک برنامه ممکن است به آن‌ها پاسخ دهد استفاده می‌شوند. لیسپ معمولی در ضمن شامل جعبه ابزاری برای برنامه‌نویسی شی گرا به نام سیستم شی ای لیسپ معمولی یا CLOS است. اگرچه، نشان دهندهٔ عبارتی است که ارزیابی شده‌است، نمایندهٔ یک تغییر شکل کد اصلی برنامه نیز می‌باشد. ماکروها می‌توانند به عنوان توابعی که درخت‌های نحوی انتزاعی را می‌پذیرند و برمی‌گردانند ملاحظه شوند. ماکروها در لیسپ معمولی معمولی نوشته شده‌اند، و هر عملگر لیسپ معمولی را می‌توانند استفاده کنند. | ## بخش 3: لیسپ معمولی | نکته‌ای که در بالا ذکر شد توسط لیسپ معمولی برای ساده کردن مورد معمول از جایگزینی در قالب‌های یک کد، ایجاد شده‌است. گرفتن متغیرها و سایه اندازی آن‌ها ماکروهای لیسپ معمولی قادر به گرفتن متغیر هستند، موقعیتی که در آن‌ها سمبل‌ها در بدنه گسترش یافتهٔ ماکرو با سمبل‌های متن فراخوانی شده و منطبق می‌شوند. گرفتن متغیرها گاهی اوقات اثر مطلوبی دارد: به برنامه نویسان امکان ایجاد ماکروها را جایی که سمبل‌های مختلف، معنایی ویژه دارند، می‌دهد. بعضی از سیستم‌های لیسپ مانند scheme، با استفاده از ماکروها از گرفتن متغیر جلوگیری می‌کنند — که ماکروهای تمیز نامیده می‌شوند. در لیسپ معمولی می‌توان بوسیلهٔ gensyms از گرفتن متغیرهای ناخواسته جلوگیری کرد – gensyms سمبل‌های واحد گارانتی شده‌ای هستند که می‌توانند در گسترش ماکروها بدون خطر گرفته شدن استفاده شوند. لیسپ معمولی مشکل سایه اندازی عملگر را با ممانعت از تعریف مجدد عملگرهای ساختمانی مثل DO در این مثال، اصلاح می‌کند. سمبل‌های ساختمانی در بستهٔ لیسپ معمولی p یافت می‌شوند، که بوسیلهٔ سمبل‌ها در بستهٔ کاربر سایه اندازی نمی‌شوند. CL متغیرهای محدود شدهٔ پویا را پشتیبانی می‌کند اما باید به‌طور صریح ذکر شود که آن‌ها دارای این مشخصه هستند. به علاوه پیاده‌سازی‌ها قصد دارند به مجموعه‌های منشعبی از بسته‌های کتابخانه برسند که عملکردی را که در استاندارد پوشش داده نشده، تأمین کنند. بعضی از این خصیصه‌ها به استاندارد اضافه شدند مانند CLOS و قرارداد LOOP؛ بقیه ویژهٔ پیاده‌سازی باقی ماندند. متأسفانه بسیاری از وسایل ارزشمند برای برنامه‌نویس مدرن مثل شبکه بندی TCP/IP همچنان استاندارد نشده باقی مانده‌اند. اگر چه، بسته‌های با کد باز برای پشتیبانی چنین خصیصه‌هایی به روش قابل انتقال ایجاد شده‌اند، یک نمونه قابل توجه آن پروژهٔ مجمومهٔ کد باز لیسپ معمولی است. اغلب پیاده‌سازی‌های لیسپ معمولی، توابع را برای بومی‌کردن کد ماشین کامپایل می‌کنند. بقیه به کد بایت کامپایل می‌کنند، که سرعت را کاهش می‌دهد ولی قابلیت انتقال کد باینری را آسان می‌کند. این تصور غلط که Lisp یک زبان کاملاً تفسیر شده‌است، بسیار متحمل است در نتیجهٔ این حقیقت باشد که محیط‌های لیسپ معمولی یک اعلان با اثر متقابل را تأمین می‌کند و اینکه توابع یکی یکی به یک ترتیب افزایشی کامپایل می‌شوند. Allegro CL یک محیط توسعه یکپارچه (برای ویندوز و لینوکس) فراهم می‌کند و قابلیت‌های گسترده‌ای را برای تحویل درخواست‌های نرم‌افزارها دارد. CMUCL در اصل از دانشگاه کارنگی ملون که در حال حاضر به وسیلهٔ کاربران متعدد استفاده می‌شود. CMUCL از یک کامپایلر اصلی سریع مشهور استفاده می‌کند و شامل مفسر نمی‌باشد، به‌طور گسترده‌ای از پیاده‌سازی CL با کد منبع باز استفاده می‌کند، در لینوکس و بی‌اس‌دی برای اینتل x۸۶ موجود هستند. کاربردها با وجود انتظارات بزرگ از کمیتهٔ استاندارد (CL گاهی به عنوان جایگزینی برای C معرفی می‌شود)، لیسپ معمولی یک زبان برنامه‌نویسی مناسب باقی ماند، که اغلب در دانشگاه یا محیط‌های کاربردی ویژه که در ارتباط با هوش مصنوعی است به کار می‌رود. موارد کاربردی لیسپ معمولی در بسیاری از برنامه‌های تجاری استفاده می‌شود، از جمله یاهو! acl۲، کاربردی، یک ثابت‌کننده نظریه با تمام خصیصه‌ها برای زیر مجموعه‌ای از لیسپ معمولی است. | ## جمع‌بندی | Compo، زبانی که به ساختارهای موسیقی پیچیده اجازه توصیف به یک روش طبیعی را می‌دهد.