לדלג לתוכן

Clojure

מתוך ויקיפדיה, האנציקלופדיה החופשית
יש להשלים ערך זה: בערך זה חסר תוכן מהותי. ייתכן שתמצאו פירוט בדף השיחה.
הנכם מוזמנים להשלים את החלקים החסרים ולהסיר הודעה זו. שקלו ליצור כותרות לפרקים הדורשים השלמה, ולהעביר את התבנית אליהם.
יש להשלים ערך זה: בערך זה חסר תוכן מהותי. ייתכן שתמצאו פירוט בדף השיחה.
הנכם מוזמנים להשלים את החלקים החסרים ולהסיר הודעה זו. שקלו ליצור כותרות לפרקים הדורשים השלמה, ולהעביר את התבנית אליהם.
Clojure
פרדיגמות תכנות פונקציונלי, concurrent computing, agent-oriented programming, תכנות לוגי עריכת הנתון בוויקינתונים
תאריך השקה 2007 עריכת הנתון בוויקינתונים
מפתח ריצארד היקיי עריכת הנתון בוויקינתונים
טיפוסיות דינמית
הושפעה על ידי ML, Common Lisp, LISP עריכת הנתון בוויקינתונים
רישיון אקליפס רישיון ציבורי עריכת הנתון בוויקינתונים
סיומת clj, edn, cljc, cljs, cljr עריכת הנתון בוויקינתונים
clojure.org
לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית

Clojure היא דיאלקט מודרני של שפת התכנות Lisp. זוהי שפה רב-תכליתית המאפשרת פיתוח אינטראקטיבי ומעודדת סגנון תכנות פונקציונלי המאפשר תכנות רב-תהליכי פשוט ובטוח יותר. Clojure מיושמת על פלטפורמת ה-JVM של שפת התכנות Java ומקומפלת ישירות לבייטקוד. Clojure מקיימת את פילוסופיית code-as-data של שפת התכנות Lisp, והיא בעלת מערכת מאקרו מתוחכמת. Clojure פותחה על ידי ריצ'רד היקי בשנת 2007 והיא תוכנת קוד-פתוח. Clojure מקיימת את פרדיגמת התכנות (כלומר, את העיקרון התכנותי) של תכנות פונקציונלי, כמו שאר ניבי Lisp. בתכנות פונקציונלי, מוצב דגש על קריאה לפונקציות, כאשר הן לא משנות את התוכנה, וגורמות למספר מינימלי של "תופעות לוואי" - כלומר, שינויים בחלקים אחרים שבתוכנה. הפונקציות מפושטות גם הן כביטויים. שפות תכנות עיליות רבות תומכות בעיקרון התכנות הפונקציונלי.

פיתוח השפה

[עריכת קוד מקור | עריכה]

ריצ׳ארד הייקי הוא היוצר של Clojure ושל Dotlisp, פרויקט דומה המבוסס על סביבת NET. של תאגיד התוכנה מיקרוסופט. היקיי פיתח את השפה במשך שנתיים וחצי לפני שהוציא אותה לאור, ובמרבית הזמן עבד ללא מימון חיצוני. כאשר סיים את הפיתוח, שלח הודעת אימייל לחבריו בקהילה של שפת התכנות Common Lisp. לפי הייקי, השם "Clojure" מבוסס על עקרון תכנותי בשם Clojure. בנוסף, השם ב-Clojure מכיל את האותיות C,‏ L,‏ ו־J, אשר מסמלות את #C,‏ Lisp,‏ ו־Java בהתאמה.

הפלטפורמה העיקרית של Clojure היא Java, אך ישנם היסבים (מימושים בפלטפורמות אחרות) אחרים ל־Clojure. המרכזיים שבהם הם ClojureScript, אשר מהודר לשפת EMCAScript 3 ו־Clojure CLR, היסב מלא לפלטפורמת NET. לפיתוח של תאגיד התוכנה מיקרוסופט. מסקר שנעשה בקרב מתכנתי Clojure בשנת 2013 על 1,060 משתתפים, נמצא כי כ־47% מהמשתתפים השתמשו הן ב־Clojure והן ב־ClojureScript כאשר עבדו עם Clojure. בשנת 2014, מספר זה עלה ל־55%, ובשנת 2015, בהתבסס על 2,445 משתתפים, כ־66% השתמשו גם ב־Clojure וגם ב־ClojureScript.

עם העניין הגובר בתכנות פונקציונלי, הפופולריות של Clojure בקרב מתכנתי Java המשיכה לגדול. השפה הומלצה והועדפה על ידי מתכנתים וותיקים רבים שביניהם אריק אוונס, בריאן גואץ וג'יימס גוסלינג – היוצר והמתכנן הראשי של שפת Java, פול גרהם (אנ׳), ורוברט ס. מרטין (אנ׳).

בסקר "JVM Ecosystem Report 2018", שנחשב באותו הזמן לסקר הגדול ביותר של מתכנתי Java שנעשה, Clojure דורגה במקום השני מבחינת שימוש אחרי Java עצמה, בקטגוריה "main applications"[1].

חברות רבות משתמשות ב־Clojure, שביניהן Puppet,‏ Netflix,‏ Funding Circle,‏ Atlassian,‏ Apple ו- Walmart. כמו כן, סוכנויות ממשלתיות אמריקניות כגון NASA השתמשו ב־Clojure. השפה גם משמשת לתחומים רבים כגון מוזיקה, משחקים, אמנות וכולי.

מלבד למימוש העיקרי ב-Java, ישנם מימושים ניסיוניים ולא רשמיים ל-Clojure בשפות תכנות אחרות:

CljPerl – מימוש של Clojure בשפת התכנות Perl

CljPerl – מימוש של Clojure ב־Beam, המכונה הווירטואלית של שפת התכנות הפונקציונלית Erlang.

clojure-py – מימוש של Clojure בפייתון.

Ferret – מהודר ל־C++ 11.

Jokerמהדר ומאתר באגים (Linter) של Clojure שנכתב בשפת התכנות Go.

Las3r – רץ במכונה הווירטואלית של ActionScript (שפת תכנות שמשומשת בעיקר לפלטפורמת Adobe Flash).

Pixie – ניב ממשפחת שפות Lisp שקיבל השראה מ־Clojure וכתובה ב־RPython.

Rouge – מימוש של מפרש בשפת התכנות Ruby.

סוגי נתונים

[עריכת קוד מקור | עריכה]

*חלק מן המידע כאן נלקח מהאתר הרשמי של Cojure

סוג הנתונים הסבר קצר דוגמה
integer מספר שלם 3
floating point מספר עשרוני 3.14
ratio יחס בין שני מספרים שלמים 22/7
string מחרוזת – אוסף של תווים "hello, world"
symbol יכול להכיל אותיות, מספרים, וסימני פיסוק בו זמנית +, או למשל map.
boolean משתנה בוליאני, כלומר, יכול להכיל true או false (אמת או שקר) true, false
null null הוא כלום. הוא מסומן באמצעות המילה השמורה "nil" nil
list אוסף של נתונים בתוך סוגריים – בהתחלה שמים גרש (') (1,2,3,4)'
vector אוסף של נתונים בתוך סוגריים מרובעים. [1,2,3,4]
set אוסף של נתונים בתוך סוגריים מסולסלים. שמים בהתחלה סולמית ('#'). {4 3 2 1}#
map אוסף של נתונים בתוך סוגריים מסולסלים. לכל ערך יש מקום במבנה הנתונים, שמסומן על ידי נקודתיים. כל איבר מופרד באמצעות פסיק (','). {:a 1, :b 2}

כתיבת קוד ב-Clojure

[עריכת קוד מקור | עריכה]

עבודה בסיסית עם REPL

[עריכת קוד מקור | עריכה]

בשפות תכנות רבות, ניתן לכתוב בעורך טקסט, או לחלופין, ב"שורת פקודה", או במונח המדויק בדרך כלל בניבים ממשפחת שפות Lisp: ‏REPL ‏(אנ').

REPL היא קיצור של "Read Eval Print Loop", שכן שורת הפקודה קוראת את הקוד ("Read"), מעבדת אותו ("Evaluate"), מדפיסה את התוצאה ("print") וחוזר חלילה ("Loop"). גם כאן הקוד מהודר ל־Bytecode של Java, שכן אין מפרש ל־"Clojure" (נכון לשנת 2020).

כלומר, כל פעם נכתוב שורה אחת, או לחלופין בלוק יחיד של קוד, והוא (וגם הפלט אם יש) יתבצע.

בלולאת ה־"REPL", נתייחס לתוצאות הקודמות כך :

1* : התוצאה האחרונה.

2* : התוצאה שלפני 2 ביטויים.

3* : התוצאה שלפני 3 ביטויים.

דוגמה מהאתר הרשמי של Clojure לכך :

user=> (+ 3 4)
7
user=> (+ 10 *1)
17
user=> (+ *1 *2)
24

הערות (comments)

[עריכת קוד מקור | עריכה]

הקדמה – כתיבת הערה

[עריכת קוד מקור | עריכה]

בתכנות נהוג לרשום הערות בסמוך לקטעי הקוד, על מנת שהמתכנת, ופעמים רבות גם חברי הצוות שלו, יוכלו להבין את הקוד ולנווט בו בקלות. ההערה מכילה הסבר קצר על מה שהקוד עושה, או לחלופין מה שיש לעשות, או לתקן. בשפות רבות כגון פייתון נהוג לרשום הערה לכל פעולה אשר יוצרים. בתהליך ההידור (התהליך שבו בסופו של דבר מומרת שפת התכנות לשפת מכונה), המהדר מתעלם מן ההערות. לדוגמה: קוד בשפת java, אשר מדפיס "hello, world", ואחריו, הערה שמסומנת בסימן ׳//׳ .

System.out.println("hello, world"); // the code prints a "hello world" message

פעמים רבות, נרצה לכתוב הערות של יותר משורה אחת, ולשם כך נשתמש בסימון אחר. ב־java וב־c# למשל, הסימון להערה כזו הוא /* כאן נכתוב את ההערה */.

הערות ב־Clojure

[עריכת קוד מקור | עריכה]

ב-clojure, כמו כל דבר אחר, הערות הן פונקציות. לדוגמה (comment hello world) זו הערה שמכילה את הטקסט hello world. בנוסף ניתן להגדיר הערות מחוץ לפונקציה על ידי שימוש במירכאות (כמו מחרוזת)

הקדמה – כתיבת פעולה

[עריכת קוד מקור | עריכה]

בשפות תכנות רבות יש צורך להשתמש באותו הקוד שוב ושוב, פעמים רבות על משתנים אחרים בזיכרון. כתיבת קוד פעמים רבות הופכת אותו לארוך יותר באופן משמעותי ולהרבה פחות קריא. לכן, נהוג לכתוב את הקוד פעם אחת, בתוך קטע קוד הנקרא פעולה, וכאשר נרצה להשתמש בקוד שבפעולה, נזמן אותה (ונכניס את הפרמטרים במידת הצורך). זימון הפעולה בדרך כלל דורש רק שורה אחת שמכילה את שם הפעולה והפרמטרים.

כתיבת פעולה ב־Clojure

[עריכת קוד מקור | עריכה]

פעולה ב־"Clojure" מורכבת מהמילה השמורה defn (קיצור של המילה "define" באנגלית), שם הפעולה, הפרמטרים (אשר מוכנסים בתוך סוגריים מרובעים) ואת גוף הפעולה (בתוך סוגריים רגילים), כלומר מה שמבצעת הפעולה.

((<defn <function_name> [<parameters>] (<function_body)

דוגמה מהאתר הרשמי של Clojure לכך :

((defn greet [name] (str "Hello, " name)

מבני נתונים

[עריכת קוד מקור | עריכה]

הקדמה – כתיבת מבני נתונים

[עריכת קוד מקור | עריכה]

מבני נתונים הם אוסף של נתונים המקושרים האחד לשני. ישנם סוגים רבים של מבני נתונים בשפות תכנות עיליות. ישנם מבני נתונים בעלי מקומות סידוריים לכל ערך (כאשר המקום של האיבר הראשון הוא בדרך כלל 0) כגון מערך ורשימה. מאידך גם יש מבני נתונים כגון תור ומחסנית בהם מוציאים ערך אחד כל פעם ללא מקומות סידוריים בדרך כלל, וכן ישנם גם מבני נתונים ממשפחת העצים הבינארים. ישנם עוד סוגים רבים, ואופן הכתיבה שלהם והגישה אליהם משתנה בכל שפת תכנות. דוגמה לשימוש במבנה נתונים מסוג רשימה משפת התכנות פייתון בשורת פקודה:

>>> lst1 = ['hello' , 'world' , 6, 6.4 ]

>>> lst1

['hello', 'world', 6, 6.4]

>>> lst1[1]

'world'

מבני נתונים ב-Clojure

[עריכת קוד מקור | עריכה]

ארבעת מבני הנתונים המרכזיים ב־Clojure הם וקטורים (vectors), רשימות (lists), קבוצות (sets) ומילונים (maps).

וקטורים
רשימות
קבוצות
מילונים
גרסה תאריך השחרור פיצ׳רים ושיפורים עיקריים שחודשו
16 באוקטובר 2007 Initial public release
1.0 4 במאי 2009 First stable release
1.1 31 בדצמבר 2009 Futures
1.2 19 באוגוסט 2010 Protocols
1.3 23 בספטמבר 2011 Enhanced primitive support
1.4 15 באפריל 2012 Reader literals
1.5 1 במרץ 2013 Reducers
1.5.1 10 במרץ 2013 Fixing a memory leak
1.6 25 במרץ 2014 Java API, improved hashing algorithms
1.7 30 ביוני 2015 Transducers, reader conditionals
1.8 19 בינואר 2016 Additional string functions, direct linking, socket server
1.9 8 בדצמבר 2017 Integration with spec, command-line tools
1.10 17 בדצמבר 2018 Improved error reporting, Java compatibility
1.10.1 6 ביוני 2019 Working around a Java performance regression and improving error reporting from clojure.main

קישורים חיצוניים

[עריכת קוד מקור | עריכה]
ויקישיתוף מדיה וקבצים בנושא Clojure בוויקישיתוף

הערות שוליים

[עריכת קוד מקור | עריכה]