简体   繁体   English

Clojure lazy-seq给了我ArithmeticException

[英]Clojure lazy-seq gives me ArithmeticException

I am trying to re-implement my custom map function, but it works in a strange way. 我试图重新实现我的自定义地图功能,但是它以一种奇怪的方式工作。 Could some one explain why it happens? 有人可以解释为什么会发生吗?

(defn my-map [f coll]
  (lazy-seq
   (when-let [s (seq coll)]
     (cons (f (first s)) (my-map f (rest s))))))

(take 10 (my-map inc (range)))

(take 10 (->> [0 1]
              (iterate (fn [[a b]] [b (+ a b)]))
              (my-map first)))

First take works as expected, but second gives me following error (looks like it evaluating all sequence): 首先采取预期的效果,但是第二次出现以下错误(看起来像是在评估所有序列):

java.lang.ArithmeticException: integer overflow
    Numbers.java:1388 clojure.lang.Numbers.throwIntOverflow
    Numbers.java:1687 clojure.lang.Numbers.add
     Numbers.java:430 clojure.lang.Numbers$LongOps.add
     Numbers.java:126 clojure.lang.Numbers.add

You are right, it is a lighttable bug. 没错,这是一个可疑的错误。 You should log it here 你应该在这里登录

The following work in lighttable without issue 光工作台中的以下工作没有问题

(->> [0 1] 
     (iterate (fn [[a b]] [b (+ a b)])) 
     (take 10)
     (my-map first))

and

(take 10 (->> [0 1M]
              (iterate (fn [[a b]] [b (+ a b)]))
              (my-map first)))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM