まず、値が数字であるか、文字であるかを調べるには、 number?, string?
をもちいればよいです。この場合、条件文が三つに分かれていたので、
cond を使っていますが、他のもので代用しても構いません。
> (define (num-str-add a b)
(cond ((and (number? a) (number? b))
(+ a b))
((and (string? a) (string? b))
(string-append a b))
(else 0)))
> (num-str-add (/ 2 3) (/ 1 3))
1
> (num-str-add "Work " "Hard!")
"Work Hard!"
> (num-str-add "strange pair" (* 2 4))
0
問題
1.4
西暦の年号を与えられた時、うるう年かどうかの真偽値を返す関数 leap
を書け。ただし、うるう年とは、原則としては4で割り切れる年であるが、100
でも割り切れるならば、400でも割り切れなくてはならない。(つまり、西暦
2000年は、100で割り切れるが、400でも割り切れるのでうるう年である)。
表現の仕方はいくらでもあるので、どれがいいとはいわない。
leap, leap2 の様に一つの論理式として記述する方法が考えられる
(論理式の書き方は他にもいろいろある)。
また、 leap3,leap4 の様に記述することもできるであろう。
発想は leap1,leap2 と同じであるが、
cond をもちいて場合分けという形で表現している。
> (define (leap1 year)
(and (= (remainder year 4) 0)
(or (not (= (remainder year 100) 0))
(= (remainder year 400) 0))))
> (define (leap2 year)
(or (= (remainder year 400) 0)
(and (not (= (remainder year 100) 0))
(= (remainder year 4) 0))))
> (define (leap3 year)
(cond ((not (= (remainder year 4) 0)) #f)
((not (= (remainder year 100) 0)) #t)
((not (= (remainder year 400) 0)) #f)
(else #t)))
> (define (leap4 year)
(cond ((= (remainder year 400) 0) #t)
((= (remainder year 100) 0) #f)
((= (remainder year 3) 0) #t)
(else #f)))
> (leap 2000)
#t
> (leap 1999)
#f
> (leap 1996)
#f
> (leap 2100)
#f
問題