(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となる。ただし、手元のGaucheで試してみた限り、caseだと対象フォームは一度しか評価されない。なので、対象フォームの評価に副作用がある場合は、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 ...)
)
0 件のコメント:
コメントを投稿