Redefining a let'd variable in Clojure loop

后端 未结 4 1332
难免孤独
难免孤独 2021-02-01 02:00

OK. I\'ve been tinkering with Clojure and I continually run into the same problem. Let\'s take this little fragment of code:

(let [x 128]
  (while (> x 1)
            


        
4条回答
  •  余生分开走
    2021-02-01 03:00

    If you think that having mutable local variables in pure functions would be a nice convenient feature that does no harm, because the function still remains pure, you might be interested in this mailing list discussion where Rich Hickey explains his reasons for removing them from the language. Why not mutable locals?

    Relevant part:

    If locals were variables, i.e. mutable, then closures could close over mutable state, and, given that closures can escape (without some extra prohibition on same), the result would be thread-unsafe. And people would certainly do so, e.g. closure-based pseudo-objects. The result would be a huge hole in Clojure's approach.

    Without mutable locals, people are forced to use recur, a functional looping construct. While this may seem strange at first, it is just as succinct as loops with mutation, and the resulting patterns can be reused elsewhere in Clojure, i.e. recur, reduce, alter, commute etc are all (logically) very similar. Even though I could detect and prevent mutating closures from escaping, I decided to keep it this way for consistency. Even in the smallest context, non-mutating loops are easier to understand and debug than mutating ones. In any case, Vars are available for use when appropriate.

    The majority of the subsequent posts concerns implementing a with-local-vars macro ;)

提交回复
热议问题