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 の実装を見直してみよう。