У Clojure привʼязування значення до імені називають змінною. Змінні верхнього рівня (глобальні) схожі на константи в інших мовах.
Змінні верхнього рівня визначають за допомогою def:
(def fingers 10)
fingers
;;=> 10
Макрос defn можна використати, щоб визначити функцію, яка приймає нуль або більше аргументів. Ось функція, яка додає 2 числа разом:
(defn add [x y]
(+ x y))
Ця функція приймає 2 аргументи, які розміщено у векторі [x y], а далі йде тіло функції, яке може містити будь-яку кількість виразів. Повернене значення завжди є результатом обчислення останнього виразу в тілі, (+ x y). Цей вираз є списком, що представляє виклик функції. Першим елементом списку є функція +, яку обчислюють, використовуючи наступні елементи x і y як аргументи.
Функцію add, визначену вище, викликають так само:
(add 2 3)
;;=> 5
Функції та значення в Clojure можна використовувати лише після того, як їх визначили, тобто форми завжди обчислюються в тому порядку, у якому вони йдуть.
У Clojure пробільні символи не мають жодного значення, крім форматування.
Функції та змінні в Clojure організовано в простори імен. Простір імен обʼєднує споріднену функціональність і визначається за допомогою макросу ns:
(ns calculator)
(def pi 3.14)
(defn add [x y]
(+ x y))
Clojure підтримує два типи коментарів. Однорядкові коментарі починаються з ;, а форму comment використовують, щоб запобігти обчисленню всього між (comment і ).
У цій вправі ми напишемо трохи коду, який допоможе приготувати чудову лазанью з нашої улюбленої кулінарної книги.
На нас чекають чотири завдання, і всі вони повʼязані з часом, витраченим на приготування лазаньї.
Визначте змінну expected-time, щоб дізнатися, скільки хвилин лазанья має провести в печі. Згідно з кулінарною книгою, очікуваний час у печі становить 40 хвилин:
expected-time
;;=> 40
Визначте функцію remaining-time, яка приймає як аргумент кількість хвилин, які лазанья вже провела в печі, і повертає, скільки хвилин лазаньї ще потрібно залишатися в печі, виходячи з очікуваного часу в печі в хвилинах із попереднього завдання.
(remaining-time 30)
;;=> 10
Визначте функцію prep-time, яка приймає як аргумент кількість шарів, які ми додали до лазаньї, і повертає, скільки хвилин ми витратили на підготовку лазаньї, якщо на кожен шар іде 2 хвилини.
(prep-time 2)
;;=> 4
Визначте функцію total-time, яка приймає два аргументи: перший - це кількість шарів, які ми додали до лазаньї, а другий - кількість хвилин, які лазанья вже провела в печі. Функція повинна повернути, скільки хвилин загалом ми працювали над приготуванням лазаньї, тобто суму часу підготовки в хвилинах і часу в хвилинах, який лазанья на цей момент провела в печі.
(total-time 3 20)
;;=> 26
Зареєструйтеся на Exercism, щоб вивчати й опановувати Clojure, а також 12 концепцій105 вправ та справжнє наставництво від людей, і все це безкоштовно.