Destructive Functions

פונקציות מתמטיות רגילות אינן משנות את הפרמטרים שלהן. פונקציות אשר משנות את הפרמטרים שלהן מכונות destructive functions. שפת LISP מכילה מספר פונקציות כאלו. השימוש העיקרי שלהן הוא לשיפור היעילות של התוכנות שאנו כותבים.

שם הפונקציה:

rplaca

תחביר:

(RPLACA cons object)

פעולה שקולה:

(RPLACA x y) plot:\[ \equiv \] (setf (car x) y)

פעולה:

משנה את ה-car של ה-cons להיות object ומחזיר את ה-cons לאחר השינוי.

דוגמא:

> (setf sentence '(small money big problems))

(SMALL MONEY BIG PROBLEMS)

> (rplaca sentence 'big)

(BIG MONEY BIG PROBLEMS)

> sentence

(BIG MONEY BIG PROBLEMS)

שם הפונקציה:

rplacd

תחביר:

(RPLACD cons object)

פעולה שקולה:

(RPLACD x y) plot:\[ \equiv \] (setf (cdr x) y)

פעולה:

משנה את ה-cdr של ה-cons להיות object ומחזיר את ה-cons לאחר השינוי.

הפונקציה NCONC

פונקציה זו הינה גירסת destructive function של הפונקציה append.

נניח כי הרצנו את הפקודות הבאות:

> (setf abc '(a b c))
(A B C)
> (setf xyz '(x y z))
(X Y Z)

נפעיל את nconc ונראה את התוצאה, ואת ערכי abc ו-xyz לאחר הקריאה:

> (nconc abc xyz)
(A B C X Y Z)

> xyz
(X Y Z)

> abc
(A B C X Y Z)

abc השתנה כדי להכיל את תוצאת השרשור.



מה שבעצם nconc ביצעה זה שינוי ה-cdr האחרון של abc כדי שיצביע על xyz.

להשוואה, נביט בתוצאת append על ערכים זהים:

> (append abc xyz)
(A B C X Y Z)

> xyz
(X Y Z)

> abc
(A B C)

append החזירה רשימה חדשה, וערכי abc, xyz נשארו ללא שינוי.

שימוש בפונקציות אשר משנות את הפרמטרים שלהן הוא מסוכן, אבל יעיל. שימוש ב-append כל פעם יוצר עותק של הרשימה. שימוש ב-nconc בצורה נכונה יכול לשפר את יעילות התוכנית בסדר גודל.



מאת: מיכאל קנוסוב

לימוד שפת LISP

בתור חובב תכנות ללא ניסיון רב אני מעונין ללמוד באופן פרטי את שפת ליספ בתור
שפת אם לתכנות פונקציונלי. אינני עוסק בתכנות ואינני מתכוון להרויח משפת תכנות מדובר רק בלימוד תכנות כהובי. אודה לך אם תןכל להתקשר לטלפון 050-6262013
תודה
מאת: white-dragon

שימוש של lisp

אפשר לכתוב בlisp מקרואים וקיצורים חדשים לemacs.
שיתוף:
| עוד