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; }
眠い。。。
moremagic
2014-06-02