Destructive Functions
פונקציות מתמטיות רגילות אינן משנות את
הפרמטרים שלהן. פונקציות אשר משנות את הפרמטרים שלהן מכונות destructive
functions. שפת LISP
מכילה מספר פונקציות כאלו. השימוש העיקרי שלהן הוא לשיפור היעילות של התוכנות שאנו
כותבים.
שם הפונקציה: |
rplaca |
תחביר: |
(RPLACA cons object) |
פעולה שקולה: |
(RPLACA x y)
(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)
(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
תודה