![]() |
اصل این مقاله رو به صورت pdf دانلود کنید
|
Common Lisp
Common Lisp http://daneshnameh.roshd.ir/mavara/i...pics000144.gif Common Lisp، که معمولاً به صورت CL مخفف می شود، یک نوع از Lisp است که به وسیلهی ANSI *30266 - 1994 استاندارد شده و برای استاندارد کردن نسخه های منشعب شده ی Lisp که بخش هایی از آن را دارا هستند، گسترش یافته است. CL در واقع یک پیاده سازی نیست بلکه یک مشخصه ی زبانی است که پیاده سازی های Lisp با آن مطابقت دارد. Common Lisp یک زبان برنامه نویسی همه منظوره است، در مقایسه با نسخه های Lisp مانند Lisp Emacs و Auto Lisp که زبان های جامع جاسازی شده در تولیدات ویژه هستند. برخلاف بسیاری از Lisp های اولیه، Common Lisp مانند Scheme از حوزه لغوی برای متغیرها استفاده می کند. Common Lisp یک زبان برنامه نویسی چند نمونه ای است که:
Common Lisp یک Lisp است؛ که از عبارات نحوی برای دلالت بر کد و ساختمان داده استفاده می کند. فراخوانی های ماکرو و تابع به صورت لیستی با آوردن نام تابع در ابتدا نوشته شده است، مانند مثال زیر: 2 و 2 را جمع می کند و نتیجه 4 می دهد؛ (2+2 ) به متغیر "p" مقدار 3.1415 می دهد؛ (setq) p 3.1415 تعریف یک تابع که مجذور یک عدد را حساب می کند; (defun square (x) (* x x محاسبه تابع; "9" را برمی گرداند (square 3); انواع داده Common Lisp انواع داده ای زیادی حتی بیشتر از بسیاری زبان ها دارد. انواع اسکالر انواع عدد شامل اعداد صحیح، کسری، ممیز شناور و اعداد مختلط می باشد. Common Lisp از bignums برای نشان دادن مقدارهای عددی با دقت و اندازه دلخواه استفاده می کند. نوع کسری، کسرها را با دقت نشان می دهد، این ویژگی در بسیاری از زبان ها وجود ندارد. Common Lisp به صورت اتوماتیک مقدارهای عددی را بین این داده ها به صورت مناسب وارد می کند. نوع کاراکتر Common Lisp به کاراکترهای ASCII محدود نمی شود- تعجب آور نیست وقتی Lisp، ASCII را نیز شامل می شود. بعضی از پیاده سازی های مدرن به کاراکترهای یونی کد نیز اجازه استفاده می دهد. نوع سمبل نیز در زبان های Lisp رایج است، اما عموماً خارج از آنها شناخته شده نیست. یک سمبل یک شی داده ای نامدار واحد است. سمبل ها در Lisp شبیه شناسه ها در زبان های دیگر هستند، که به عنوان متغیرها برای نگهداری ارزش ها استفاده می شوند. اگرچه، آنها بسیار عمومی تر هستند و می توانند برای خودشان هم استفاده شوند. معمولاً وقتی یک سمبل ارزیابی می شود، مقدارش به عنوان یک متغیر برگردانده می شود. استثناهایی نیز وجود دارد: سمبل های کلمات کلیدی مثل: foo با خودشان ارزیابی می شوند و مقدارهای بولی در Common Lisp به وسیله ی سمبل های رزرو شده ی T و NIL نشان داده می شوند. ساختمان های داده انواع ترتیبی در Common Lisp شامل لیست ها، بردارها، بردارهای بیتی و رشته ها می باشد. مانند Lispهای دیگر، لیست ها در Common Lisp از consها ساختمان داده با دو بخش است که car وcdr نامیده می شود. یک لیست یک زنجیره پیوندی از cons هاست. که car مربوط به cons به عضوی از یک لیست ارجاع می کند (احتمالاً لیست دیگر). هر cdr مربوط به cons، به cons بعدی اشاره می کند به جز آخرین cons که مقدارش به nil اشاره می کند.consها به راحتی برای پیاده سازی درخت ها و دیگر ساختمان های داده ی پیچیده استفاده می شوند: اگر چه توصیه می شود که از نمونه های کلاس یا ساختار به جای آن استفاده شود. Common Lisp آرایه های چند بعدی را پشتیبانی می کند، و می تواند به صورت پویا در صورت نیاز آرایه ها را دوباره سایز دهی بکند. آرایه های چند بعدی می تواند برای ریاضیات ماتریسی به کار روند. بردار یک آرایه ی یک بعدی است. آرایه ها می توانند هر نوع داده ای را به عنوان اعضاء داشته باشند (حتی انواع ترکیبی در همان آرایه) یا می توانند برای شامل شدن نوع خاصی از اعضاء، تخصصی شوند مثلاً در برداری از اعداد صحیح. بسیاری از پیاده سازی ها می توانند توابع آرایه ای را وقتی که آرایه ها در نوع های تخصصی شده به کار می روند، بهینه کند. دو نوع آرایه ای تخصصی شده، استاندارد هستند: رشته برداری از کاراکترهاست در حالی که بردار بیتی، برداری از بیت ها است. جداول Hash پیوستگی بین شی های داده ای را ذخیره می کند. هر شی ممکن است به عنوان کلید یا مقدار استفاده شود. جداول Hash نیز مانند آرایه ها می توانند به صورت اتوماتیک در مواقع نیاز دوباره سایزدهی شوند. بسته ها مجموعه ای از سمبل ها هستند که به طور عمده برای جدا سازی بخش های یک برنامه به فضاهای نامی به کار می روند. یک بسته بعضی از سمبل ها را خارج کرده و به عنوان بخشی از یک واسط عمومی مشخص می کند. ساختارها، شبیه struct ها در Cو رکوردها در پاسکال، ساختمان های داده ای پیچیده ی دلخواه با هر عدد و نوعی از زمینه ها را نشان می دهند. توابع در Common Lisp، نوع داده یک نوع دادهای است. به عنوان نمونه، این امکان وجود دارد که تابعی نوشته شود که توابع دیگر را به عنوان آرگومان می پذیرد و همین طور به عنوان خروجی برمی گرداند. این خواصیت این امکان را فراهم می کند که عملیات بسیار عمومی را به توان تشریح کرد. کتابخانه Common Lisp شدیداً به چنین توابع مرتبه بالاتری تکیه می کند. مثلاً تابع sort عملگر مقایسه را به عنوان آرگومان می پذیرد. بنابراین نه تنها می تواند هر نوع داده ای را مرتب کند بلکه ساختمان داده را نیز مطابق با یک کلید مرتب می کند. (sort ( list 5 2 6 3 1 4) # ' >) ; لیست را با استفاده از اپراتور < به عنوان عملگر مقایسه کننده مرتب می کند. ; .رابرمی گرداند ( 6 5 4 3 2 1 ) (sort (list ' ( 9 a ) ' ( 3 b ) ' ( 4 c ) ) # ' ( lambda ( x y ) ( < ( car x ) ( car y ) ) ) ) لیست را مطابق با عنصر اول ( car) از هر زیر لیست مرتب می کند ; ( cb ) ( 4 c ) ( 9 a )را برمی گرداند.; مدل عرض یابی برای توابع بسیار ساده است. وقتی که عرضیاب کننده با فرم (F A1 A2. . . ) مواجه می شود باید فرض کند که سمبولی که F نامیده می شود یکی از گزینه های زیر است:
فضای نامی تابع در اینجا یک تفاوت اساسی بین Common Lisp و Scheme وجود دارد.در CL، نام تابع در یک فضای نامی جستجو می شود که از فضای نامی مربوط به متغیرها جدا می باشد و فضای نامی تابع نامیده می شود. عملگرهایی که نام ها را در فضای عمومی تعریف می کنند شامل defun، flet و labels هستند. برای فرستادن تابع با اسم به عنوان یک آرگومان به تابع دیگر، بعد از عملگر ویژه تابع که عموماً با علامت # ' خلاصه می شود استفاده کرد. مثال sort اول به تابعی اشاره می کند که نام < در فضای نامی تابع، با کد #'> دارد. مدل ارزیابی Scheme ساده تر است تنها یک فضای نامی وجود دارد و همه مکان ها در فرم ارزیابی می شوند (با هر ترتیب ) — نه فقط آرگومان ها.چ گاهی برای برنامه نویسان با تجربه، کدی که در یک نسخه نوشته شده در نسخه های دیگر گیج کننده است. به طور نمونه، بسیاری از برنامه نویسان CL ممکن است از نام های متغیر توصیفی مثل لیست یا رشته استفاده کنند که در Scheme غیر مجاز است و آنها با نام های توابع برخورد پیدا می کنند. اگر چه فضای نامی مجزا برای توابع یک حسن است، یک منبع مجادله در خانواده ی Lisp می باشد. که معمولاً به عنوان Lisp-1 و Lisp-2 مورد ارجاع قرار می گیرد. این اسامی در مقاله ای در سال 1988 از ریچارد پ. گابریل ایجاد شد که به طور جامع ای دو روش را مقایسه می کند. سرانجام، در حالی که تعریف یک تابع ( شکل befun ) یک لیست است، توابع عموماً به صورت داخلی به صورت لیست نشان داده نمی شوند. انواع دیگر انواع دیگر داده ای در Common Lisp شامل موارد زیر است:
ماکروها یکماکرو در Lisp به طور سطحی شبیه یک تابع در حال استفادده است. اگرچه، نشان دهنده ی عبارتی است که ارزیابی شده است، نماینده ی یک تغییر شکل کد اصلی برنامه نیز می باشد. ماکروها به برنامه نویسان Lisp امکان ایجاد فرم های نحوی جدید در زبان را می دهد. به عنوان نمونه، این ماکرو شکل حلقه until را ایجاد می کند، که ممکن است در زبان هایی مثل Perl آشنا به نظر می رسد: (defmacro until (test &body wbody) (do ( ) ( , test ) , @body ) ) ; ; example ( until (+ (random 12 ) 0 ) ( write-line "Hello" ) ) همه ی ماکروها باید قبل از این که کد اصلی شامل آنها ارزیابی یا کامپایل شود، گسترش یابند. ماکروها می توانند به عنوان توابعی که درخت های نحوی انتزاعی را می پذیرند و برمی گردانند ملاحظه شوند. این توابع قبل از اینکه کامپایلر کد اصلی نهایی را تولید کند، احضار می شوند. ماکروها در Common Lisp معمولی نوشته شده اند، و هر عملگر Common Lisp را می توانند استفاده کنند. نکته ای که در بالا ذکر شد توسط Common Lisp برای ساده کردن مورد معمول از جایگزینی در قالب های یک کد، ایجاد شده است. گرفتن متغیرها و سایه اندازی آنها ماکروهای Common Lisp قادر به گرفتن متغیر هستند، موقعیتی که در آنها سمبل ها در بدنه گسترش یافته ی ماکرو با سمبل های متن فراخوانی شده و منطبق می شوند. گرفتن متغیر ها گاهی اوقات اثر مطلوبی دارد: به برنامه نویسان امکان ایجاد ماکروها را جایی که سمبل های مختلف، معنایی ویژه دارند، می دهد. اگرچه، می تواند خطاهای غیر معمول و غیر قابل انتظاری را نیز ایجاد کند. بعضی از سیستم های Lisp مانند scheme، با استفاده از ماکرو ها از گرفتن متغیر جلوگیری می کنند — که ماکرو های تمیز نامیده می شوند. در Common Lisp می توان بوسیلهی gensyms از گرفتن متغیرهای ناخواسته جلوگیری کرد – gensyms سمبل های واحد گارانتی شده ای هستند که می توانند در گسترش ماکروها بدون خطر گرفته شدن استفاده شوند. مسئله ی دیگر سایه اندازی غیر عمدی عملگرهای استفاده شده در گسترش ماکروها است. مثلاً، کد (نادرست) زیر را ملاحظه کنید: ( mocrolet ( ( do ( . . . ) . . . something else . . . ) ) ( until ( = ( random 10 ) 0 ) ( write- line "Hello" ) ) ) ماکرو UNTIL به شکلی گسترش می یابد که DO را فراخوانی کند، که به منظور ارجاع شکل ویژه پایه ای DO طرح ریزی شده است. اگر چه، در این متن، DO ممکن است معنای کاملاً متفاوتی داشته باشد. Common Lisp مشکل سایه اندازی عملگر را با ممانعت از تعریف مجدد عملگرهای ساختمانی مثل DO در این مثال، اصلاح می کند. در ضمن، کاربران ممکن است کدهایشان را به بسته هایی تقسیم کنند. سمبل های ساختمانی در بسته ی Common Lisp یافت می شوند، که بوسیله ی سمبل ها در بسته ی کاربر سایه اندازی نمی شوند. مقایسه با Lisp های دیگر Common Lisp بسیار با Scheme مقایسه می شود.چون آنها دو نسخه ی معروف از Lispها هستند. Scheme از لحاظ تاریخی جدیدتر از LC است، و نه تنها از همان Lisp می آید بلکه به وسیله بعضی از همان مهندسین نیز ارائه شده است Guy L. Steele با Gerald Jay Sussman، Scheme را طراحی کردند و کمیته استاندارد را برای Common Lisp به کرسی نشاندند. اغلب سیستم های Lisp که طراحی هایشان در Common Lisp توزیع شده مثل Zetalisp و Franz Lisp تنها از متغیرهایی که به صورت پویا محدود شده اند استفاده کرده اند. Scheme متغیرهایی را به Lisp معرفی می کند که از لحاظ لغوی محدود شده اند و به صورت گسترده ای به عنوان یک ایده ی خوب شناخته شده و توسط CL اقتباس شده اند. CL متغیرهای محدود شده ی پویا را پشتیبانی می کند اما باید به طور صریح ذکر شود که آنها دارای این مشخصه هستند. Common Lisp گاهی Lisp2 نامیده می شود و Scheme، Lisp1 که برمی گردد به استفاده ی CL از فضاهای نامی مجزا برای توابع و متغیرها، (در حقیقت، CL فضاهای نامی زیادی دارد مانند آنهایی که بری کلمات کلیدی loop و نام های بلوکی و قالب go به کار می روند). به علاوه پیاده سازی ها قصد دارند به مجموعه های منشعبی از بسته های کتابخانه برسند که عملکردی را که در استاندارد پوشش داده نشده، تامین کنند. بعضی از این خصیصه ها به استاندارد اضافه شدند مانند CLOS و قرارداد LOOP؛ بقیه ویژه ی پیاده سازی باقی ماندند. متأسفانه بسیاری از وسایل ارزشمند برای برنامه نویس مدرن مثل شبکه بندی TCP/IP همچنان استاندارد نشده باقی مانده اند. اگر چه، بسته های با کد باز برای پشتیبانی چنین خصیصه هایی به روش قابل انتقال ایجاد شده اند، یک نمونه قابل توجه آن پروژه ی مجمومه ی کد باز Common Lisp است. Common Lisp برای پیاده سازی وسیله ی کامپایلیرهای افزایشی طراحی شده است. تعریف های استاندارد به منظور بهینه کردن کامپایل در مشخصات زبان پیشنهاد شده است. اغلب پیاده سازی های Common Lisp، توابع را برای بومی کردن کد ماشین کامپایل می کنند. بقیه به کد بایت کامپایل می کنند، که سرعت را کاهش می دهد ولی قابلیت انتقال کد باینری را آسان می کند. این تصور غلط که Lisp یک زبان کاملاً تفسیر شده است، بسیار متحمل است در نتیجه ی این حقیقت باشد که محیط های Common Lisp یک اعلان با اثر متقابل را تأمین می کند و اینکه توابع یکی یکی به یک ترتیب افزایشی کامپایل می شوند. بعضی از پیاده سازی ها براساس Unix مثل CLISP، می توانند به عنوان مفسرهای متنی استفاده شوند; یعنی به وسیله سیستم به صورت شفاف به ترتیبی که مفسر Perl ویا Unix shell است، احضار شوند. لیست پیاده سازی ها پیاده سازی های قابل توزیع مجدد رایگان شامل موارد زیر است:
کاربردها با وجود انتظارات بزرگ از کمیته ی استاندارد (CL گاهی به عنوان جایگزینی برای C معرفی می شود)، Common Lisp یک زبان برنامه نویسی مناسب باقی ماند، که اغلب در دانشگاه و یا محیط های کاربردی ویژه که در ارتباط با هوش مصنوعی است به کار می رود. اگرچه، داستان های موفقیت معروفی وجود دارد که حداقل، پتانسیل بزرگی از زبان را در صنعت نشان می دهد. بسیاری از کاربران Common Lisp برای معرفی زبان مطلوب شان مثال آشنای سایت بازرگانی yahoo را می زنند که با Common Lisp گسترش یافته است. درضمن کاربردهای کد منبع باز موفقی به زبان Common Lisp وجود دارد مثل:
|
تشکر
مطلبی که گذاشتید بسیار مفید بود.
مرسی |
اکنون ساعت 06:17 PM برپایه ساعت جهانی (GMT - گرینویچ) +3.5 می باشد. |
Powered by vBulletin® Version 3.8.4 Copyright , Jelsoft Enterprices مدیریت توسط کورش نعلینی
استفاده از مطالب پی سی سیتی بدون ذکر منبع هم پیگرد قانونی ندارد!! (این دیگه به انصاف خودتونه !!)
(اگر مطلبی از شما در سایت ما بدون ذکر نامتان استفاده شده مارا خبر کنید تا آنرا اصلاح کنیم)