Schemeで分岐を行う

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

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

分岐 (if)

 分岐を行うにはif式を使用する

一般形
(if 条件式 真の場合の式 偽の場合の式)
例1
; 大人か小人かを判定する
(define (if-test1 age)
  (if (>= age 20) 'adult 'child))

; 実行例
> (if-test1 19)
child
> (if-test1 20)
adult
例2

 条件式、真の場合の式、偽の場合の式を改行で分けることもできる。

(define (if-test2 age)
  (if (>= age 20)
      'adult
      'child))

分岐 (not, and, or)

not式

 真偽を反転するときにはnot式を使用する。
not式は引数が#fであれば#tを、それ以外であれば#fを返す。

一般形
(not 条件式)
例1
(define (not-test x)
  (if (not(= x 1)) #t #f ))

; 実行例
> (not-test 1)
#f
> (not-test 2)
#t
and式

 条件が全て成り立つかどうかを調べるには、and式を使用する。

一般形
(and 条件式1 条件式2 ・・・条件式n)
例1
(define (and-test1 x)
  (if (and (> x 1) (< x 10))
      'ok
      'error))

; 実行例
> (and-test1 2)
ok
> (and-test1 9)
ok
> (and-test1 1)
error
> (and-test1 10)
error

 and式の条件は左から評価されるので使用の際は注意が必要である。
例えば以下の例2の場合はエラーにならないが、例3の場合はエラーが発生する。

例2
(define (and-test2 x)
  (if (and (number? x) (> x 1) (< x 10))
      'ok
      'error))

; 実行例
> (and-test2 5)
ok
> (and-test2 'Foo)
error
例3
(define (and-test3 x)
  (if (and (> x 1) (< x 10) (number? x) )
      'ok
      'error))

; 実行例
> (and-test3 5)
ok
> (and-test3 'Foo)
: expects type  as 1st argument, given: foo; other arguments were: 1
or式

 条件にどれか1つでも真があるかを調べるには、or式を使用する。

一般形
(or 条件式1 条件式2 ・・・条件式n)
;入力が1か2であればok,それ以外ならばerrorを返す
(define (or-test1 x)
  (if (or (= x 1) (= x 2))
      'ok
      'error))

; 実行例
> (or-test1 1)
ok
> (or-test1 2)
ok
> (or-test1 3)
error

 or式の条件はand式と同じく左から評価されるので使用の際は注意が必要である。