صفحه 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