if じゃなくて cond を使おう

Scheme の if 式は

(if <test> <then> <else>)

という感じなので、

if (a == 1) {
    printf("a is 1");
} else if (a == 2) {
    printf("a is 2");
} else if (a == 3) {
    printf("a is 3");
} else if (a == 4) {
    printf("a is 4");
} else {
    printf("unknown");
}

という条件分岐を書きたい場合、

(if (= a 1) (display "a is 1")
  (if (= a 2) (display "a is 2")
    (if (= a 3) (display "a is 3")
      (if (= a 4) (display "a is 4")
        (display "unknown")))))

こんな感じでどんどんネストしていって、見にくくなってしまう(それとも、Lisper にはこれは見やすいのだろうか?)。

そこで登場するのが cond 式。

(cond
  (<test1> <then1>)
  (<test2> <then2>)
  (<test3> <then3>)
  ...
  (else <otherwise>))

上記の if 式を置き換えると、

(cond
  ((= a 1) (display "a is 1"))
  ((= a 2) (display "a is 2"))
  ((= a 3) (display "a is 3"))
  ((= a 4) (display "a is 4"))
  (else (display "a is unknown")))

当社非 256 倍見やすくなりました。


cond を使って append の実装を見直してみよう。