>
大小を判定する関数だ。o> と書くことにしよう。(o> n m) は n>m のときに真を返す。
これはちょっと難しかった、というかややこしくて答を見てもすぐにはわからなかった。まあ、とにかく書いてみた。
(define sub1 (lambda (n) (- n 1))) (define o> (lambda (n m) (cond ((zero? n) #f) ((zero? m) #t) (else (o> (sub1 n) (sub1 m)))))) (print (o> 12 123)) (print (o> 12 1)) (print (o> 12 12))
ポイントは9-10行目の順番だ。最初、((zero? m) #t)
を先に書いてしまったら、n と m が同じときにも #t になってしまった。n のほうが m よりも大きいときだけ真になってほしいのだから、n が先に 0 になってしまってはいけない。これをチェックするには、((zero? n) #f)
を先に書くべきなんだ。
ということで、実行:
^o^ > gosh gt.scm #f #t #f
無事、うまくいった。
<
これは、o< と書くことにしよう。で、>ができれば<は簡単。n と m を入れ替えればいいだけだ。
(define sub1 (lambda (n) (- n 1))) (define o< (lambda (n m) (cond ((zero? m) #f) ((zero? n) #t) (else (o< (sub1 n) (sub1 m)))))) (print (o< 12 123)) (print (o< 12 1)) (print (o< 12 12))
実行:
^o^ > gosh lt.scm #t #f #f
OK!
=
=は n と m が等しいとき真を返す。o= と書くことにしよう。
(define sub1 (lambda (n) (- n 1))) (define o> (lambda (n m) (cond ((zero? n) #f) ((zero? m) #t) (else (o> (sub1 n) (sub1 m)))))) (define o< (lambda (n m) (cond ((zero? m) #f) ((zero? n) #t) (else (o< (sub1 n) (sub1 m)))))) (define o= (lambda (n m) (cond ((o> n m) #f) ((o< n m) #f) (else #t)))) (print (o= 12 123)) (print (o= 12 1)) (print (o= 12 12))
実行:
^o^ > gosh equal.scm #f #f #t