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>