T (שפת תכנות)

**T** היא שפת תכנות מרובת פרדיגמות, וניב של שפת Scheme (שהיא ניב של Lisp). היא פותחה בתחילת שנות ה-80 של המאה ה-20 על ידי ג'ונתן א. ריס, קנט מ. פיטמן ונורמן י. אדמס מאוניברסיטת ייל כניסוי בעיצוב ומימוש שפת תכנות.

## רציונל ודוגמות

המטרה של T היא לבחון את התזה אשר פותחה על ידי גיא ל. סטיל ג'וניור וג'רלד ג'יי סוסמן בסדרת המאמרים שלהם על *[[Scheme]]*, שגורסת כי ניתן להשתמש ב-Scheme בתור הבסיס לשפת תכנות פרקטית אשר מסוגלת להביע מגוון רחב של רעיונות (High Expressive Power) וכן שמימושים של *Scheme* יכולים להיות טובים יותר ממערכות *Lisp* אחרות, ואף להתחרות במימושים של שפות תכנות כגון C ו-BLISS, שבעבר נחשבו נחשבות ליעילות הרבה יותר מניבי Lisp בארכיטקטורות מחשב קונבנציונליות (אם כי ניבי Lisp יכולים להיות יעילים באותה המידה באמצעות מהדר טוב.

ב-T ישנם תכונות נוספות שחסרות ב-Scheme . לדוגמה, T היא מונחית עצמים והיא מכילה סביבות מחלקה ראשונה, שנקראות *"locales".* מימוש תאורטי של פעולת ה-`cons` לדוגמה:
```scheme
(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` תהיה משמעות שונה .
```scheme
(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: 
```lisp
(CONS 'HELLO ( CONS 'WORLD NIL) )
```
תחילה, הפעולה יצרה חוליה שהערך בתא הראשון שלה זה HELLO', והפניה לחוליה הבאה. ערך התא הראשון של החוליה השנייה הוא WORLD' והערך השני הוא NIL (המקביל לביטוי הבוליאני "שקר" (False) בניבי Lisp), ולכן אין חוליה שלישית והרשימה נגמרת . יש לסמן מחרוזות (בין היתר) ב-Common Lisp (וכן בניבים אחרים) בגרש בתחילתן על מנת לאותת למהדר לא להתייחס לטקסט כביטוי כגון מחרוזת או מתודה שצריך לפשטו. ניתן גם לכתוב את המילה השמורה quote לפני הערך כדי לקבל אותה תוצאה, בניבים רבים. לדוגמה, (`qoute hello)` יחזיר HELLO.

אם נדפיס את הרשימה נקבל : `(HELLO WORLD`).

מופיע ייצוג גרפי לחידוד ההבנה:

מבנה נתונים זה מזכיר רבות את מבנה הנתונים "שרשרת חוליות", אשר נפוץ בשפות עיליות רבות. בדרך כלל המצביע של האיבר האחרון הוא null (מסמל "כלום" בשפות התכנות סי שארפ וג'אווה (ועוד)), `none` (בפייתון) וכדומה, בהתאם לשפת התכנות.

## היסבים (פורטים)
*נא לא להתבלבל בין המושג [[היסב]] (פורט) למושג [[פורט (תקשורת)|פורט]] ב[[תקשורת נתונים|תקשורת מחשבים]].*

T הותאמה לפלטפורמות חומרה ומערכות הפעלה רבות, כגון :
* MIPS: DEC 3100 (pmax), SGI IRIS
* Motorola 68000 (m68k): Apollo Domain/OS, HP/UX, Mac/AUX, NeXT, SunOS 3
* NS320xx (n32k): Encore Multimax
* SPARC: SunOS 4 and above, Solaris, Unix on Connection Machine 5
* VAX: Ultrix

## ראו גם
* Scheme
* Lisp
* Common Lisp
* אוניברסיטת ייל

## קישורים חיצוניים
* 
* ההיסטוריה של T
* T revival project, באתר Wayback Machine

## הערות שוליים

קטגוריה:שפות תכנות
קטגוריה:ניבי Lisp