Scheme手習い の > が動かない。

Scheme手習いの > が
自分の処理系でStackOverFlowになってしまうのです。

コードはこんな感じです。

;;p61
(define sub1 (lambda (n) (- n 1)))

;;p75
(define >
  (lambda (n m)
    (cond
      ((zero? n) #f)
      ((zero? m) #t)
      (else (> (sub1 n) (sub1 m))))))
 (> 1000.2 1000.1)
Exception in thread "main" java.lang.StackOverflowError
	at sun.misc.FDBigInt.<init>(FloatingDecimal.java:2421)
	at sun.misc.FDBigInt.sub(FloatingDecimal.java:2703)
	at sun.misc.FloatingDecimal.doubleValue(FloatingDecimal.java:1547)
	at java.lang.Double.parseDouble(Double.java:510)
	at java.math.BigDecimal.doubleValue(BigDecimal.java:3129)

スタックオーバーフローってことは末尾再帰ミスが原因なのかな?
なんでだろう。。。と30分ほどにらめっこしてたらわかっちゃいました。



ちょ、、、これ、、
よく見てみたら整数型でないと比較できないじゃん!!!

(sub1 n) か (sub1 m) が 0 にならなくちゃいけないけど
整数型じゃないといくらでもマイナスになってしまう。




ということで > は Javaで実装しちゃうことにします。

    private boolean greaterThanNumber(Number a, Number b) {
        boolean ret;
        if (a instanceof Double && b instanceof Double) {
            ret = (Double) a > (Double) b;
        } else if (a instanceof Integer && b instanceof Integer) {
            ret = (Integer) a > (Integer) b;
        } else {
            ret = (new BigDecimal((double) a.doubleValue()).compareTo(new BigDecimal((double) b.doubleValue())) > 0);
        }

        return ret;
    }


眠い。。。