case

8章4節のcaseに関して。
C言語とかでのswitch-case文みたいなことができるのね。

(case <key式>
  (リスト1 複数のS式)
  (リスト2 複数のS式)
  ...
  (リストn 複数のS式)
  (else 複数のS式)

まずを評価する。
んで、リスト1、リスト2、...、リストnの順に要素にと同じものがないか調べる。
同じかどうか調べる際に用いられる等価述語はeqv?。
リストiの要素は評価されないので、変数は書けない。これ要注意。
要素に同じものが見つかった場合は、隣の「複数のS式」を順に評価して最後のS式をcase全体の値とする。

(リストi 複数のS式)

の部分は、condのように

(リストi => 手続きを生成するS式)

とできる。
「=>」を使わない場合にはリストiの隣には複数のS式をかけたけど、使う場合には、手続きを生成するS式を1個しか書けないようだ。

ということで、caseを使ってみた。

gosh> (define score
        (lambda (card)
          (case x
            ((A) 11)
            ((J Q K) 10)
            ((2 3 4 5 6 7 8 9 10) card))))
score
gosh> (score 'A)
11
gosh> (score 'J)
10
gosh> (score 2)
2