Schemeで多分岐を行う

※ 以下はScheme初心者である私の勉強用のメモです。

間違っている可能性がありますので注意してください。

多分岐 (cond, case)

多分岐を行う関数にはcond式とcase式がある。

cond式

 if式のように条件を指定して多分岐を行うにはcond式を使用する。

一般形
(cond  (条件1 式1)
       (条件2 式2)
       (・・・ ・・・)
       (条件n 式n)
       (else ))
例1
; 賀寿祝いの歳か否かを判定する
(define (cond-test1 age)
  (cond
    ((= age 60) "還暦")
    ((= age 70) "古希")
    ((= age 77) "喜寿")
    ((= age 80) "傘寿")
    ((= age 88) "米寿")
    ((= age 90) "卒寿")
    ((= age 99) "白寿")
    ((= age 100) "百寿")
    ((= age 108) "茶寿")
    (else "賀寿祝いの歳ではありません")))

; 実行例
> (cond-test1 60)
"還暦"
> (cond-test1 108)
"茶寿"
> (cond-test1 59)
"賀寿祝いの歳ではありません。"
例2
; ソース
(define (cond-test2 x)
  (cond
    ((< x 5) "x < 5")
    ((> x 5) "5 < x")
    (else "x = 5")))

; 実行例
> (cond-test2 4)
"x < 5"
> (cond-test2 6)
"5 < x"
> (cond-test2 5)
"x = 5"
case式

 C言語のswitch文のように、あらかじめ決められているデータのどれであるかを判定する場合にはcase式を使用する。

一般形
(case キー
  (リスト1 式1)
  (リスト2 式2)
  (・・・ ・・・)
  (リストn 式n)
  (else )
例1
; 賀寿祝いの歳か否かを判定する
(define (case-test1 age)
  (case age
    ((60) "還暦")
    ((70) "古希")
    ((77) "喜寿")
    ((80) "傘寿")
    ((88) "米寿")
    ((90) "卒寿")
    ((99) "白寿")
    ((100) "百寿")
    ((108) "茶寿")
    (else "賀寿祝いの歳ではありません。")))

; 実行例
> (case-test1 60)
"還暦"
> (case-test1 108)
"茶寿"
> (case-test1 59)
"賀寿祝いの歳ではありません。"
例2
; ソース
(define (case-test2 x)
  (case x
    ((1 2 3) "x = 1 or 2 or 3")
    ((4 5 6) "x = 4 or 5 or 6")
    (else "x = ?")))

; 実行例
> (case-test2 1)
"x = 1 or 2 or 3"
> (case-test2 6)
"x = 4 or 5 or 6"
> (case-test2 7)
"x = ?"