Common Lisp – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
אין תקציר עריכה
Jona1357 (שיחה | תרומות)
מ פיסוק
שורה 99:
ניתן ליצור משתנים ב־Common Lisp ב־3 דרכים:
 
* '''באמצעות ה[[מאקרו (תכנות)|מאקרו]] <code>set</code>''' : דרך זו נחשבת למיושנת והייתה בשימוש נפוץ בגרסאות ישנות יותר של Lisp. דוגמה: <code>(set (quote *foo*) 42)</code> . בדוגמה זו נוצר משתנה בשם <code>*foo*</code> שערכו <code>42</code>. נעשה שימוש בהוראה <code>quote</code> על מנת ששם המשתנה, במקרה זה <code>*foo*</code>, יחשב ל־symbol ולא יוערך. ניתן לכתוב גרש (') לפני הביטוי על מנת לקבל את אותה התוצאה (ניתן לבצע זאת ב־Common Lisp גם ללא קשר להגדרת משתנים). שם המשתנה מתחיל ונגמר בכוכבית ככחלק ממוסכמת כתיבה בשפה, ואין חובה לבצע זאת גם.
 
* '''באמצעות המאקרו''' <code>'''setq'''</code> (קיצור ל־"set quote") לדוגמה: <code>(setq *foo* 42)</code>. גם בדוגמה זו, נוצר משתנה בשם <code>*foo*</code> שערכו <code>42</code>.
* '''באמצעות המאקרו <code>setf</code>''' : שיטה זו נחשבת לחדשנית יותר, משום שבנוסף ליכולותיהן של השיטות הקודמות. באמצעות <code>setf</code> ניתן לגשת ולשנות איברים ברשימה, לעומת <code>set</code> ו <code>setq</code>.
 
להלן השוואה בין הקוד הנדרש ליצירת רשימה זהה בשיטות השונות,<syntaxhighlight lang="common-lisp">
שורה 139:
1
(* (recursive-factorial (- n 1)) n)))
</syntaxhighlight>וכן פונקציה רקורסיבית אשר פולטתמצטמצמת את( המספרהיות וגם היא ביטוי ) למספר הגדול ביותר ב[[רשימה (מבנה נתונים)|רשימה]] הנקלטת אליה,<syntaxhighlight lang="common-lisp">
(defun recursive-maximum (item lst)
(if (eq lst nil)