عبارتهاي لاندا(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 است.
دستورالعملهاي پردازش ليست:
ليسپ دستورالعملهاي زيادي را براي دستيابي و کنترل ليستها فراهم ميکند . ليستها ميتوانند مستقيما با پردازه? ليست ايجاد شوند .ليست هر تعدادي از آرگومانها را ميپذيرد و تعدادي از آرگومانها را بر ميگرداند.
(list 1 2 ‘a 3 ); Output : (1 2 a 3 ) (list 1 ‘(2 3) 4 ); Output : (1 (2 3) 4)
به اين دليل راهي که ليستها ايجادمي شوند از جفتهاي Cons (Car,Cdr) پردازه? Cons ميتواند براي اضافه کردن يک عنصر به جلوي يک ليست استفاده شود. توجه کنيد که پردازه? Cons در هدايت و به کار بردن آرگومانهاي ليست نامتقارن است ، بدين دليل روشهاي ليستها ايجاد ميشوند.
(Cons 1 ‘(2 3)); Output: (1 2 3 ) (Cons ’(1 2) ‘(3 4)) Output : ((1 2) 3 4)
پردازه? Oppend دو يا چند ليست را با هم ادغام ميکند و يک ليست واحد ايجاد ميکند زيرا ليست ليسپ يک لينک ليست است و پيچيدگي زماني الحاق کردن ليستها از مرتبه? پيچيدگي زماني O(n) ميباشد.
ساختار اشتراکي: ليستهاي ليسپ لينک ليستهاي ساده ميتوانند با يکي ديگر از ليستها در ساختمان مشترک باشند به عبارت ديگر دو ليست ميتوانند دم يکساني داشته باشنديا رشته? پاياني از Consهاي يکساني داشته باشند مثلا:
(setf foo (list "a "b "c)) (setf bar (cons "x (cdr foo)))
ليست foo و bar به ترتيب به صورت (a b c) و (X b c ) هستند هرچند دم (b c ) در هر دو ليست ساختار يکساني دارند ولي مانند هم نيستند، خانههاي Cons اشاره گر به b و c در محل حافظه? يکساني براي هردو ليست قرار دارد.
ساختار اشتراکي سريع تر از کپي کردن ميتواند به صورت چشمگيري کارايي را بهبود بخشند. هرچند ، اين مهارت ميتواند متقابلا در راههاي نامطلوب با عملکردهايي که تغييرات ليستهاي گذشته روي آرگومانهاي آن تاثير بگذارد ، اثر کند.
تغييرات يک ليست از قبيل تغيير دادن C با يک goose روي ديگري نيز تاثير ميگذارد setf (third foo) "goose) که اين تغيير نتيجه را به صورت (a b goose) تغيير ميدهد اما bar هم تغيير ميکند (X b goose) که ممکن است يک نتيجه? غير منتظره باشد.