condはまた今度

隠れてSICP生活突入。

昨日else ifが無い無いって頭に来てたけど、普通に勉強してたことに気づきました。


(define (test a b)
(cond ((< a b) a)
((= a b) a) ←これ(else if)
(else b)))
だよね。

でも


(define (test a b c)
(cond (and (< a b)(< a c)) 10))

(test 1 2 3)
=> #t
(test 5 2 3)
=> #f

とかしても
trueかfalseしか帰ってこない。

つまりcond文でandを使うのは無理ってことなのかね。

condってどーやって使うねんと。


Lisp 一夜漬け
http://www.haun.org/kent/lisp1/1.html#SYNTAX

(cond (P0 E00 E01 E02 ...)
(P1 E10 E11 E12 ...)
(P2 E20 E21 E22 ...)
...
(Pn En0 En1 En2 ...))

P0 を評価し、もし真ならば E00 E01 E02 ... を評価して終了する。

なんかSICPと違うんだけど。。大丈夫なのかこの本。

つまり、


(define (test a b c)
(cond (< a b) (cond(< a c) (cond (< b a) 1))))

(整形)

(define (test a b c)
(cond (< a b)
(cond(< a c)
(cond (< b a) 1)
)
)
)

みたいな書き方がOKってことらしい。

ちなみにelseも足せるのかね。


(define (test a b c)
(cond (< a b)
(cond(< a c)
(cond (< b a) 1
(else 2)
)
(else 3)
)
(else 4)
)
)

括弧の使い方がよくわからないけど。どんまい。

ってことはこーゆうこと?


(define (test a b c)
(cond (< a b)
(cond(< a c)
(+(* b b) (* c c))
(else (+ (* a a) (* b b)))
)
(else 100)
)
)

(test 1 2 3)
=> 2
(test 5 2 5)
=> 2
(test 5 5 2)
=> 5

うーん。もうね、わかんね。