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: 188
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