>
大小を判定する関数だ。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