معرفی زبان برنامه نویسی Lisp
معرفی زبان برنامه نویسی Lisp
در این مقاله قصد داریم شما را با زبان Lisp آشنا کنیم و اطلاعات جامع و کاربردی در رابطه با این زبان برنامه نویسی را برایتان شرح دهیم; ابتدا باید بدانید که زبان Lisp چیست و پیشینه آن چه میباشد.
lisp زبان برنامه نویسی مختص رایانه است که به دست جان مککارتی ابداع شده و برای اولین بار در سال ۱۹۵۸ این زبان به رسمیت رسیده است. از این زبان اغلب برای نوشتن برنامههای مربوط به هوش مصنوعی استفاده میگردد و از آنجایی که تجزیه و تحلیل یا پیادهسازی آن آسان میباشد، کاربران زیادی علاقه به استفاده از این زبان با توجه به عملکرد آسان و در عین حال قویِ آن دارند.
زبان Lisp چیست
زبان Lisp یک زبان Common محسوب میشود که در اجرای برنامههای خاص میتوان به گسترش آن پرداخت. برنامههای نوشته شده در Common LISP به ویژگیهای ماشین خاص، (مثل طول کلمه) وابسته هستند.
Fortran اولین زبان برنامه نویسی سطحبالا محسوب میشود و پس از آن میتوان Lisp را به عنوان دومین و قدیمیترین زبان برنامه نویسی سطحبالا معرفی نمود. هر زبان شامل گویشهای متعددی میباشد که در طول تاریخ تغییرات زیادی پیدا کرده است و لیسپ نیز از این قاعده مستثنا نیست. گویشهای مختلفی که برای این زبان مرسوم هستند عبارتند از؛
Common Lisp
Scheme.
همانطور که گفته شد lisp برای برنامه نویسی در زمینه هوش مصنوعی گزینه بسیار مناسبی است چرا که عملکرد آن مناسب برای پردازش اطلاعات نمادین میباشد.
ویژگی های زبان برنامه نویسی لیسپ
- انتزاعی و معنائی بودن
- گسترشپذیری آسان
- باگزدایی و اشکالزدایی سطحبالا
- قابلیت برنامه نویسی پیشرفته به صورت شیءگرا
- امکان بهروزرسانی پویای برنامهها
- سیستم ماکرو مناسب
- ارائه انواع دادههایی مثل اشیاء، سازهها، لیستها، بردارها، آرایههای قابل تنظیم، جداول هش، و نمادها
- دارای لیست عبارتهای نمادین
- دارای ساختارهای کنترل گسترده
- معناشناسی و ترکیب
- تعامد و مبتنی بر عبارت
- قابلیت پیوستن به هوش مصنوعی
- ارائه کتابخانه کامل I / O
- ارائه ساختارهای کنترل گسترده
- عبارتهای لاندا
- Cons و لیستها
ساختار زبان برنامه نویسی Lisp
به زبان برنامه نویسی لیسپ پردازش فهرست نیز گفته میشود و دلیل آن این است که متن برنامههای این زبان، متشکل از نمادها و فهرستهایی از نمادها میباشد. از ویژگیهای جالب این زبان میتوان به فهرست بودن برنامههای لیسپ اشاره کرد. طبق همین ویژگی میتوان با برنامهها مثل دادهها رفتار نمود یا حتی به ارزیابی دادهها در قالب برنامه پرداخت. برخی از گویشهای لیسپ قابلیت شیءگرایی دارند. (مثل کامن لیسپ)
زبان Lisp دارای مدیریت نگهداری اتوماتیک، برنامهنویسی پویا، ساختمان داده درخت و برنامه نویسی شیءگرا و کامپایلر مستقل میباشد.
اپلیکیشنهایی مثل
- Emacs
- G2
- AutoCad
- Igor Engraver
و Yahoo Store به طور موفق با این زبان برنامهنویسی ساخته شدهاند.
پیشگامی زبان Lisp چیست
در زمینههای مختلفی از علوم کامپیوتری، این زبان پیشگام است، چرا که جزء اولین زبان های برنامه نویسی ساخته شده میباشد. از زمینههایی که لیسپ در آنها پیشگام است، میتوان به موارد زیر اشاره کرد:
- tree data structures
- automatic storage management
- dynamic typing
- conditionals
- higher-order functions
- recursion
- self-hosting compile
داده های زبان برنامه نویسی Lisp
همانطور که گفته شد برای انجام عملیات مربوط به هوش مصنوعی یا محاسبات، زبان لیسپ بسیار کاربرد دارد و از آنجایی که در برنامه نویسی هوش مصنوعی انواع دادههای متعددی مورد نیاز میباشد، لیسپ با دارا بودن نوع دادههای عددی، کاراکتر، منطقی و سمبول گزینه مناسبی محسوب میشود؛
۱- داده های عددی در برنامه نویسی Lisp
اعداد صحیح، ممیز شناور، اعداد مختلط و کسری، زیر مجموعهای از دادههای عددی در زبان برنامه نویسی Lisp هستند. در لیسپ حتی میتوان با اعداد بسیار بزرگ نیز کار کرد، بدون آنکه در رابطه با سرریز آنها نگرانی وجود داشته باشد. چرا که این زبان یک رنج بزرگ را در اختیار شما میگذارد و بدین ترتیب برایتان محدودیتی ایجاد نمیشود.
۲- داده های کاراکتر در برنامه نویسی Lisp
نوع دوم دادهها در زبان Lisp چیست؟
کارکتر، نوع دوم از دادههای این زبان برنامه نویسی میباشد که شامل یونیکدها هم بوده و فقط محدود به اعداد اسکی نمیباشد. تعریف دادههای کاراکتری با استفاده از \# به انجام میرسد.
۳- داده های منطقی در برنامه نویسی Lisp
نوع داده منطقی در لیسپ شامل دو حالت صحیح و غیرصحیح میباشد. حالت صحیح با true نمایش داده شده و حالت غیرصحیح با NIL یا () نمایش داده میشود.
۴- داده های سمبول در برنامه نویسی Lisp
انواع دیگری از دادههای این زبان برنامه نویسی که از اهمیت بیشتری نسبت به دیگر انواع دادهای برخوردار هستند و کاربرد بیشتری در پردازش زبانهای طبیعی و هوش مصنوعی دارند، انواع دادههای سمبول هستند.
عملگر ها در زبان LISP چیست
برعکس دیگر زبان های برنامه نویسی، در Lisp ابتدا عملگر نوشته شده و در جلوی آن عملوندها قرار میگیرند. بدین ترتیب دیگر در استفاده از عملگرها محدودیت نداریم. برای مثال به نمونه کد زیر توجه کنید که با یک عملگر +، چند عدد مختلف با هم جمع شده است.
(+ ۵ ۶ ۷ ۸ ۹ )
این درحالی است که اگر قرار باشد ۵ عدد فوق را با استفاده از یک زبان برنامه نویسی مثل C++ جمع کنیم، باید از کد دستوری زیر استفاده نماییم.
int sum = 5 + 6 + 7 + 8 + 9;
دستورالعملهای پردازش زبان برنامه نویسی Lisp
حال با توجه به اطلاعات فوق میدانید که زبان Lisp چیست، پس شاید لازم باشد با دستورالعملهای این زبان که برای دستیابی و کنترل لیستها به کار می رود آشنا شوید؛
با پردازهٔ لیست، به طور مستقیم میتوان به ایجاد لیست پرداخت. لیستها نیز تعدادی از آرگومانها را پذیرفته و تعدادی از آرگومانها را برمیگردانند.
(list 1 2 ‘a 3);
Output: (1 2 a 3)
(list 1 ‘(۲ ۳) ۴);
Output: (1 (2 3) 4)
برای افزودن یک عنصر به جلوی لیست میتوان از جفتهای Cons استفاده کرد.
دقت نمایید که پردازهٔ Cons در بهکار بردن و هدایت آرگومانهای لیست نامتقارن است، به همین خاطر روشهای لیستها ایجاد میشوند.
(Cons 1 ‘(۲ ۳));
Output: (1 2 3)
(Cons ’(۱ ۲) ‘(۳ ۴))
Output: ((1 2) 3 4)
ساختار اشتراکی: لیستهای لیسپ و لینک لیستهای ساده ممکن است با یکی دیگر از لیستهای ساختمان مشترک باشند.
در واقع دو لیست ممکن است دارای رشتهٔ پایانی از Consهای مشترک و یکسان باشند.
(setf foo (list 'a 'b 'c))
(setf bar (cons 'x (cdr foo)))
- لیست foo به صورت (a b c)
- لیست bar به صورت (x b c)
میباشند و هرچند دم b c در دو لیست فوق دارای ساختار یکسان هستند اما مثل یکدیگر نبوده و خانههای Cons اشارهگر به b و c در محل حافظهٔ یکسانی برای هردو لیست قرار دارد.
دستورالعمل های پردازشی در زبان برنامه نویسی Lisp گستردگی بیشتری دارند که در این قسمت به چند نمونه از آنها اشاره کردیم. برای آشنایی بیشتر حتما دستورالعملهای تکمیلی مربوط به این مبحث را به طور جداگانه بررسی کنید.
انتزاعی بودن (Abstraction) زبان برنامه نویسی Lisp
در زبانC++ میتوان به تعریف توابع در کلاس و اعضای Public یا private پرداخت، اما در زبان Lisp تنها میتوان به ایجاد انواع داده جدید پرداخت. به طور مثال در کد دستوری زیر تعریف یک کلاس در استراکت، و همچنین ساخت یک شیءرا در Lisp میبینید؛
(defstruct dog name breed age)
(defparameter *rover*
(make-dog :name "rover"
:breed "collie"
:age 5))
کدهای برنامه نویسی Lisp
برای آشنایی بیشتر با نحوه کد نویسی با زبان Lisp به نمونههای زیر توجه فرمایید؛
نمونه ای از SxQL، SQL DSL مبتنی بر ماکرو:
(select (:title :author :year)
(from :books)
(where (:and (:>= :year 1995)
(:< :year 2010)))
(order-by (:desc :year)))
⇒ ((:title "Practical Common Lisp"
:author "Peter Seibel"
:year 2005)
(:title "ANSI Common Lisp"
:author "Paul Graham"
:year 1995))
نمونه کد Functional:
توابع جزو آبجکتهای درجهیک هستند؛ می توانید آنها را رد کنید، ذخیره کنید یا به صورت پویا آنها را فراخوانی نمایید و حتی برنامه خود را با ترکیب بلوکهای ساختاری کوچک و کاربردی بسازید.
(reduce #'-
(reverse (list 1 2 3)))
⇒ ۰
(mapcar #'string-downcase
(list "Hello" "world!"))
=> ("hello" "world!")
نمونه کد Object-Oriented:
می توانید با استفاده از سیستم مشترک Lisp Object سلسلهمراتب قابل استفاده مجدد و قابل ارتقا کلاس را بسازید. با تطبیق زبان با دامنه، مشکل طراحی الگوها ناپدید میشود.
(defclass book ()
((title :reader book-title
:initarg :title)
(author :reader book-author
:initarg :author))
(:documentation "Describes a book."))
(make-instance 'book
:title "ANSI Common Lisp"
:author "Paul Graham")
به عنوان یکی از زبانهای برنامه نویسی سطحبالا که قدمت بسیار طولانی دارد و برای برنامه نویسی هوش مصنوعی گزینه مناسبی محسوب میشود، میتوان به lisp اشاره کرد. با مطالعه مقاله فوق احتمالاً به طور کلی متوجه شدهاید که زبان Lisp چیست، پس در صورت تمایل، میتوانید اقدام به یادگیری آن نمایید.