T (שפת תכנות)
רציונל ודוגמות

פרק זה לוקה בחסר. אנא תרמו לוויקיפדיה ו. ייתכן שתמצאו פירוט בדף השיחה.
המטרה של T היא לבחון את התזה אשר פותחה על ידי גיא ל. סטיל ג'וניור וג'רלד ג'יי סוסמן בסדרת המאמרים שלהם על Scheme, שגורסת כי ניתן להשתמש ב-Scheme בתור הבסיס לשפת תכנות פרקטית אשר מסוגלת להביע מגוון רחב של רעיונות (High Expressive Power) וכן שמימושים של Scheme יכולים להיות טובים יותר ממערכות Lisp אחרות, ואף להתחרות במימושים של שפות תכנות כגון C ו-BLISS, שבעבר נחשבו נחשבות ליעילות הרבה יותר מניבי Lisp בארכיטקטורות מחשב קונבנציונליות (אם כי ניבי Lisp יכולים להיות יעילים באותה המידה באמצעות מהדר טוב.
ב-T ישנם תכונות נוספות שחסרות ב-Scheme . לדוגמה, T היא מונחית עצמים והיא מכילה סביבות מחלקה ראשונה, שנקראות "locales". מימוש תאורטי של פעולת ה-cons לדוגמה:
(define-predicate pair?)
 (define-settable-operation (car pair))
 (define-settable-operation (cdr pair))
 (define (cons the-car the-cdr)
 (object nil
 ((pair? self) t)
 ((car self) the-car)
 ((cdr self) the-cdr)
 (((setter car) self new-car) (set the-car new-car))
 (((setter cdr) self new-cdr) (set the-cdr new-cdr))))
דוגמה זו ממחישה שאובייקטים ב-T קשורים באופן הדוק לסְגוֹרים (closures) ולהעברת מסרים (Message passing). ישנה פעולה מובנית בשפה (Primitive Function) ששמה join אשר מחברת 2 אובייקטים ביחד, ומאפשרת דבר המזכיר ירושה.
ב-T, כמו ניבי Lisp רבים אחרים, ניתן "לכתוב מחדש את השפה", כלומר, לשנות ערכים של פעולות וערכים מוגדרים בשפה, ולכן היא משויכת לפרדיגמה "מטא תכנות" . לדוגמה, ב-Scheme, הפעולה define מגדירה ערך מסוים (סוג של השמה), ולכן ניתן להשתמש בה גם להגדרת עצמה מחדש, כך של define תהיה משמעות שונה .
(define define 6)
(write define)
בקוד לעיל שינינו את ערך הפעולה define ל-6, והדפסנו .
cons (מהמילה "construct" באנגלית שמשמעותה "לבנות") היא פעולה שקיימת ברוב השפות ממשפחת Lisp. היא יוצרת 2 תאים בזיכרון (בדרך כלל 4 בייטים (bytes) לכל תא) . התא הראשון מייצג את הערך, ואילו התא השני מייצג הפניה (מצביע) לתא הבא. בניבי LISP רבים מזינים את הערך NIL לפרמטר השני כאשר אין המשך לביטוי ה cons (כלומר, הגענו לאיבר האחרון) . בניבים רבים, NIL הוא שקר (FALSE) ו T הוא אמת (TRUE) . ב-Scheme, הניב שעליו שפת T התבססה, מסמנים אמת ב t# ושקר בf#.
דוגמה למימוש פעולת cons בניב Common Lisp:
(CONS 'HELLO ( CONS 'WORLD NIL) )
תחילה, הפעולה יצרה חוליה שהערך בתא הראשון שלה זה HELLO', והפניה לחוליה הבאה. ערך התא הראשון של החוליה השנייה הוא WORLD' והערך השני הוא NIL (המקביל לביטוי הבוליאני "שקר" (False) בניבי Lisp), ולכן אין חוליה שלישית והרשימה נגמרת . יש לסמן מחרוזות (בין היתר) ב-Common Lisp (וכן בניבים אחרים) בגרש בתחילתן על מנת לאותת למהדר לא להתייחס לטקסט כביטוי כגון מחרוזת או מתודה שצריך לפשטו. ניתן גם לכתוב את המילה השמורה quote לפני הערך כדי לקבל אותה תוצאה, בניבים רבים. לדוגמה, (qoute hello) יחזיר HELLO.
אם נדפיס את הרשימה נקבל : (HELLO WORLD).
מופיע ייצוג גרפי לחידוד ההבנה:
מבנה נתונים זה מזכיר רבות את מבנה הנתונים "שרשרת חוליות", אשר נפוץ בשפות עיליות רבות. בדרך כלל המצביע של האיבר האחרון הוא null (מסמל "כלום" בשפות התכנות סי שארפ וג'אווה (ועוד)), none (בפייתון) וכדומה, בהתאם לשפת התכנות.
| 1955 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2019 |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| LISP 2 ,LISP 1.5 ,LISP | LISP 2 ,LISP 1.5 ,LISP | LISP 2 ,LISP 1.5 ,LISP |  |  |  |  |  |  |  |  |  |  |  |  |
|  |  | Maclisp | Maclisp | Maclisp | Maclisp | Maclisp |  |  |  |  |  |  |  |  |
|  |  |  | Interlisp | Interlisp | Interlisp | Interlisp | Interlisp |  |  |  |  |  |  |  |
|  |  |  |  | Lisp Machine Lisp | Lisp Machine Lisp | Lisp Machine Lisp | Lisp Machine Lisp | Lisp Machine Lisp |  |  |  |  |  |  |
|  |  |  |  | Scheme | Scheme | Scheme | Scheme | R5RS | R5RS | R6RS | R7RS small | R7RS small | R7RS small |  |
|  |  |  |  | NIL | NIL |  |  |  |  |  |  |  |  |  |
|  |  |  |  |  | Franz Lisp | Franz Lisp |  |  |  |  |  |  |  |  |
|  |  |  |  |  | Common Lisp | Common Lisp | Common Lisp | Common Lisp | Common Lisp | Common Lisp | Common Lisp | Common Lisp | Common Lisp |  |
|  |  |  |  |  | Le Lisp | Le Lisp | Le Lisp | Le Lisp | Le Lisp | Le Lisp | Le Lisp | Le Lisp | Le Lisp |  |
|  |  |  |  |  |  | T | T | T |  |  |  |  |  |  |
|  |  |  |  |  |  | Emacs Lisp | Emacs Lisp | Emacs Lisp | Emacs Lisp | Emacs Lisp | Emacs Lisp | Emacs Lisp | Emacs Lisp |  |
|  |  |  |  |  |  | AutoLISP | AutoLISP | AutoLISP | AutoLISP | AutoLISP | AutoLISP | AutoLISP | AutoLISP |  |
|  |  |  |  |  |  | PicoLisp | PicoLisp | PicoLisp | PicoLisp | PicoLisp | PicoLisp | PicoLisp | PicoLisp |  |
|  |  |  |  |  |  |  | EuLisp | EuLisp | EuLisp | EuLisp | EuLisp | EuLisp |  |  |
|  |  |  |  |  |  |  | ISLISP | ISLISP | ISLISP | ISLISP | ISLISP | ISLISP | ISLISP | ISLISP |
|  |  |  |  |  |  |  | OpenLisp | OpenLisp | OpenLisp | OpenLisp | OpenLisp | OpenLisp | OpenLisp | OpenLisp |
|  |  |  |  |  |  |  | PLT Scheme | PLT Scheme | PLT Scheme | PLT Scheme | Racket | Racket | Racket |  |
|  |  |  |  |  |  |  | GNU Guile | GNU Guile | GNU Guile | GNU Guile | GNU Guile | GNU Guile | GNU Guile |  |
|  |  |  |  |  |  |  |  |  | Visual LISP | Visual LISP | Visual LISP | Visual LISP | Visual LISP |  |
|  |  |  |  |  |  |  |  |  |  | Qi, QiII | Qi, QiII | Shen | Shen |  |
|  |  |  |  |  |  |  |  |  |  | Clojure | Clojure | Clojure | Clojure |  |
|  |  |  |  |  |  |  |  |  |  | Arc | Arc | Arc | Arc |  |
|  |  |  |  |  |  |  |  |  |  | LFE | LFE | LFE | LFE |  |
|  |  |  |  |  |  |  |  |  |  |  | Hy | Hy | Hy |  |