منو
 کاربر Online
365 کاربر online

Common Lisp

تازه کردن چاپ
علوم ریاضی > علو م رایانه
(cached)




Common Lisp

img/daneshnameh_up/9/99/compics000144.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 نامیده می شود یکی از گزینه های زیر است:
  1. یک عملگر ویژه ( به آسانی در یک لیست ثابت چک می شود).
  2. یک عملگر ماکرو ( باید قبلاً تعریف شده باشد)
  3. نام یک تابع ( پیش فرض، که ممکن است یک سمبل یا یک زیر شکل باشد که با سمبل lambda شروع می شود.

اگر F نام یک تابع باشد، آنگاه آرگومان های A1, A2, ... An با ترتیب چپ به راست عرض یابی می شوند و آن مقادیر را به عنوان پارامتر می گیرد.

فضای نامی تابع


در اینجا یک تفاوت اساسی بین Common Lisp و Scheme وجود دارد.در CL، نام تابع در یک فضای نامی جستجو می شود که از فضای نامی مربوط به متغیرها جدا می باشد و فضای نامی تابع نامیده می شود. عملگرهایی که نام ها را در فضای عمومی تعریف می کنند شامل defun، flet و labels هستند.
برای فرستادن تابع با اسم به عنوان یک آرگومان به تابع دیگر، بعد از عملگر ویژه تابع که عموماً با علامت # ' خلاصه می شود استفاده کرد. مثال sort اول به تابعی اشاره می کند که نام < در فضای نامی تابع، با کد #'> دارد.
مدل ارزیابی Scheme ساده تر است تنها یک فضای نامی وجود دارد و همه مکان ها در فرم ارزیابی می شوند (با هر ترتیب ) — نه فقط آرگومان ها.چ
گاهی برای برنامه نویسان با تجربه، کدی که در یک نسخه نوشته شده در نسخه های دیگر گیج کننده است. به طور نمونه، بسیاری از برنامه نویسان CL ممکن است از نام های متغیر توصیفی مثل لیست یا رشته استفاده کنند که در Scheme غیر مجاز است و آنها با نام های توابع برخورد پیدا می کنند. اگر چه فضای نامی مجزا برای توابع یک حسن است، یک منبع مجادله در خانواده ی Lisp می باشد. که معمولاً به عنوان Lisp-1 و Lisp-2 مورد ارجاع قرار می گیرد. این اسامی در مقاله ای در سال 1988 از ریچارد پ. گابریل ایجاد شد که به طور جامع ای دو روش را مقایسه می کند.
سرانجام، در حالی که تعریف یک تابع ( شکل befun ) یک لیست است، توابع عموماً به صورت داخلی به صورت لیست نشان داده نمی شوند.


انواع دیگر


انواع دیگر داده ای در Common Lisp شامل موارد زیر است:
  • نام مسیر که نماینده فایل ها و شاخه ها در سیستم فایلی است. چون از لحاظ قدمت Lisp جدای از Unix بود، ویژگی نام مسیر Common Lisp عمومی تر از قراردادهای نام فایل بیشتر سیستم عامل ها است و این ویژگی دسترسی به فیل ها را در برنامه های Lisp به طور گسترده ای قابل انتقال در سیستم های گوناگون می کند.
  • جریان های ورودی و خروجی نشان دهنده تخلیه و تغذیه ی داده های متنی یا باینری هستند مانند فایل های باز یا نمایی.
  • Common Lisp دارای بلوک ساختمانی تولید کننده اعداد تصادفی کاذب هستند. اشیاء تصادفی نماینده منابع قابل استفاده ی مجدد اعداد تصادفی کاذب هستند و به کاربر اجازه می دهند که PRNG را راه اندازی کند یا منجر به اجرای مجدد یک توالی از آن شود.
  • شرایط یک نوع ویژه است که برای نشان دادن خطاها، استثناها و دیگر وقایع که یک برنامه ممکن است به آنها پاسخ دهد استفاده می شوند.

Common Lisp در ضمن شامل جعبه ابزاری برای برنامه نویسی شی گرا به نام سیستم شی ای Common Lisp یا CLOS است.

ماکروها


یکماکرو در 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 است، احضار شوند.


لیست پیاده سازی ها



پیاده سازی های قابل توزیع مجدد رایگان شامل موارد زیر است:
  • CMUCL در اصل از دانشگاه کارنگی ملون که در حال حاضر به وسیله ی کاربران متعدد استفاده می شود. CMUCL از یک کامپایلر اصلی سریع مشهور استفاده می کند و شامل مفسر نمی باشد، به طور گسترده ای از پیاده سازی CL با کد منبع باز استفاده می کند، در Linux و BSD برای اینتل x86 موجود هستند.
  • GNU CLISP
  • Steel Bank Common Lisp) SBCL) یک شاخه از CMUCL است. SBCL با تاکید بیشتر روی قابلیت نگهداری، از CMUCL باز شناخته می شود. SBCL روی محیط CMUCL اجرا می شود بجز HP/UX ؛ به علاوه روی لینوکس برای PowerPC، SPARC و MIPS و روی سیستم عامل Mac اجرا می شود.
  • GNU Common Lisp) GCL) کامپایلر Lisp پروژه ی GNU. GCL هنوز کاملاً آماده ی انجام ANSI نیست ولی پیاده سازیی از انتخاب برای پروژه های بزرگ مختلف شامل ابزارهای ریاضی Maxima و ACL2 است.
  • Common Lisp قابل جاسازی که برای جاسازی شدن در کاربردهای Cطراحی شده است.

  • OpenMCL یک شاخه ی کد منبع باز از Common Lisp مکینتاش. همانطوری که از اسم آن حاکی است، OpenMCL ویژه ی مکینتاش است و روی سیستم عامل Mac، Darwin و یونیکس برای PowerPC اجرا می شود.
  • Movitz محیط Lisp را برای کامپیوترهای x86 بدون تکیه بر سیستم عامل تکمیل می کند.
  • Armed Bear Common Lisp) Armed Bear Lisp) یک نوع پیاده سازی Common Lisp است که روی ماشین مجازی زبان برنامه نویسی جاوا اجرا می شود و شامل کامپایلری برای بایت کدهای زبان برنامه نویسی جاوا است و اجازه ی دسترسی به کتابخانه های جاوا را از Common Lisp می دهد.

همچنین پیاده سازی های موجود غیر رایگانی از Franz، Xanalys، Digitool، Corman و Scieneer وجود دارد.

کاربردها


با وجود انتظارات بزرگ از کمیته ی استاندارد (CL گاهی به عنوان جایگزینی برای C معرفی می شود)، Common Lisp یک زبان برنامه نویسی مناسب باقی ماند، که اغلب در دانشگاه و یا محیط های کاربردی ویژه که در ارتباط با هوش مصنوعی است به کار می رود.
اگرچه، داستان های موفقیت معروفی وجود دارد که حداقل، پتانسیل بزرگی از زبان را در صنعت نشان می دهد. بسیاری از کاربران Common Lisp برای معرفی زبان مطلوب شان مثال آشنای سایت بازرگانی yahoo را می زنند که با Common Lisp گسترش یافته است.
درضمن کاربردهای کد منبع باز موفقی به زبان Common Lisp وجود دارد مثل:

  • acl2، Common Lisp کاربردی، یک ثابت کننده نظریه با تمام خصیصه ها برای زیر مجموعه ای از Common Lisp.
  • Maxima، یکسیستم جبری کامپیوتری خبره.
  • Compo، زبانی که به ساختارهای موسیقی پیچیده اجازه توصیف به یک روش طبیعی را می دهد.
  • Lisa، سیستم تولید قانون برای ساختن نماینده های نرم افزاری "هوش"
این لیست غیر کامل این نظریه را تأیید می کند که Common Lisp وقتی مسائل مشکل مورد بررسی واقع می شوند کاربرد دارد. به علاوه بسیاری از کاربردهای CL

تعداد بازدید ها: 21341


ارسال توضیح جدید
الزامی
big grin confused جالب cry eek evil فریاد اخم خبر lol عصبانی mr green خنثی سوال razz redface rolleyes غمگین smile surprised twisted چشمک arrow



از پیوند [http://www.foo.com] یا [http://www.foo.com|شرح] برای پیوندها.
برچسب های HTML در داخل توضیحات مجاز نیستند و تمام نوشته ها ی بین علامت های > و < حذف خواهند شد..