2012年4月22日日曜日

Scheme第3歩

制御構文について。まずはif。
(if 条件フォーム 真のとき評価されるフォーム 偽のとき評価されるフォーム)
これは、C言語で言うところの3項演算子。いちいちフォームと書いたのは、いずれもS式である必要がないから。偽のとき評価されるフォームは省略可能。なお
(if #f "never evaluated")
をGaucheで評価すると、#<undef>という値が返ってくる。

whenとunlessはifの亜種。
(when 条件フォーム フォーム1 フォーム2 フォーム3 ...)

(if  条件フォーム (begin フォーム1 フォーム2 フォーム3 ...))
と等価。unlessはwhenの真偽反転版で、
(unless 条件フォーム フォーム1 フォーム2 フォーム3 ...)

(when (not 条件フォーム) フォーム1 フォーム2 フォーム3 ...)
と等価。

次はcond。これはifのネストの略記版で、
(cond
  (条件フォーム1 フォーム1-1 フォーム1-2 ...)
  (条件フォーム2 フォーム2-1 フォーム2-2 ...)
  (else フォーム3-1 フォーム3-2 ...)
)

(if 条件フォーム1 (begin フォーム1-1 フォーム1-2 ...)
  (if 条件フォーム2 (begin フォーム2-1 フォーム2-2 ...)
    (begin フォーム3-1 フォーム3-2 ...)
  )
)

と等価。

最後にcase。これはC言語で言うところのswitchのようなもの(Cの場合、switchは式ではないので値を持たないが)。
(case 対象フォーム
  ((一致条件フォーム1-1 一致条件フォーム1-2 ...)
     フォーム1-1 フォーム1-2 ...
  )
  ((一致条件フォーム2-1 一致条件フォーム2-2 ...)
     フォーム2-1 フォーム2-2 ...
  )
  (else フォーム3-1 フォーム3-2 ...)
)
無理矢理condで書くと
(cond
  ((or
    (equal? 対象フォーム 一致条件フォーム1-1)
    (equal? 対象フォーム 一致条件フォーム1-1) ...)
      フォーム1-1 フォーム1-2 ...
  )
  ((or
    (equal? 対象フォーム 一致条件フォーム2-1)
    (equal? 対象フォーム 一致条件フォーム2-1) ...)
      フォーム2-1 フォーム2-2 ...
  )
  (else フォーム3-1 フォーム3-2 ...)
)
となる。ただし、手元のGaucheで試してみた限り、caseだと対象フォームは一度しか評価されない。なので、対象フォームの評価に副作用がある場合は、condで書いた結果と一致する保証は無い模様。

0 件のコメント:

コメントを投稿