Керування потоком виконання
Підхід до керування потоком виконання програми у ClojureScript відрізняється від того, який зазвичай використовується в мовах JavaScript, C, та ін.
Розгалуження з if
Почнемо з основного: if. В ClojureScript if — це вираз з трьома параметрами: умова, вираз, що буде обчислений, якщо умова — логічне true, та вираз, що буде обчислений, коли умова — логічне false.
(defn discount
"You get 5% discount for ordering 100 or more items"
[quantity]
(if (>= quantity 100)
0.05
0))
(discount 30)
;; => 0
(discount 130)
;; => 0.05
Блок виразів у формі do можна використати, в даному випадку, для того, щоб мати декілька виразів в одній із гілок if. Більше про do в наступній секції.
Розгалуження з cond
Деколи простого if може бути недостатньо, оскільки в ньому немає else if. Макрос cond вирішує цю проблему.
У виразі cond можна записати декілька умов:
(defn mypos?
[x]
(cond
(> x 0) "positive"
(< x 0) "negative"
:else "zero"))
(mypos? 0)
;; => "zero"
(mypos? -2)
;; => "negative"
Також cond має іншу, дуже схожу, форму — condp, яка підходить краще, коли усі умови мають однакову предикату:
(defn translate-lang-code
[code]
(condp = (keyword code)
:es "Spanish"
:en "English"
"Unknown"))
(translate-lang-code "en")
;; => "English"
(translate-lang-code "fr")
;; => "Unknown"
Рядок condp = (keyword code) означає, що функція = буде викликана на кожній умові з результатом виразу (keyword code).
Розгалуження з case
Вираз розгалуження case схожий на condp. Головною відмінністю є те, що в case предикатою завжди буде =, а значення умов обчислюється під час компіляції. Саме тому ця форма ефективніша за cond та condp, але недоліком є те, що ці значення повинні бути статичні.
Ось попередній приклад переписаний з використанням case:
(defn translate-lang-code
[code]
(case code
"es" "Spanish"
"en" "English"
"Unknown"))
(translate-lang-code "en")
;; => "English"
(translate-lang-code "fr")
;; => "Unknown"