LISP

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

LISP היא שפת תכנות פונקציונלית לשימוש כללי. שמה נגזר מצירוף המילים "עיבוד רשימות" ("List Processing" באנגלית) שהיה הייעוד המקורי של השפה כשהומצאה. השפה היא אחת מ-20 שפות התכנות הנפוצות ביותר הנמצאות בשימוש כיום‏[1].


מבוא והיסטוריה[עריכת קוד מקור | עריכה]

כיום Lisp היא משפחה של שפות תכנות בעלת היסטוריה ארוכה ותחביר ייחודי המבוסס על סוגריים. היא אופיינה לראשונה בשנת 1958 על ידי ג'ון מקארתי מאוניברסיטת סטנפורד[2], עובדה שהופכת אותה לשפת התכנות העילית השנייה בוותק שעדיין בשימוש נפוץ. רק פורטרן וותיקה ממנה. השפה השתנתה והתפתחה באופן ניכר מאז המצאתה ונוספו לה מספר רב של דיאלקטים במשך הזמן. שלושת הדיאלקטים הרב-תכליתיים הידועים ביותר שלה כיום הם Common Lisp, Scheme ו-Clojure. בנוסף קיימים עוד עשרות ניבים שרובם משמשים כשפות מאקרו/תסריט של יישומים מסוימים (למשל: AutoCad, GIMP ו־Emacs).

השפה נוצרה במקור ככתיב מתמטי פרקטי לתוכניות מחשב, שהתבסס על תחשיב הלמדא של אלונזו צ'רץ'. היא הפכה במהרה לשפת התכנות המועדפת למחקר בבינה מלאכותית. כאחת משפות התכנות המוקדמות, Lisp הייתה חלוצה של רעיונות רבים במדעי המחשב, ובכללם מבני נתונים דמויי-עץ, ניהול אחסון אוטומטי, טיפוסיות דינמית, תכנות מונחה עצמים, ומהדר שמסוגל לבנות את עצמו.

השם Lisp נגזר מהביטוי "List Processing Language" (בעברית: שפה לעיבוד רשימות). רשימות מקושרות הן אחד ממבני הנתונים המרכזיים בשפות התכנות במשפחת Lisp, וקוד המקור של Lisp מורכב בעצמו מרשימות. כתוצאה מכך, תוכניות Lisp יכולות לטפל בקוד מקור כמבנה נתונים, מה שמאפשר יצירת מערכות מאקרו/תסריט המאפשרות למתכנתים ליצור תחביר חדש או אפילו "שפות קטנות" המשובצות ב-Lisp.

בניגוד לשפות תכנות אחרות, המבנה של הפקודות ב-LISP הוא אחיד ומורכב מביטויי-S. כל ביטוי כתוב בכתיב פולני (האופרטור תחילה ואחר כך הפרמטרים) וזאת במבנה של רשימה התחומה בסוגריים. התכונות הללו מקנות את המראה הייחודי של הקוד הנכתב בשפה.

דוגמאות[עריכת קוד מקור | עריכה]

קריאה לפונקציה או למבנה תחבירי תיכתב כרשימה עם שם הפונקציה או האופרטור בהתחלה, והארגומנטים אחר-כך; למשל, פונקציה f שמקבלת שלושה ארגומנטים עשויה להיקרא באמצעות (f x y z).

הדוגמה הבאה, סכום שלושה מספרים, ממחישה את השימוש בכתיב הפולני:

(+ 1 2 3)
; => (1 + 2 + 3)

יש מספר וריאציות של מבניות זו אשר מאפשרות קיצורים בכתיבה (למשל השמטת סוגריים ושיתוף מידע בין ביטויים). היתרון הגדול של מבנה תחבירי זה הוא שניתן לשנותו בזמן ריצה.

בהתאם לייעודה המקורי כשפת עיבוד רשימות, עושה שפת LISP שימוש רב ברקורסיות.

תוכנית דוגמה לחישוב עצרת, בדיאלקט Common Lisp:

 (defun factorial (n)
   (if (= n 0)
       1
       (* n (factorial (- n 1)))))

שתי פקודות חשובות ב-Lisp הפועלות על רשימות מכל סוג הן car ו-cdr (והמקבילות המודרניות: first ו-rest, בהתאמה). הפקודה car (או first) מחזירה את האיבר הראשון ברשימה, והפקודה cdr (או rest) מחזירה את הרשימה ללא האיבר הראשון.

(car (list 1 2 3))
; => 1
(first (list 1 2 3))
; => 1
(cdr (list 1 2 3))
; => (2 3)
(rest (list 1 2 3))
; => (2 3)

יתרון בשימוש ב-car וב-cdr הוא שניתן לשכפל את האות האמצעית בפקודות אלו על מנת לבצע הפקודה בצורה רקורסיבית מספר פעמים: אם למשל כותבים caaar, מקבלים את האיבר הראשון של האיבר הראשון של האיבר הראשון (3 פעמים) של הרשימה המקורית (איבר ברשימה יכול להיות גם הוא רשימה).

בדומה לכך, אם רושמים cddr, מקבלים את הרשימה המקורית ללא שני האיברים הראשונים שלה (שגם הם יכולים להיות רשימות). ניתן גם לערבב: אם רושמים למשל cadaadr, מקבלים את האיבר הראשון של שאר הרשימה של האיבר הראשון של האיבר הראשון של שאר הרשימה של הרשימה המקורית, וכן הלאה.

(caar (list (list 11 12) 2 3 4 5))
; => 11
(cadr (list (list 11 12) 2 3 4 5))
; => 2
(cddr (list (list 11 12) 2 3 4 5))
; => (3 4 5)
(caddr (list (list 11 12) 2 3 4 5))
; => 3

הומור[עריכת קוד מקור | עריכה]

ריבוי הסוגריים הביא לבדיחה לפיה פירוש ראשי התיבות Lisp הוא: Lots of Irritating Superfluous Parenthesesתרגום חופשי: המון סוגריים מעצבנים ומיותרים).

קישורים חיצוניים[עריכת קוד מקור | עריכה]

הערות שוליים[עריכת קוד מקור | עריכה]