در سال 1970 تحقيقات علمي هوش مصنوعي به شاخههاي تجاري انشعاب پيدا کرد که کارايي سيستم ليسپ موجود در اين زمينه يک روند رو به رشد شد.
ليسپ يک سيستم مشکل براي اجرا، مهارت کامپايلر و سخت افزار ذخيره کننده را در سال 1970 دارا باشد. بازيابي عادي حافظه ، توسط دانشجوي فارغالتحصيل MIT ( دانيل ادوارد ) گسترش داده شده ،که براي اجراي ليسپ روي سيستمهاي محاساتي ساخته شده بود اما راندمان آن هنوز يک مشکل بود. براي رهبري ماشين ليسپ: سخت افزار اختصاصي براي اجراي محيط ليسپ و برنامههاي آن استفاده ميشود. پيشروي در هردو سخت افزار کامپيوتر و فناوري کامپايلر از ماشينهاي ليسپ از کار افتاده الهام گرفته شدهاست.
طي شک کوشش بزرگ نسخههاي بيشماري از زبان ليسپ را در يک زبان واحد متمرکز و متحد کردند(نسخههاي برجسته و قابل ملاحظهاي شامل: اينترليسپ ، مک ليسپ ، متاليسپ ، و فرانزليسپ) زبانهاي جديد (ليسپ عمومي و مشترک ) در اصل يک زير مجموعه? سازگاري از نسخههاي تعويض شده بود. در سال 1994 ، ANSI يک ليسپ عمومي و مشترک استاندارد منتشر کرد. ليسپ عمومي و مشترک زبان برنامه نويسي فناوري اطلاعات ANSI X3.226-1994 در آن زمان فروشگاههاي جهاني براي ليسپ خيلي کوچکتر از المان بود.
ترکيب و معنا شناسي:
ليسپ يک عبارت جهتدار است ، برخلاف بيشتر زبانهاي ديگر ، بين عبارتها و جملهها تمايز و فرقي وجود ندارد . همه? کدها و دادهها به عنوان عبارتها نوشته شدهاند – زماني که يک عبارت ارزيابي ميشود يک مقدار ( يا يک ليستي از مقادير) را ميسازد ، که آن هم در داخل عبارات ديگر جاسازي ميشود.
مقاله? 1958 مک کارتي دو نوع از ترکيبها را معرفي کرد: عبارت نمادين Sexps هم ناميده ميشود ، که بازتابي از نمايش داخلي کدها و داده هاست و عبارت غير نمادين هرگز مورد توجه قرار نگرفت و تقريبا همه? زبانها امروزه از عبارات نمادين استفاده ميکنند.
استفاده از پرانتزگذاريها تفاوت بسيار آشکار و مشهودي ميان ليسپ و ديگر زبانهاي برنامه نويسي ايجاد کردهاست . اسم مستعار LISP از Lost In Stupid Parenthese و يا Lost of Irritating Supper fluous parenthese گرفته شدهاست . هرچند ترکيب عبارتهاي نمادين مسئولي براي توان ليسپ است ، اين ترکيب به شدت با قاعده و منظم است.
هرچند ترکيبات ليسپ به نمادگذاري قديمي محدود نشدهاند ميتواند به سبکهاي ديگر توسعه پيدا کند. تکيه روي عبارتها ، قابليت انعطاف پذيري زيادي به زبان ميدهد ، زيرا توابع ليسپ به صورت ليست نوشته شدهاند ، آنها دقيقا مانند دادهها ميتوانند پردازش شوند، اين قابليت اجازه ميدهد برنامههاي ليسپ به سادگي و راحتي نوشته شوند و به نسبت برنامههاي ديگر به راحتي اداره شوند . (برنامه نويسي غير نمادين)بسياري از نسخههاي زبان ليسپ با عناصر جدا شده توسط فاصلههاي سفيد و پرانتزگذاري شدهها نوشته ميشود. براي مثال (1 2 f00 ) يک ليست است که عنصرهاي آن سه اتم هستند ( اتم: کوچکترين عضو ليست ) : اين مقادير 1 و 2 و F00 هستند. اين مقادير ضمنا داراي نوع دادهاي خاصي هستند ، مثلا اين ليست داراي دو عدد صحيح 1 و 2 و يک نوع داده? ويژه? ليسپ که يک Symbol يا نماد ناميده ميشود.
همچنين يک ليست خالي () به عنوان يک اتم ويژه? صفر و يا پوچ معرفي شدهاست. موجوديت يک ليسپ از اتم و ليست تشکيل ميشود. عباتها به عنوان ليست نوشته شدهاند ، استفاده کردن از ثبتهاي پيشوندي ، عناصر ابتدايي در ليست نامي از يک شکل تابع ، عملگرها ، ماکروها و يا اپراتورهاي ويژهاست.
آرگومانها باقيماندههايي از ليستها هستند ، براي مثال تابع list آرگومانها را به عنوان يک ليست بر ميگرداند ، بنابراين عبارت (list ‘1 ‘2 ‘foo) ارزيابي ميشود و حاصل اين ارزيابي ليست (1,2,foo) ميباشد.
نيازي به ارزيابي کردن اعداد نيست چون ارزيابي عدد 1 عدد 1 ميشود.آرگومانهاي مثال قبل از اعداد هستند يعني آرگومانهاي ويژه که اين آرگومانها از ارزيابي کردن آرگومانها جلوگيري ميکنند چون مقادير آنها مشخص است.هر عبارتي که بيان ميشود قبل از اينکه با عبارات ديگر پيوست داده شود به صورت بازگشتي ارزيابي ميشود.
(list(1 2 (list(3 4)))) در اين مثال حاصل اررزيابي به صورت ليست (1,2(3,4)) ميباشد ،توجه کنيد اين ليست داراي 3 آرگومان ميباشد ، ليستها ميتوانند به صورت تو در تو باشند . اپراتورهاي حسابگر به صورت همسان رفتار ميکنند.
حاصل عبارت (+1 2 3 4 ) عدد 10 ميباشد. عبارت معادل عبارت بالا به صورت 1+2+3+4 ميباشد که از نشانگذاري ميان وندي استفاد شدهاست. اپراتورهاي حسابگر در زبان ليسپ variadic(n-ary) که زبان ليسپ توانايي پذيرفتن هر تعداد آرگومان را داراست.
عملگرهاي ويژه ساختمان کنترل ليسپ را آماده ميکنند. براي مثال ، اپراتور ويژه if سه آرگومان ميپذيرد،اگر اولين آرگومان صفر و يا خالي باشد دومين آرگومان ارزيابي ميشود و در غير اين صورت ه?رگومان سوم بررسي ميشود . بنابر اين if(nill(list 1 2 “foo”)(list 3 4 “bar”) که تنها آرگومان (list 3 4 “bar”) بررسي ميشود.
عبارتهاي لاندا(Lambda) :
ديگر عبارتهاي ويژه لاندا ميباشد که براي وصل کردن متغيرها به مقاديرشان که درون يک عبارت ارزيابي ميشوند استفاده ميشود. اين عملگر همچنين براي ايجاد کردن توابع هم استفاده ميشود. آرگومانهاي درون لاندا يک ليستي از آرگومانها هستند و عبارت ارزيابي توابع ميباشند. مقادير بازگشتي مقاديري از عبارت قبلي که ارزيابي شدهاند هستند.
عبارت (Lambda(arg)(+arg1)) زماني که اين تابع به کار برده ميشود به صورت يک تابع ارزيابي ميشود و وظيفه? اين تابع معرفي کردن يک آرگومان و اتصال دادن آرگومان به arg و در نهايت برگرداندن يک عدد بزرگتر از آرگومان قبلي ميباشد عبارتهاي لاندا خيلي متفاوت با نام تابع رفتار نميکند بنابراين اگر در عبارت (Lambda(arg)(+arg1))5->6 عدد 5 را وارد کنيم خروجي آن 6 ميشود. اتمها : در نسخه? اصلي ليسپ دو نوع داده? ابتدايي وجود دارد: اتمها و ليستها يک ليست يک رشته? منظم و محدودي از عناصر ميباشد ، که هر عنصر در درون خودش يکي از اين اتمها و يا ليستها را دارد و يک اتم يک عدد يا يک نماد ميباشد.
در اصل يک نماد يک رقم منحصر به فرد ميباشدو به عنوان يک رشته? عددي در سورس کد نوشته شده و هر دو به عنوان يک نام متغير و يک رقم دادهاي در پردازش نمادين استفاده ميشود براي مثال list(foo(BAR 1)2) شامل سه عنصر : Symbol foo و list(BAR 1) و عدد 2 ميباشد. تفاوت اصلي بين اتمها و ليستها اين است که اتمها تغيير ناپذير و منحصر به فرد ميباشند. دو اتم که دقيقا به يک صورت و به يک روش در يک شي نوشته شده باشد در مکان متفاوتي در سورس کد ظاهر ميشوند، هر ليست يک شي مجزا ميباشد و به خاطر اينکه مستقل از ديگر ليست هاست و از ديگر ليستها به وسيله? مقايسه? عملگرها مشخص ميشود.
Consها و ليستها:
يک ليست ليسپ يک لينک ليست جداست، هر ذره از اين ليست يک Cons ناميده ميشود و از دو اشاره گر که Car و Cdr ناميده ميشوند ترکيب شدهاست اين دو اشاره گر به ترتيب معادل دو فيلد Data و Next در مقاله? لينک ليست ميباشد.
Car -> Data Cdr -> Next
بسياري از ساختمان دادهها ميتوانند ترکيبهايي از خانههاي Cons را داشت باشند ، يکي از اين ساختمان دادههاي ابتدايي ليست مخصوص ناميده ميشود ، يک ليست مخصوص هر دو نماد ليست خالي nill و يا خانهها Cons را داراستکه در هر يک از اين خانهها هر اشاره گر Car به يک داده اشاره ميکند (که ممکن است اين اشاره گر Cons به يک ليست اشاره کند) و يک اشاره گر Cdr به يک ليست مخصوص ديگر اشاره ميکند. اگر يک Cons داده به سر يک لينک ليست برده شود سپس اشاره گر Car آن به اولين عنصر از ليست و اشاره گر Cdr آن به انتهاي يک ليست اشاره ميکند به همين دليل عملکرد Car و Cdr را به ترتيب first و rest هم ناميده ميشود.
ارايه? ليست عبارت نمادين:
نمايش پرانتزگذلري عبارت نمادين ساختمان لينک ليست . چندين راه براي نمايش ليست يکسان به عنوان يک عبارت نمادين وجود دارد . يک خانه (Cons ) ميتواند به صورت نشان گذاري جفت نقطه گذاري شده نوشته شود به عنوان مثال (a.b) که در آن a يک Car و b يک Cdr است. يک ليست مخصوص بلند ممکن است به صورت يک نشان گذاري جفت نقطه گذاري شده نوشته شود .(a.(b.(c.(d.nill))))
طبق قرارداد کوتاه شده? عبارت بالا به صورت (a b c d ) در نمادسازي ليست ميباشد يک ليست مخصوص ممکن است در يک ترکيبي از دو صورت (a b c.d) نوشته شود . براي سيستمي از سه Cons که آخرين Cdr آن d است.