もし

最も単純な形式では、Scheme の if 条件はテストを評価し、その結果に基づいて 2 つの可能なコード ブロックの 1 つを実行します。最も単純な形式は次のようになります。

(if test-is-true
  do-this)
  • test が true (#t) と評価された場合、結果の コード ブロックが実行されます。ブロックは値を返したり、変数の割り当てや出力の印刷などの他のアクションを実行したりできます。

(if (< 0 1)
  (lumi-message "True!"))
  • この場合、test(< 0 1) です (0 が 1 より小さいかどうかを確認します)。
  • テストは true (#t) と評価されるため、コード ブロック (lumi-message "True!") が実行され、"True!" が出力されます。

Else 条件の追加: if-else

if 条件を代替コード ブロックとともに使用する場合 (else の場合)、構造は次のようになります。

(if test
  do-this
  else-do-this)
  • test が true (#t) と評価された場合、結果 コード ブロックが実行されます。
  • test が false (#f) と評価された場合、代替 コード ブロックが実行されます。
(if test
  consequent
  alternative)

仕組み

  1. テスト式:

    • test 式が最初に評価されます。
  2. テストに基づく結果:

    • test が true (#t) と評価された場合、結果のコード ブロックが実行されます。
    • test が false (#f) と評価された場合、代替コード ブロック が実行されます。

consequentalternative の両方のコード ブロックは、値の戻り、変数の変更、プロシージャの実行など、有効な Scheme 操作を実行できます。

例 1: 値を返す

(if (< 0 1)
  1
  0)
  • ここで、test(< 0 1) です (0 が 1 未満かどうかを確認します)。
  • テストは true (#t) と評価されるため、consequent ブロック (1) が実行され、その値が返されます。

結果: 1

例 2: begin ブロックの評価

条件が true または false のときに複数のアクションを実行する必要がある場合は、begin または let を使用してそれらをグループ化できます。

(if (= 0 1)
  (begin
    (lumi-message "This won't run")
    1)
  (begin
    (lumi-message "False condition met, calculating...")
    (* 3 4)))
  • この例では、test(= 0 1) です (0 が 1 に等しいかどうかを確認します)。
  • テストは false (#f) と評価されるため、代替 ブロックが実行されます。
    • まず、"False condition met, calculating..." を出力します。
    • 次に、(* 3 4) を計算し、12 を返します。

結果: 「偽の条件が満たされました。計算中…」を出力し、12 を返します。

例 3: let ステートメントの評価

let を使用すると、コード ブロック内でローカル スコープ変数を宣言できます。

(if (= 1 1)
  (let (x -1)
    (lumi-message "True condition met, calculating...")
    (* x 10))
  (let (y 4)
    (lumi-message "This won't run")
    (* 3 y)))
  • この例では、test(= 1 1) です (1 が 1 に等しいかどうかを確認します)。
  • テストは true (#t) と評価されるため、consequent ブロックが実行されます。
    • まず、"True condition met, calculating..." を出力します。
    • 次に、(* -1 10) を計算し、-10 を返します。

結果: 「真の条件が満たされました。計算中…」を出力し、-10 を返します。

概要- if 条件は、テストを評価し、対応するコード ブロックを実行するための Scheme の強力なツールです。

  • 単純な式と、値を返したり、変数を変更したり、副作用を実行したりする複雑なコード ブロックの両方を処理できます。
  • 覚えておいてください: 明示的な else ブロックがない場合、if はテストが true の場合にのみ 結果 を評価して実行します。それ以外の場合は、代替を評価して実行します。