2015-06-13 4 views
0

Почему, когда я бегуПочему y = 0, когда я запускаю println?

(def y 0) 
    (doseq [x (range 1000)] (if (or (= (mod x 3) 0) (= (mod x 5) 0)) (+ y x))) 
    (println y) 

он печатает 0, как если бы дополнение не место, но

(doseq [x (range 1000)] (if (or (= (mod x 3) 0) (= (mod x 5) 0)) (println x))) 

распечатает все соответствующие номера, которые соответствуют условиям?

ответ

2

Как и во всех других основных языках, + в Clojure не имеет побочных эффектов и не меняет свой вход. В вашем doseq нет логики, которая могла бы изменить значение y.

Во втором примере println внутри doseq видит временные локальные значения для x, что иногда вызывает печать.

3

В clojure значения неизменяемы. y есть, и будет 0 на всю вечность. (+ y 1) равен 1, и всегда будет 1. (+ y 1) не меняет значение y, он просто вычисляет результат добавления 1 к неизменяемому значению y.

Попробуйте это:

(println 
    (reduce 
    (fn [y x] 
     (if (or (= (mod x 3) 0) 
       (= (mod x 5) 0)) 
     (+ y x) y)) 
    0 (range 1000))) 

Здесь мы строим y с течением времени за счет сокращения более диапазона в вопросе. Если мы сопоставим ваше состояние, добавим следующее значение (x). Если мы не соответствуем вашему условию, мы просто вернем y.

Посмотрите на функцию reduce.

Примечание: там мой быть опечатки, я написал это на моем телефоне

Смежные вопросы