2014-05-14 3 views
1

Я пытаюсь повторно реализовать свою пользовательскую функцию карты, но это работает странным образом. Может кто-нибудь объяснить, почему это происходит?Clojure lazy-seq дает мне ArithmeticException

(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))) 

Первое взятие работает, как ожидалось, но вторая дает мне следующее сообщение об ошибке (выглядит она все оценки последовательности):

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 
+0

Проблема была в легкой таблице, в простом РЕПЛ он работает, как ожидалось. –

ответ

0

Вы правы, это lighttable ошибка. Вы должны войти его here

Следующая работа в lighttable без проблем

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

и

(take 10 (->> [0 1M] 
       (iterate (fn [[a b]] [b (+ a b)])) 
       (my-map first))) 
Смежные вопросы