когда

Хотя в Scheme if элегантен и универсален, он может сбить с толку, если использовать его без явного else. Это особенно верно, когда намерение состоит в том, чтобы выполнить одну ветку кода только тогда, когда условие истинно, без каких-либо альтернативных действий для случая false. В таких сценариях конструкция when предоставляет более четкую и краткую альтернативу.

Базовая форма when выглядит следующим образом:

(when test-is-true
  do-this
  do-that)
  • Если test имеет значение true (#t), все выражения в теле конструкции when выполняются последовательно.
  • Если test имеет значение false (#f), ничего не происходит и никакие значения не возвращаются.

Пример

(when (< 0 1)
  (lumi-message "Condition is true!")
  (lumi-message "Executing additional actions."))

Контраст if и when

Чтобы лучше понять разницу между if и when, рассмотрим следующий пример, в котором оба используются вместе:

(if (= 0 1)
  (lumi-message "This will not run")
  (when (< 0 1)
    (lumi-message "The 'when' condition is true!")
    (lumi-message "Executing multiple actions within 'when'.")))

Объяснение:

  1. Условие if:

    • Тест (= 0 1) проверяет, равен ли 0 1.
    • Поскольку это неверно (#f), выполняется ветка else if.
  2. Конструкция when в ветке else:

    • Тест when (< 0 1) проверяет, меньше ли 0 1.
    • Поскольку это правда (#t), все выражения в теле when выполняются последовательно:
      • First, it prints "The 'when' condition is true!".
      • Then, it prints "Executing multiple actions within 'when'.".

Зачем использовать здесь when?

  • Использование when вместо другого if упрощает логику, когда нет необходимости в явной ветви else для условия.
  • when дает понять, что актуальна только истинная ветвь, что снижает потенциальную путаницу.

Резюме

  • Используйте if, когда вам нужна как истинная, так и ложная ветвь.
  • Используйте when, когда для истинного случая существует только одна ветвь, особенно когда необходимо выполнить несколько действий.
  • Сочетание if и when может помочь четко и кратко структурировать более сложные условные выражения.