Schemeのお勉強 その3 条件判定
if, when, unless
lisp の if 式は、他のどの言語の if 文 よりもシンプルだと思う。一切の無駄が無い。
gosh> (define x 10) x gosh> (if (< x 100) "small" "big") "small" gosh> (if (< x 100) (begin (display "A") (display "B") (display "C")) (display "Z")) ABC#<undef>
if 式の then 節、else 節はフォームを1つしか取らないので、順次処理を行いたい場合は begin フォームを使う。begin はこういう時使うんだ。
begin が面倒なときは、when, unless で代用。こちらはGaucheではマクロ(マクロが何たるかはよく知らない)。
gosh> (when (< x 100) (display "A") (display "B") (display "C")) ABC#<undef>
if と違って、else節が無い。unless は when とロジックが逆になるだけ。
case, cond
case は、C言語の switch に似ている。
gosh> (case x ((5) "Hoge") ((10) "Fuga") ((15) "Moga") (else "Piyo")) "Fuga"
条件判定に自由度がほしいときは、cond を使う。たしか、VB の Case 文がこんな感じだった気がする。
gosh> (cond ((< x 5) "Hoge") ((< x 10) "Fuga") ((< x 15) "Moga") (else "Piyo")) "Moga"
何かに似ている…… そうか、SQL の CASE WHEN に良く似てるんだ。
SQLのCASE WHEN は条件の与え方が2通りあって、その2通りってのがちょうど scheme の case と cond に似てる。
-- scheme の case っぽい SQL-CASE。 SELECT CASE x WHEN 5 THEN 'Hoge' WHEN 10 THEN 'Fuga' WHEN 15 THEN 'Moga' ELSE 'Piyo' END X_VALUE FROM HOGEHOGE_TBL; -- scheme の cond っぽい SQL-CASE。 SELECT CASE WHEN x < 5 THEN 'Hoge' WHEN x < 10 THEN 'Fuga' WHEN x < 15 THEN 'Moga' ELSE 'Piyo' END X_VALUE FROM HOGEHOGE_TBL;
ほら、そっくり。
and , or
論理演算に and と or。これは他の言語と同じと思ってよさそう。
gosh> (define x 10) x gosh> (if (and (> x 0) (< x 50)) (display "YES") (display "NO")) YES#<undef> gosh> (if (or (> x 100) (= x 10)) (display "YES") (display "NO")) YES#<undef>