Confused by "let" in Clojure

Posted by Tom Dalling on Stack Overflow See other posts from Stack Overflow or by Tom Dalling
Published on 2010-03-07T03:39:50Z Indexed on 2010/03/17 4:51 UTC
Read the original article Hit count: 172

Filed under:
|
|

I just started playing with Clojure, and I wrote a small script to help me understand some of the functions. It begins like this:

(def *exprs-to-test* [  
    "(filter #(< % 3) '(1 2 3 4 3 2 1))"
    "(remove #(< % 3) '(1 2 3 4 3 2 1))"
    "(distinct '(1 2 3 4 3 2 1))"
])

Then it goes through *exprs-to-test*, evaluates them all, and prints the output like this:

(doseq [exstr *exprs-to-test*]
    (do 
        (println "===" (first (read-string exstr)) "=========================")
        (println "Code: " exstr)
        (println "Eval: " (eval (read-string exstr)))
    )
)

The above code is all working fine. However, (read-string exstr) is repeated so I tried to use let to eliminate the repetition like so:

(doseq [exstr *exprs-to-test*]
    (let [ex (read-string exstr)] (
        (do 
            (println "===" (first ex) "=========================")
            (println "Code: " exstr)
            (println "Eval: " (eval ex))
        )
    ))
)

But this works once for the first item in *exprs-to-test*, then crashes with a NullPointerException. Why is the addition of let causing the crash?

© Stack Overflow or respective owner

Related posts about clojure

Related posts about let