در Clojure، به اتصال یک مقدار به یک اسم، «var» میگویند. varهای سطح بالا (سراسری) شبیه ثابتها در زبانهای دیگر هستند.
varهای سطح بالا با def تعریف میشوند:
(def fingers 10)
fingers
;;=> 10
میتوانید از defn برای تعریف تابعی استفاده کنید که صفر یا چند آرگومان میگیرد. این تابعی است که دو عدد را با هم جمع میکند:
(defn add [x y]
(+ x y))
این تابع دو آرگومان میگیرد که داخل بردار [x y] قرار میگیرند و پس از آن بدنهی تابع میآید که میتواند هر تعداد عبارت داشته باشد. مقدار بازگشتی همیشه نتیجهی ارزیابی آخرین عبارت در بدنه است، یعنی (+ x y). این عبارت یک لیست است که نشاندهندهی فراخوانی یک تابع است. اولین عنصر لیست، تابع + است که با استفاده از عناصر بعدی، یعنی x و y، به عنوان آرگومان ارزیابی میشود.
تابع add که بالا تعریف شد، به همین شکل فراخوانی میشود:
(add 2 3)
;;=> 5
توابع و مقادیر در Clojure فقط بعد از تعریف شدن قابل استفادهاند، یعنی فرمها همیشه به همان ترتیبی که ظاهر میشوند ارزیابی میشوند.
در Clojure، فضای سفید هیچ اهمیت دیگری جز قالببندی ندارد.
توابع و varهای Clojure در فضاهای نام سازماندهی میشوند. یک فضای نام، قابلیتهای مرتبط را گروهبندی میکند و با ماکروی ns تعریف میشود:
(ns calculator)
(def pi 3.14)
(defn add [x y]
(+ x y))
Clojure از دو نوع کامنت پشتیبانی میکند. کامنتهای تکخطی با ; شروع میشوند و فرم comment برای جلوگیری از ارزیابی هر آنچه بین (comment و ) قرار دارد به کار میرود.
در این تمرین قرار است کدی بنویسید که به شما کمک کند از روی کتاب آشپزی محبوبتان یک لازانیای عالی بپزید.
چهار کار پیش رو دارید که همه به زمان صرفشده برای پخت لازانیا مربوط میشوند.
متغیر expected-time را تعریف کنید تا بررسی کنید لازانیا چند دقیقه باید در فر بماند. بر اساس کتاب آشپزی، زمان مورد انتظار پخت در فر ۴۰ دقیقه است:
expected-time
;;=> 40
تابع remaining-time را تعریف کنید که تعداد دقیقههایی را که لازانیا تاکنون در فر بوده است بهعنوان آرگومان میگیرد و بر اساس زمان مورد انتظار پخت در فر (بر حسب دقیقه) از کار قبلی، برمیگرداند که لازانیا چند دقیقهی دیگر باید در فر بماند.
(remaining-time 30)
;;=> 10
تابع prep-time را تعریف کنید که تعداد لایههایی را که به لازانیا اضافه کردهاید بهعنوان آرگومان میگیرد و برمیگرداند که چند دقیقه صرف آماده کردن لازانیا کردهاید، با این فرض که آماده کردن هر لایه ۲ دقیقه طول میکشد.
(prep-time 2)
;;=> 4
تابع total-time را تعریف کنید که دو آرگومان میگیرد: آرگومان اول تعداد لایههایی است که به لازانیا اضافه کردهاید و آرگومان دوم تعداد دقیقههایی است که لازانیا در فر بوده است. این تابع باید برگرداند که در کل چند دقیقه روی پخت لازانیا کار کردهاید؛ یعنی مجموع زمان آمادهسازی بر حسب دقیقه و زمانی که لازانیا تا این لحظه در فر گذرانده است.
(total-time 3 20)
;;=> 26