Керування потоком виконання

Підхід до керування потоком виконання програми у 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"

results matching ""

    No results matching ""