صفحه 1:

صفحه 2:
‎eT S|‏ ا ل ا ‎lisp ‎

صفحه 3:

صفحه 4:
جان مک کارتی و دانشجویانش اولین بار در سال 1958 براي پیاده سازي لیسپ شروع به کار کردند. بعد از زبان فرترن زبان لیسپ يکي از قدیمی ترین زبانهاست که هنوز هم در حال استفاده است آنچه بیشتر قابل توجه است اين است که هنوز جلودار تكنولوژي زبان هاي برنامه سازي می باشد. ۱ پرنامه نویسانی که با زبان لیسپ آشنا هستند به شما خواهند گفت که این زبان به صورت مجزا ایجاد شده است. چيزي که زبان لیسپ را متمایز و مشخص می کند این است که براي رشد و تکامل طراحی شده است. شما می توانید از لیسپ براي تعیین اپراتورهاي جدید لیسبپ استفاده کنید.

صفحه 5:

صفحه 6:
زبان لیسپ از توابع و ماکروها , همانند برنامه هاي ما ساخته شده است. بنابراین مشکلی براي توسعه زبان لیسپ براي نوشتن برنامه هاي ما وجود ندارد. به این روش برنامه نویسی پایین- بالا( 1۵00 - 00۷۷ ) گفته می شود. یک برنامه پایین - بالا میتواند به عنوان یک سري از لايةنها توشتة شتود كه هر لأيه«وظيفة :مرجب ساري:زيان ترامه .ستاو لايه ي بالایی را دارد. كلا اين زبان بصورت لايه اي كار مى كند و شما مى توانيد بر روي لايه هاي قبلى لايه اي جديد بسازيد.

صفحه 7:
فرم ( ۳۵۲۳۸ )

صفحه 8:
هر سیتم لیسپ شامل یک روش محاوره ي جلو - عقب ( ۴۳۵۸۲-۵0۵ ]خواهد بود که به آن سطح بالا گفته می شود. یعنی شما عبارات را در سطح بالا وارد می کنید و سیتم مقدار آنها را نشان ‎wo‏ لیسپ معمولا پرامپتی را نشان می دهد که به شما مى كويد منتظر وارد شدن عبارات می باشد. اکثر پیاده سازي هاي زبان لیسپ از < براي نشان دادن پرامپت سطح بالا استقاده مى کنند.

صفحه 9:
یک نمونه ي ساده از عبارت لیسپ که یک مقدار عدد صحیح است در زیر نشان داده شده است اگر ما در پرامبت مقدار 1 را وارد کنیم: 1 > 1 < ‎musa‏ مقدار ‎Gl‏ را چاب خواهد کرد و در ادامه نمایش برامیت مانکر آماده بودل براي ورود تبارات دبکر اس

صفحه 10:
در زندگی روزمره ما عمل جمع را به صورت 3+2 نشان می دهیم اما در لیسب اپراتور + ابتدا و او ارگومانها بعد از آن ‎Sul cna‏ تمام عبارات در یک جفت پرانتز قرار می گیرند. به این روش نشانه گذاري0۳6۵ گفته می شود ,در حقیقت این نوع نشانه گذاري یکی از بهترین قابلیت هاي زبان لیسپ است.

صفحه 11:
در لیسپ فقط آرگومانها را با یکدیگر جمع می کنیم: ۲ )43 2 +( کرش تداول ااستتاد ار ۱ فقط اي دو ارگومان اسفادی مي 22 50 چپ و یکی سمت راست. نشانه گذاري *0۳۵ انعطاف پذیر است یعنی در لیسپ به اپراتور + می توان هر تعداد آرگومان داد. < )+( 0 < )+ 2( 2 < )+ 2 3( 5 < )+ 2 3 4( 9 < )+ 23 4 5( 14

صفحه 12:

صفحه 13:
در قسمت قبل ما عبارات را در سطح بالا وارد کردیم و لیسپ مقدار آنها را نشان داد. در لیسپ + یک تابع است و عباراتی مانند (32+) یک فراخوانی تابع است. وماق كه ليبسو نرق قراغوانی عابع:زا اززناتی عتی کید این کار در دو مرحله انجام می شود: 1 ابتدا آرگومانها از چپ به راست ارزیابی می شوند . در این مورد آرگومانها به مقدار خود ارزیابی می شوند.یعنی مقدار آرگومانها به ترتیب 3 و 2 است. 2. ففادیز آرگومانها : از تایع که به آن ایزاتوز گفته فی شود عبورمی کنند و مقدار انها برگردانیده میشود . در مثال بالا تابع + مقدار 5 را بر می گرداند.

صفحه 14:
بنابراین زمانی که (/ (- 7 1) (- 4 2)) ارزیابی شد , اتفاقاتی که رخ می دهد شامل: (-71) را ارزیابی می کند: 7 به 7 ارزیابی شده و 1 به 1 ارزیابی ‎Wo‏ شود. این مقادیر بعد از عبوراز تابع - مقدار 6 را برمی گرداند. (-42) را ارزیابی می کند: 4 به 4 ارزیایی شده و 2 به 2 ارزیابی ‎Wo‏ شود.این مقادیر بعد از عبور ازتابع - مقدار 2 را بر مى گرداند. مقدار 6 و 2 به تابع / فرستاده شده و مقدار 3 برگردانده می شود. به این روش قانون ارزیابی درم15ا 60۳0۳۵۳ گفته می شود.

صفحه 15:
‎plas‏ اپراتور ها در زبان لیسب تابع نیستند ولی اکثر آنها تابع ‏می باشند. ‎ ‏اپراتوري که از قانون ارزیابی لیسپ پيروي نمی کند 0۷066 می باشد. ‏اپراتورع00۴ یک اپراتور ویژه است یعنی یک قانون ارزیابی متمايزي از آن خود دارد ‏و آن قانون : انجام هیچ چیز است.

صفحه 16:
در مثال زیر اپراتور یک آرگومان گرفته و آن را کلمه به کلمه برمی گرداند. ‎(quote (+ 3 5((‏ > )5 3+( براي راحتی لیسپ " را به عنوان مخفف00۲6 تعریف کرده . شما می توانید با قرار دادي " جلوي هر عبارت 0016 را فراخوانی کنید. (53 +)'< (53 +) استفاده از علامت اختصاري بجاي نوشتن عبارت 0006 بیشتر رایج است: ليسب 00056 را به عنوان راهى براي حفاظت عبارات از ارزیابی فراهم کرده است.

صفحه 17:
داده ها ( ۱۵۲۵5 )

صفحه 18:
یک نوع داده اي دیگر در لیسپ همانند دیگر زبانها وجود دارد 9 می باشد که يكسري از کاراکتر ها را همراه با ‎double-quotes‏ نشان‌داده مشود مانند “hello” دو نوع داده اي لیسپ که ما نمی توانیم در دیگر زبانها پیدا کنیم سمبول ها و لیست ها هستند. سمبول ها کلمات هستند. Artichoke' ARTICHOKE صرف نظر از اينكه شما جكونه آنها را تايب مى كنيد معمولا آنها به حروف بزرك تبديل مى شوند. سمبول ها معمولا به مقدار خود ارزيابى نمى شوند بنابراين اكر شما بخواهید از یک سمبول استفاده کنید باید قبل از آن از 6 استفاده کنید.

صفحه 19:
لیست ها نشان دهنده ي هیچ و یا تعداد زيادي عنصر در میان پرانتز ها هستند. عنصر ها می توانند از هر نوعی از جمله لیست ها باشند. ("my 3 "Sons)' < ("MY 3 "Sons) (the list (a b c) has 3 elements)' < (THE LIST (A B C) HAS 3 ELEMENTS) شما مى توانید با فراخوانی 5۴| لیستهایی را ایجاد کنید. از آنجایی که لیست یک تابع می باشد آرگومانهاي آن ارزیابی می شوند. در اینجا ما فراخوانی + را داخل فراخوانی به یک ‎com‏ می بینیم > (list 'my (+ 2 1) "Sons") (MY 3 "Sons")

صفحه 20:
اگر قبل از لیست000۴6 آمده باشد ارزیابی کننده خود لیست را برمی گرداند , اما اگروجود نداشته باشد ازریابی کننده مقدار لیست را برمی گرداند. (list (+ 2 1( )+ 2 1(( > )3 )12 +)) در اینجا اولین آرگومان داراي00086است و بنابراین خروجی یک ت است. آرگومان دوم ۷606 ندارد وبعد از فراخوانی تابع یک عدد بر دانده می شود.

صفحه 21:
دو راه براي نشان دادن لیست هاي خالی وجود دارد : شما می توانید بوسیله یک جفت پرانتز که چيزي بین آنها نیست یک لیست خالی را نمایش دهید . با شما مى توانيد از سمبول | استفاده کنیذ: > NIL

صفحه 22:
ايراتورهاي( 006۵۲۵۲۱۵0۱5 ۱۲151 ( 2 rel =

صفحه 23:
ساخت یک لیست توسط تابع :60۳5 گر آرگومان دوم یک لیست باشد , این تابع یک لیست جدید که از اضافه کردن آرگومان اول به بقیه عناصر ایجاد می کند. (cons ‘a ' (bc d)) > (ABCD) ما می توانیم لیست هایی توسط عناصر جدید 0۳85»برروي یک ‎Se ow‏ بسازیم. > (cons ‘a (cons ‘b nil)) (A B) > (list'a'b) (A B)

صفحه 24:
توابع اولیه براي استخراج عناصر از داخل لیستها ۵۲ و 60۲ هستند. ۲۳ اولین عنصر یک لیست و 60۲ هر چيزي که بعد از عنصر اول باشد را بر می گرداند. ))2۲ ")۵ ۲ 0(( > A (cdr ‘(a bc)) < (BC) اگر شما بخواهید که عنصر سوم را بدست آورید می توان گفت: ‎(third ‘(a b c d)) <‏ ‎c‏

صفحه 25:
truth)) ‏درستی‎ ۳ VA”

صفحه 26:
در ‎Common Lisp t‏ بطور پیش فرض براي نمايش درستى بكار می رود. تابعى كه مقادير را بصورت درست يا غلط برمی گرداند ۴۳۵۵۱6۵۴6 نامیده می شود. 6 هایزبان! یسباغلبداراین امهاییکه آخر آنها ۵ استمیب‌اشند. ‎SUSE wl gles | FI‏ لیست باشندمقوار درسب برگزذانوهس,شود. ‎(listp "(a bc ))<‏ ‎T ‏غلط بودن در م5أا 00۳۱۳۱0۵۳ , بوسیله |" لیست خالی نشان داده می شود. اكر ما به تابع وا آرگومانی که لنست نیست تخویل بدهیم مقدار اه برگردانده می شود. ‎(listp 27) < ‎NIL | ‎null gli‏ در صورتیکه لیست خالی باشد مقدار درست بر می گرداند ‎(null nil)‏

صفحه 27:
‎glade not gli‏ درست برمى كرداند اكر آركومان آن غلط باشد. ‎(not nil) < T ‏یک شرط ساده در لیسپ 1۴ مق باشد. این فعولا شه آرگومان می گیزد: عبارت ]65و عبارت 060 و عبارت 56ا». ‏عبارت 8656 ارزیابی شده در صورتی که مقدار درست برگرداند عبارت 20 ارزیابی می شود. ‏در صورتیکه عبارت ۴695۴ مقدار ۶۵156 برگرداند سپس عبارت 56اه “ارزيابى شده و مقدار آن بركردانده مى شود.

صفحه 28:
‎quote if, sil‏ یک اپراتور ویژه است. ‏این اپزاتوزر بسن بواند.تصورت :یک تابع اجرا شود چزا که آرگوفانیا: در فراخوانی تابع معمولا ارزیابی می شوند ء در حالی که در 1۴ تنها یکی از دو آرگومان انتهایی ارزیایی می شوند. ‏| اگرچه 8 بصورت پیش فرض براي نشان دادن درستی بکار می رود , هر چيزي ‎nil jo wv /‏ به عنوان شمارش درست در چارچوب منطقی نیز بکار می رود.

صفحه 29:
اپراتورهاي منطقی 800 و ۵۲ به شرطی ها شباهت دارند. هر دوي آنها تعدادي آرگومان می گیرند ولی فقط تعدادي از آنها یی که مقدار برگرداند ارزیابی می شوند. اگر همه ي آرگومانها درست باشند (یعنی !الا نباشد) سپس 200 مقدار آخرین آنرا برمی گرداند. (and t(+ 1 2(( > 3 اما اگر معلوم شود یکی از آرگومانها اشتباه است هیچ یک از آرگومانها بعد از آن ارزيابى نمى شود. به همين ترتيب براي #© با وجود درست بودن يكى از آركومانها انجام شود.

صفحه 30:
tA 8 Functions ) aslo— wf ‏كاج‎ 2 م۱2

صفحه 31:
شما مى توانيد تابع جديدي با 06۴00 تعریف کنید. معمولا سه و یا تعداد بيشتري آرگومان می گیرد: یک نام , یک لیست از پارامترها و یک یا تعداد بيشتري از عبارات که بدنه ي تابع را خواهند ساخت. ۱ در اینجا توسط تابع , بدست آوردن سومین عنصر را تعریف می کنیم: > (defun our-third (x) (car (cdr (cdr x)))) OUR-THIRD

صفحه 32:
> (defun our-third (x) (car (cdr (cdr x)))) OUR-THIRD ولین آرگومان می گوید که اسم این تابع 0۷۳-۳۱۲4 خواهد بود. دومین ا 0 1 x یک سمبول است که به عنوان یک نگهدارنده ي مکانی که دراینجا متغیر نامیده می شود . ‎wo‏ پاش زمانیکه متعییی برای نمایشی يك اومان ميك تلع بكار فى رود مانند آنرا پارامتر می نامیم. ‏دنباله ي تعریف ‎sg ax lois a car (cdr (cdr x))‏ تابع شناخته شده است. این قسمت کاري که لسیت براي محاسبه ي مقدار برگشتی تابع انجام می دهد را مشخص می کند. بنابراین فراخوانی 00۳-۵0۲0 برگرداندن(60۲) ‎car (cdr‏ (< براي هر مقدا که به عنوان آرگومان به آن می.دهیم است.

صفحه 33:
ر عبارات زیر بررسی می شود که آبا جمع 1 و 4 بزرگتر از 3 است: (3 (41 +) <)< 1 با جایگزین كردن این اعداد با متفیر ها ما می توانیم تابعی بنویسیم که بررسی کند جمع دو عدد بزرگتر از سومین عدد است: defun sum-greater (x y 2(( > ))2 0۱۷ +) <) SUM-GREATER (sum-greater 1 4 3) < T

صفحه 34:

صفحه 35:

صفحه 36:
(defun our-member (obj Ist) (if (null Ist) nil (if (eq! (car Ist) obj) Lst (our-member obj (cdr Ist))))) > (our-member ’b ’(a b c)) (BC) > (our-member ’z’(a b c)) NIL در تعریف 0۷۲-۳0610۳6۲ برابر بودن حروف بررسی می شود. براي تست اینکه هر شی 0اه یک عضو لیست میباشد: ایتدا بررسی می شود که ۱5۴ خالی است. اگر آن خالی است آنگاه به وضوح معلوم است که زا یک عضو آن نمی باشد و هیچ كاري انجام نمی شود.

صفحه 37:
= ‏بج‎ \\( Input and Output ).>55> 9529 79 » | ی حول(

صفحه 38:
تاکنون ما ورودي و خروجی را بصورت ضمنی با بهره گيري از سطح بالا انجام دادیم این روش براي برنامه هاي محاوره اي واقعی به احتمال زیاد کافی نمی باشد. ۲ کعمومیت رینت ابع خروجیدر زبان‌لیسپمیب اشد. این تابع دو یا تعداد بيشتري آرگومان می گیرد: اولي نشان می دهد که خروجی کجا باید چاپ شود , دومین آرگومان نشان دهنده ي قالب رشته می باشد و آرگومانهاي باقیمانده معمولا اشیایی هستند که در جاهاي مشخص شده در داخل قالب چاپ می شوند.

صفحه 39:
(format t "~A plus ~A equals ~A~%"2 3 (+ 2 3)) < plus 3 equals 5 2 NIL اولینآرگومان ۲0۲۳۵3 نشان‌می‌دهد که خروجی‌درجايپ یش فرض فرستاده شود. آرگومان‌دوم یک‌رشته استکه به عنوانبکقالي راي خروجیی کار میرود. در بين اين رشته هر -8 نشان دهنده ي مکانی است که باید پر شود %~ نشان دهنده ي یک خط جدید می باشد. این مکانها توسط مقادیر آرگومانهاي باقی مانده به ترتیب پر خواهد شد.

صفحه 40:
تابع استاندارد براي ورودي می باشد. زمانی که هیچ آرگومانی داده نمی شود این تابع از مکان پیش فرض می خواند , که معمولا سطح بالا می باشد. در اینجا تابعی وجود دارد که از پرامیت , ورودي کاربر را گرفته و هر آنچه را که گرفته بر می گرداند.

صفحه 41:
defun askem (string)) (format t "~A" string) ((read) اجراي آن به صورت زیر می باشد: (" ?askem "How old are you) < How old are you? 29 29

صفحه 42:
متغیرها ( ۷۵۲۱۵۵۱65 ) ( و = 1 ie 7

صفحه 43:
یکی از اپراتورهایی که معمولا در ‎Gu‏ استفاده می شو ۱6۴ است , که به شما اجازه تعریف متغيرهاي محلی جدید را می دهد: let ((x 1) (y 2))) < (cy +) 3 یک عبارت ۱6۴ دو بخش دارد. ابتدا لیستی از دستورالعمل ها براي ایجاد متغیرها براي هر نوع فرمی می آید. هر متغیر در ابتدا توسط عبارت نظیر خود مقدار دهی می شوند. همانطور که در مثال بالا ما دو متغیر كا و ۷ ایجاد بعد از متغیرها و مقادیر بدنه عبارت می آید که براساس قوانین ارزیابی می شوند , که در مورد مثال قبل تنها یکی وجود دارد و آن فراخوانی + است .۰ مقدار آخرین عبارت به عنوان مقدار ‎let‏ ‏بازگردانده می شود.

صفحه 44:
(defun ask-number () (format t "Please enter a number. ") (let ((val (read))) (if (numberp val) val (ask-number)))) اين تابع متغيري به اسم ۷۵۱ براي نگهداشتن شی اي که توسط ۲۵۵0 برگدانده می شود ایجاد می کند. 0۷۵۳6۵۲۵ یک 0۲6۵۵168۵6 است براي تست اینکه این آرگومان یک عدد است بکار می رود. اگر مقداري که توسط کاربر وارد می شود یک عدد نباشد 251-۴0۳0۳66۲ خود را فراخوانی می کند.

صفحه 45:
متغيرهاي محلی فقط در یک محدوده ي مشخص معتبر می باشند. نوع ديگري از متغیرها وجود دارد که متغیر سراسري نامیده می شود که می تواند در هرکجایی قابل دسترسی باشد. شما با دادن یک سمبول و یک مقدار به 06۴5۵۲۵۲06۲6۲ می توانید یک متغیر سراسري ایجاد کنید.

صفحه 46:
(defparameter *glob* 99) < چنین متغيري در هر جایی قابل دسترسی خواهد بود به جز در عباراتی که متغیر هاي محلی جديدي با همین نام ایجاد شده باشد. براي جلوگيري از اين اتفاق که بصورت تصادفی رخ مى دهد ابتدا و انتهاي نام متغيرهاي سراسري را با علامت * نشان می دهند. نام متغيري که ما ایجاد کردیم"510۲-9۱00-5]3۲"تلفظ می شود .

صفحه 47:
‎wo Law‏ توانید ‎defconstanwilsls L‏ ثابت هاي سراسري تعریف کنید. ‏اگر شما بخواهید بررسی کنید که هر سمیول یک متفیر سراسري ویا یک ثابت است از00۷۴00 استفاده می ‎(*boundp '*glob) < T ‎

صفحه 48:
( Assignment? Luiil 0۳| Wane AN

صفحه 49:
در زبان لیسپ به طور کلی از اپراتور56۷۴ براي انتساب استفاده می شود. ما می توانیم براي انتساب هر نوع متفيري از آن استفاده کنیم (setf *glob* 98) < 98 < زمانی که اولین آرگومان به ]56 داده می شود یک سمیولی که نام آن یک متفیر محلی نمی باشد به عنوان یک ‎patio‏ ‏سراسري گرفته می شود.

صفحه 50:
شما می توانید بیش از انتساب یک مقدار به متغیر انجام دهید. آرگومان اول برايا56 می تواند یک عبارت همانند نام یک متغیر باشد. (setf (car x) 'n) < N x< (N BC)

صفحه 51:
یک عپار موه پم ایتصورت ی پاش setf a b) cd (ef با سه بار فراخوانى جدا6غ©5 به ترتيب برابراست: ‎(setf a b)‏ ‎(setf c d)‏ (setf e f)

صفحه 52:

صفحه 53:
ele Paul Graham.1996. ANSI Common Lisp

بسم الله اموزش زبان برنامه نویسی ‏lisp مقدمه جان مک کارتی و دانشجویانش اولین بار در سال 1958براي پیاده سازي لیسپ شروع به کار کردند. بعد از زبان فرترن زبان لیسپ یکی از قدیمی ترین زبانهاست که هنوز هم در حال استفاده است آنچه بیشتر قابل توجه است این است که هنوز جلودار تکنولوژي زبان هاي برنامه سازي می باشد. برنامه نویسانی که با زبان لیسپ آشنا هستند به شما خواهند گفت که این زبان به صورت مجزا ایجاد شده است. چیزي که زبان لیسپ را متمایز و مشخص می کند این است که براي رشد و تکامل طراحی شده است. شما می توانید از لیسپ براي تعیین اپراتورهاي جدید لیسپ استفاده کنید. تکنیک هاي جدید زبان لیس@پ از تواب@ع و ماکروه@ا ،همانن@د برنام@ه هاي م@ا ساخته شده است. بنابرای@ن مشکل@ی براي توس@عه زبان لیس@پ براي نوشت@ن برنام@ه هاي ما وجود ندارد .ب@ه ای@ن روش برنام@ه نویس@ی پایین -باال( ) down - top گفت@ه م@ی شود .ی@ک برنام@ه پایی.ن – باال میتوان@د ب@ه عنوان ی@ک سري از الی@ه ه@ا نوشت@ه شود ک@ه ه@ر الی@ه وظیف@ه مرت@ب س@ازي زبان برنام@ه سازي الیه ي باالیی را دارد. کال ای@ن زبان بص@ورت الی@ه اي کار م@ی کن@د و شم@ا م@ی توانی@د بر روي الیه هاي قبلی الیه اي جدید بسازید. ) Form ( فرم هر سیتم لیسپ شامل یک روش محاوره ي جلو – عقب ( ) front-endخواهد بود که به آن سطح باال گفته می شود. یعن@ی شم@ا عبارات را در س@طح باال وارد م@ی کنی@د و س@یتم مقدار آنها را نشان می لیسپ معموال پرامپتی را نشان می دهد که به شما می گوید منتظر وارد شدن عبارات می باشد. اکث@ر پیاده س@ازي هاي زبان لیس@پ از < براي نشان دادن پرامپت سطح باال استفاده می کنند. ی@ک نمون@ه ي س@اده از عبارت لیس@پ ک@ه ی@ک مقدار عدد ص@حیح اس@ت در زیر نشان داده شده است اگر ما در پرامپت مقدار 1را وارد کنیم: >1 1 > س@یستم مقدار آ@ن را چاپ خواه@د کرد و در ادام@ه نمای@ش پرامپ@ت بیانگر آماده بودن براي ورود عبارات دیگر است. در زندگ@ی روزمره م@ا عم@ل جم@ع را ب@ه ص@ورت 3+2نشان م@ی دهیم اما در لیسپ اپراتور +ابتدا و آرگومانها بعد از آن می آیند. تمام عبارات در یک جفت پرانتز قرار می گیرند. ب@ه ای@ن روش نشان@ه گذاري prefixگفت@ه م@ی شود ,در حقیق@ت این نوع نشانه گذاري یکی از بهترین قابلیت هاي زبان لیسپ است. در لیسپ فقط آرگومانها را با یکدیگر جمع می ک@نیم: ()4 3 2 + در روش متداول اس@تفاده از +فق@ط براي دو آرگومان اس@تفاده م@ی شود یک@ی سمت چ@پ و یک@ی س@مت راس@ت .نشان@ه گذاري prefixانع@طاف پذی@ر اس@ت یع@ن@ی در لیس@پ به اپراتور +می توان هر تعداد آرگومان داد. )> (+ 0 )> (+ 2 2 )> (+ 2 3 5 )> (+ 2 3 4 9 )> (+ 2 3 4 5 14 )Evaluation( ارزیابی در قس@مت قب@ل م@ا عبارات را در س@طح باال وارد کردیم و لیسپ مقدار آنها را نشان داد. در لیس@پ +ی@ک تاب.ع اس@ت و عبارات@ی مانن@د ( )+32یک فراخوانی تابع است. زمان@ی ک@ه لیس@پ ی@ک فراخوان@ی تاب@ع را ارزیاب@ی م@ی کند این کار در دو مرحله انجام می شود: .1ابتدا آرگومانها از چپ ب.ه راس.ت ارزیاب@ی می شوند . در ای@ن مورد آرگومانه@ا ب@ه مقدار خود ارزیاب@ی می شوند.یعنی مقدار آرگومانها به ترتیب 3و 2است. .2مقادی@ر آرگومانه@ا ،از تاب@ع ک@ه ب@ه آ@ن اپراتور گفت@ه می شود عبورم@ی کنن@د و مقدار انها برگردانیده میشود . در مثال باال تابع +مقدار 5را بر می گرداند. بنابراین زمانی که ( ))2 4 -( )1 7 -( /ارزیابی شد ،اتفاقاتی که رخ می دهد شامل: ( )71-را ارزیاب@ی م@ی کن@د 7 :ب@ه 7ارزیاب@ی شده و 1ب@ه 1ارزیابی م@ی شود .ای@ن مقادی@ر بع@د از عبوراز تاب@ع – مقدار 6را برمی گرداند. ( )42-را ارزیاب@ی م@ی کن@د 4 :ب@ه 4ارزیاب@ی شده و 2ب@ه 2ارزیابی م@ی شود.ای@ن مقادی@ر بع@د از عبور ازتاب@ع – مقدار 2را بر می گرداند. مقدار 6و 2به تابع /فرستاده شده و مقدار 3برگردانده می شود. به این روش قانون ارزیابی در common lispگفته می شود. تمام اپراتور ها در زبان لیسپ تابع نیستند ولی اکثر آنها تابع می باشند. اپراتوري که از قانون ارزیابی لیسپ پیروي نمی کند quoteمی باشد. اپراتور quoteیک اپراتور ویژه است یعنی یک قانون ارزیابی متمایزي از آن خود دارد و آن قانون :انجام هیچ چیز است. در مثال زیر اپراتور یک آرگومان گرفته و آن را کلمه به کلمه برمی گرداند. ))> (quote (+ 3 5 )(+3 5 براي راحت@ی لیس@پ ' را ب@ه عنوان مخفف quoteتعری@ف کرده ،شم@ا م@ی توانید با قرار دادي ' جلوي هر عبارت quoteرا فراخوانی کنید. > '()5 3 + ()5 3 + استفاده از عالمت اختصاري بجاي نوشتن عبارت quoteبیشتر رایج است. لیس@پ quoteرا ب@ه عنوان راه@ی براي حفاظ@ت عبارات از ارزیاب@ی فراهم کرده است. داده ها ( ) Datas ی@ک نوع داده اي دیگ@ر در لیس@پ همانن@د دیگ@ر زبانها وجود دارد stringمی باشد که یکسري از کاراکتر ها را همراه با double-quotesن@@شانداد@ه م@یش@@ود م@ان@ند “"hello دو نوع داده اي لیس@پ ک@ه م@ا نم@ی توانی@م در دیگ@ر زبانه@ا پیدا کنیم سمبول ها و لیست ها هستند .سمبول ها کلمات هستند. 'Artichoke ‏ARTICHOKE صرف نظر از اینکه شما چگونه آنها را تایپ می کنید معموال آنها به حروف بزرگ تبدیل می شوند. س@مبول ه@ا معموال ب@ه مقدار خود ارزیاب@ی نم@ی شون@د بنابرای@ن اگر شم@ا بخواهی@د از ی@ک س@مبول اس@تفاده کنی@د بای@د قب@ل از آن از quoteاستفاده کنید. لیست ها نشان دهنده ي هیچ و یا تعداد زیادي عنصر در میان پرانتز ه@ا هس@تند .عنص@ر ه@ا م@ی توانن@د از ه@ر نوع@ی از جمل@ه لیس@ت ها باشند. > '()"my 3 "Sons ()"MY 3 "Sons > '()the list (a b c) has 3 elements ()THE LIST (A B C) HAS 3 ELEMENTS شما می توانید با فراخوانی listلیستهایی را ایجاد کنید .از آنجایی ک@ه لیس@ت ی@ک تاب@ع م@ی باش@د آرگومانهاي آ@ن ارزیاب@ی می شوند .در اینجا ما فراخوانی +را داخل فراخوانی به یک لیست می بینیم )"> (list 'my (+ 2 1) "Sons )"(MY 3 "Sons اگر قبل از لیست quoteآمده باشد ارزیابی کننده خود لیست را برم@ی گردان@د ،ام@ا اگروجود نداشت@ه باش@د ازریابی کننده مقدار لیست را برمی گرداند. > ())list '(+ 2 1) (+ 2 1 (()3 )1 2 + در اینج@ا اولی@ن آرگومان دارايquoteاس@ت و بنابرای@ن خروج@ی یک لیست است. آرگومان دوم quoteندارد وبع@د از فراخوان@ی تاب@ع یک عدد بر گردانده می شود. دو راه براي نشان دادن لیست هاي خالی وجود دارد : شم@ا م@ی توانی@د بوس@یله ی@ک جف@ت پرانت@ز ک@ه چیزي بی@ن آنه@ا نیست یک لیست خالی را نمایش دهید . یا شما می توانید از سمبول nilاستفاده کنید. >() ‏NIL ( List Operations )هاي.تور.پرا.ا یست..ل ساخت یک لیست توسط تابع cons: گ@ر آرگومان دوم ی@ک لیس@ت باش@د ،ای@ن تاب@ع ی@ک لیس@ت جدی@د که از اضافه کردن آرگومان اول به بقیه عناصر ایجاد می کند. > ())cons 'a ' (b c d ()A B C D م@ا م@ی توانی@م لیس@ت های@ی توس@ط عناص@ر جدی@د یک لیست خالی بسازیم. ‏consبرروي ))> (cons 'a (cons ‘b nil )(A B )> (list'a'b )(A B توابع اولیه براي استخراج عناصر از داخل لیستها carو cdrهستند. carاولی.ن عنصر یک لیست و cdrهر چیزي که بعد از عنصر اول باشد را بر می گرداند. > ())car '(a b c ‏A > ())cdr '(a b c () B C اگر شما بخواهید که عنصر سوم را بدست آورید می توان گفت: > ())third '(a b c d ‏C truth(( درستی در Common Lisp tبطور پیش فرض براي نمایش درستی بکار می رود. تابعی که مقادیر را بصورت درست یا غلط برمی گرداند Predicateنامیده می شود. ل@@یسپ@غلبدارا@ين@@ام@ه@ای@یک@@ه آ@خر آ@ن@ه@ا pا@س@تم@یب@@@اش@ند. ا Predicateهايز@بان اگر آرگومان تابع listpیک لیست باشد مقدار درست برگردانده می شود. >() )listp ’(a b c ‏T غلط بودن در ، Common Lispبوسیله nilلیست خالی نشان داده می شود. اگر ما به تابع listpآرگومانی که لیست نیست تحویل بدهیم مقدار nilبرگردانده می شود. > ()listp 27 ‏NIL تابع nullدر صورتیکه لیست خالی باشد مقدار درست بر می گرداند )> (null nil ‏T تابع notمقدار درست برمی گرداند اگر آرگومان آن غلط باشد. > ()not nil ‏T یک شرط ساده در لیسپ ifمی باشد .این معوال سه آرگومان می گیرد: عبارت testو عبارت thenو عبارت .else عبارت testارزیابی شده در صورتی که مقدار درست برگرداند عبارت thenارزیابی می شود. در صورتیکه عبارت testمقدار falseبرگرداند سپس عبارت else ارزیابی شده و مقدار آن برگردانده می شود. مانند quote if,یک اپراتور ویژه است. ای@ن اپراتور نم@ی توان@د بص@ورت ی@ک تاب@ع اجرا شود چرا ک@ه آرگومانها در فراخوان@ی تاب@ع معموال ارزیاب@ی م@ی شون@د @،در حال@ی ک@ه در ifتنه@ا یکی از دو آرگومان انتهایی ارزیابی می شوند. اگرچ@ه tبصورت پیش فرض براي نشان دادن درستی بکار می رود ،هر چیزي به جز nilبه عنوان شمارش درست در چارچوب منطقی نیز بکار می رود. اپراتورهاي منطقی andو orبه شرطی ها شباهت دارند. هر دوي آنها تعدادي آرگومان می گیرند ولی فقط تعدادي از آنها یی که مقدار برگردان@د ارزیاب@ی می شوند .اگ@ر هم@ه ي آرگومانه@ا درس@ت باشن@د (یعنی null نباشد) سپس andمقدار آخرین آنرا برمی گرداند. > ())and t(+ 1 2 3 ام@ا اگ@ر معلوم شود یکی از آرگومانه@ا اشتباه اس@ت هی@چ ی@ک از آرگومانه@ا بعد از آن ارزیابی نمی شود. ب@ه همی@ن ترتی@ب براي orب@ا وجود درس@ت بودن یک@ی از آرگومانه@ا انجام می شود. ( Functions ) ع.ب.وا..ت شما می توانید تابع جدیدي با defunتعریف کنید. معموال س@ه و ی@ا تعداد بیشتري آرگومان م@ی گیرد :ی@ک نام ،ی@ک لیست از پارامتره@ا و ی@ک ی@ا تعداد بیشتري از عبارات ک@ه بدن@ه ي تاب@ع را خواهند ساخت. در اینجا توسط تابع ،بدست آوردن سومین عنصر را تعریف می کنیم: ))))> (defun our-third (x) (car (cdr (cdr x ‏OUR-THIRD ))))> (defun our-third (x) (car (cdr (cdr x ‏OUR-THIRD اولی@ن آرگومان م@ی گوی@د ک@ه اس@م ای@ن تاب@ع our-thirdخواه@د بود .دومین آرگومان که لیست ( )xاست می گوید که تابع دقیقا یک آرگومان می گیرد ‏X ی@ک س.مبول اس@ت ک@ه ب@ه عنوان ی@ک نگهدارنده ي مکان@ی ک@ه دراینج@ا متغیر نامیده می شود . م@ی باشد .زمانیک@ه متغیري براي نمای@ش ی@ک آرگومان ی@ک تاب@ع بکار م@ی رود مانند xآنرا پارامتر می نامیم. دنباله ي تعریف () car (cdr (cdr xبه عنوان بدنه ي تابع شناخته شده است. ای@ن قس@مت کاري ک@ه لس@یت براي محاس@به ي مقدار برگشت@ی تاب@ع انجام م@ی دهد را مشخ@ص م@ی کند .بنابرای@ن فراخوانی our-thirdبرگرداندن(car (cdr (cdr ) xبراي هر مقدا Xکه به عنوان آرگومان به آن می دهیم است. در عبارات زیر بررسی می شود که آیا جمع 1و 4بزرگتر از 3است: >(> ()3 )4 1 + ‏T با جایگزین کردن این اعداد با متغیر ها ما می توانیم تابعی بنویسیم که بررسی کند جمع دو عدد بزرگتر از سومین عدد است: > ()defun sum-greater (x y z (> ())z )x y + ‏SUM-GREATER > ()sum-greater 1 4 3 ‏T نکته: لیسپ هیچ فرقی بین یک برنامه ،یک زیربرنامه و یک تابع نمی داند . ( Recursion )گشتی.از..ب )(defun our-member (obj lst )(if (null lst ‏nil )(if (eql (car lst) obj ‏Lst )))))(our-member obj (cdr lst ))> (our-member ’b ’(a b c )(B C ))> (our-member ’z’(a b c ‏NIL در تعریف our-memberبرابر بودن حروف بررسی می شود .براي تست اینکه هر شی objیک عضو لیست lstم@یب@@@اشد: ابتدا بررسی می شود که lstخالی است .اگر آن خالی است آنگاه به وضوح معلوم است که objیک عضو آن نمی باشد و هیچ کاري انجام نمی شود. ( Input and Output )جی.يو خرو.ورود تاکنون م@ا ورودي و خروج@ی را بص@ورت ضمن@ی با بهره گیري از س@طح باال انجام دادی@م ای@ن روش براي برنامه هاي محاوره اي واقعی به احتمال زیاد کافی نمی باشد. ‏Formatعموم@یت@@@ری@نت@@@اب@ع@ خ@رو@ج@یدر ز@بانل@@یسپم@یب@@@اشد. ای@ن تاب@ع دو ی@ا تعداد بیشتري آرگومان م@ی گیرد :اولی نشان م@ی ده@د ک@ه خروج@ی کج@ا بای@د چاپ شود ،دومین آرگومان نشان دهنده ي قال.ب رشت.ه م@ی باشد و آرگومانهاي باقیمانده معموال اشیای@ی هس@تند ک@ه در جاهاي مشخ@ص شده در داخل قالب چاپ می شوند. > ())format t "~A plus ~A equals ~A~%"2 3 (+ 2 3 ‏plus 3 equals 5 2 ‏NIL ‏tاو@ل@ی@نآر@گومان formatن@شانم@ید@ه@د ک@@ه خ@رو@ج@یدر@جايپ@@@یش ف@@رض فرس@تاد@ه ش@@ود .آر@گوماندو@م ی@@کر@ش@ت@ه ا@س@تک@@ه ب@@@ه عنوا@نی@@کق@@ا@لبب@@@را@ي خروجیب@@@کار م@یرود. در بی@ن ای@ن رشت@ه ه@ر ~ Aنشان دهنده ي مکان@ی اس@ت ک@ه بای@د پر شود ~%نشان دهنده ي ی@ک خ@ط جدی@د م@ی باشد .ای@ن مکانه@ا توس@ط مقادیر آرگومانهاي باقی مانده به ترتیب پر خواهد شد. Readتاب@ع اس@تاندارد براي ورودي م@ی باشد .زمان@ی ک@ه هیچ آرگومان@ی داده نم@ی شود ای@ن تاب@ع از مکان پی@ش فرض می خواند ،که معموال سطح باال می باشد. در اینج@ا تابع@ی وجود دارد ک@ه از پرامپت ،ورودي کاربر را گرفته و هر آنچه را که گرفته بر می گرداند. defun askem (string)( )format t "~A" string( ))read( :اجراي آن به صورت زیر می باشد )" ?askem "How old are you( > How old are you? 29 29 ( Variables ) تغیرها.م یکی از اپراتورهای@ی که معموال در لسیپ اس@تفاده می ش@و letاست ، که به شما اجازه تعریف متغیرهاي محلی جدید را می دهد: > ())let ((x 1) (y 2 ())x y + 3 یک عبارت letدو بخش دارد .ابتدا لیستی از دستورالعمل ها براي ایجاد متغیره@ا براي ه@ر نوع فرم@ی م@ی آید .ه@ر متغی@ر در ابتدا توسط عبارت نظی@ر خود مقدار ده@ی م@ی شوند .همانطور ک@ه در مثال باال م@ا دو متغیر xو yایجاد بع@د از متغیره@ا و مقادی@ر بدن@ه عبارت م@ی آی@د ک@ه براساس قوانی@ن ارزیاب@ی م@ی شون@د ،ک@ه در مورد مثال قب@ل تنه@ا یکی وجود دارد و آ@ن فراخوان@ی +اس@ت .مقدار آخری@ن عبارت به عنوان مقدار let بازگردانده می شود. )( (defun ask-number )" (format t "Please enter a number. )))(let ((val (read )(if (numberp val ‏val ))))(ask-number ای@ن تاب@ع متغیري ب@ه اس@م valبراي نگهداشت@ن ش@ی اي ک@ه توسط read برگدانده م@ی شود ایجاد م@ی کند numberp .ی@ک predicateاست براي تس@ت اینک@ه ای@ن آرگومان ی@ک عدد اس@ت بکار م@ی رود .اگر مقداري ک@ه توس@ط کاربر وارد م@ی شود ی@ک عدد نباشد ask-numberخود را فراخوانی می کند. متغیرهاي محلی فقط در یک محدوده ي مشخص معتبر می باشند. نوع دیگري از متغیرها وجود دارد که متغیر سراسري نامیده می شود که می تواند در هرکجایی قابل دسترسی باشد. شما با دادن یک سمبول و یک مقدار به defparameterمی توانید یک متغیر سراسري ایجاد کنید. > ()defparameter *glob* 99 چنی@ن متغیري در ه@ر جای@ی قاب@ل دس@ترسی خواه@د بود ب@ه جز در عبارات@ی ک@ه متغی@ر هاي محل@ی جدیدي ب@ا همین نام ایجاد شده باشد. براي جلوگیري از این اتفاق که بصورت تصادفی رخ م@ی ده@د ابتدا و انتهاي نام متغیرهاي س@راسري را ب@ا عالمت * نشان می دهند. نام متغیري ک@ه م@ا ایجاد کردی@م""star-glob-starتلف@ظ می شود . شم@ا م@ی توانی@د ب@ا فراخوانی defconstanثابت هاي سراسري تعریف کنید. اگ@ر شم@ا بخواهی@د بررس@ی کنی@د ک@ه ه@ر س@مبول ی@ک متغیر س@راسري وی@ا ی@ک ثاب@ت اس@ت از boundpاس@تفاده می کنیم. > ()*boundp '*glob ‏T ( Assignment(تساب.ن.ا در زبان لیس@پ ب@ه طور کل@ی از اپراتور setfبراي انتساب اس@تفاده م@ی شود .م@ا م@ی توانی@م براي انتس@اب هر نوع متغیري از آن استفاده کنیم > ()setf *glob* 98 98 > زمان@ی ک@ه اولی@ن آرگومان ب@ه setfداده م@ی شود ی@ک سمبولی ک@ه نام آ@ن ی@ک متغی@ر محل@ی نم@ی باش@د ب@ه عنوان ی@ک متغیر سراسري گرفته می شود. شم@ا م@ی توانی@د بی@ش از انتس@اب ی@ک مقدار ب@ه متغیر انجام دهید .آرگومان اول براي setfم@ی توان@د ی@ک عبارت همانند نام یک متغیر باشد. > ()setf (car x) 'n ‏N >x () N B C یک عبارت نمونه به اینصورت می باشد: (setf a b ‏cd )e f با سه بار فراخوانی جدا setfبه ترتیب برابراست: )(setf a b )(setf c d )(setf e f منابع Paul Graham.1996. ANSI Common Lisp

51,000 تومان