سلام مجدد به کلوژردوستان.
بعد از یه فاصلهی زمانی نسبتا طولانی با بخش پنجم آموزش کلوژر، به مسیر خودمون ادامه میدیم.
دیتاتایپ ها در کلوژر
عنوان این مبحث میتونست «متغیرها در کلوژر» باشه ولی از اونجایی که دیتاها Immutable هستن و تغییر نمیکنن، بهتره با اسم دیگری درموردشون صحبت کنیم.
مقادیر عددی
مقادیر عددی در کلوژر به چند شکل وجود دارن.
integer
و float
که مثل زبانهای برنامه نویسی دیگه هستن. مثلا:
42
3.14
-273.15
در کلوژر مقادیر عددی دیگری هم داریم که در برخی زبانهای برنامه نویسی دیگه هم شاهدش بودید.
012 ; Octal number
0x2a ; Hexadecimal number
2r1001001 ; Radix
مثال اول عدد ۱۰ بر مبنای ۸ هست.
مثال دوم عدد ۴۲ بر مبنای ۱۶ هست.
مثال سوم عدد ۷۳ بر مبنای ۲.
نمیخوام فعلا توضیح زیادی در این مورد بدم. فقط در نظر داشته باشید که این مقدارها هم توسط کلوژر پشتیبانی میشه. نحوهی استفاده و هندل کردنشون مربوط به فصل بعدی (توابع هستهای کلوژر) میشه.
به علاوهی اینها، Ratio هم هست که به وسیلهی اون میتونیم نسبتها رو بدون تقسیم شدن دو عدد، حفظ کنیم.
1/4
اگه در REPL
سعی کنید عدد ۲۲ رو تقسیم بر ۷ کنید، با این خروجی مواجه میشید:
user=> (/ 22 7)
22/7
و نتیجهی محاسبه رو به دست نمیارید. برای اینکه خروجی اعشاری دریافت کنید، باید یکی از ورودیها، عدد اعشاری باشه:
user=> (/ 22 7.0)
3.142857142857143
کاراکتر:
کاراکترها (تک کاراکتر) با backslash شروع میشن.
\a
\p
متن:
در حقیقت String!
استرینگها همونطور که انتظار میره، داخل Double quote (")
قرار میگیرن.
"Hello Immutable World!"
برخلاف اکثر زبانهای برنامه نویسی، امکان استفاده از Singe quote وجود نداره. در کلوژر، Single quote استفادهی دیگری داره که در تاپیکهای پیشرفته بهش میرسیم.
nil
در کنار این واحدهای دیتا، nil
هم وجود داره.
nil
به معنای «هیچ چیز». (معادل NULL
در زبانهای برنامه نویسی دیگه)
nil
سایر:
Atom ها (که در فصلهای بعد بهشون پرداخته میشه) در حقیقت «متغیر» هستن. مثل متغیرهایی که در اکثر زبانهای برنامه نویسی وجود داره.
اینجا توضیح بیشتری درموردشون نمیدم و مثال نمیزنم چون مبحثش پیچیدهتر از سطح این تاپیکه.
مثال
با توجه به توضیحاتی که در فصلهای قبل داده شد، میخوام یه مقدار با این دیتاتایپها کار کنیم تا بیشتر باهاشون آشنا بشیم. میتونید خودتون این مثالها رو داخل REPL اجرا کنید.
user=> (def the_answer 42)
#'user/the_answer
user=> (println the_answer)
42
nil
user=> (type the_answer)
java.lang.Long
user=> (def my_ratio 22/7)
#'user/my_ratio
user=> my_ratio
22/7
user=> (def another_ratio (/ 3 2))
#'user/another_ratio
user=> another_ratio
3/2
user=> (def pi (/ 22 7.0))
#'user/pi
user=> pi
3.142857142857143
برای استفادهی ترکیبی از ratio و اعداد معمولی مثل integer یا float نیازی به تبدیل اعداد نیست و خروجی به صورت عدد Decimal بدست میاد. (مثال: محاسبهی سطح دایره)
user=> (* pi (* 6 6))
113.14285714285714
user=> (* pi (* my_ratio my_ratio))
31.043731778425652
توضیح:
در کلوژر، توابع تودرتو از داخلی ترین پرانتز evaluate میشن و نتیجشون وارد پرانتز بالاتر میشه برای ادامهی پردازش.
یعنی در مثال بالا، اول(6 6 *)
محاسبه میشه و بعد جوابش در pi ضرب میشه:(pi 36 *)
زمانی که اعداد از مبناهای دیگه با اعداد decimal به صورت ترکیبی استفاده بشن هم نتیجه به صورت decimal نمایش داده میشه.
user=> (- 2r1001001 21.5)
51.5
user=> (* 2r111 100/20)
35
پاورقی:
درمورد core functionهای کلوژر در تاپیکهای آینده توضیح مفصلتری داده میشه.
ولی لازم میدونم الآن با دوتا از این توابع آشناتون کنم.
تابع type و read-string
تابع type که توی مثالهای بالا یک بار ازش استفاده کردم، نوع یک متغیر رو به ما نشون میده.
user=> (type 123)
java.lang.Long
user=> (def number 2r110110)
#'user/number
user=> (type number)
java.lang.Long
user=> (type \D)
java.lang.Character
و تابع read-string که بعدها در تاپیکهای پیشرفته خیلی بیشتر با این تابع کار میکنیم ولی فعلا در همین حد توضیح میدم که کارش (همونطور که از اسمش مشخصه) خوندن یک string و برگردوندن محتوای اون string هست.
user=> (read-string "2.5")
2.5
user=> (type (read-string "2.5"))
java.lang.Double
user=> (read-string "12/5")
12/5
user=> (type (read-string "12/5"))
clojure.lang.Ratio
user=> (read-string "5r1234") ;; عدد بر مبنای ۵
194
user=> (type (read-string "5r1234"))
java.lang.Long
در نهایت باید این نکته رو یادآوری کنم که Clojure روی ماشین مجازی جاوا (JVM) اجرا میشه و اندازهی دیتا محدود به محدودیتهای جاوا هست.
به عنوان مثال، 32bit integer داریم و نمیتونیم اعداد خیلی بزرگ رو داخلش نگهداریم.
در کلوژر، «DATA is CODE & CODE is DATA» به این صورت که function ها (که در مباحث قبلی درموردشون صحبت کردیم) در حقیقت یک لیست هستن.
درمورد Keyword، symbol، list، vector، map و set در تاپیک بعدی صحبت میکنیم.