Ho appena iniziato a giocare con Clojure e ho scritto una piccola sceneggiatura per aiutarmi a capire alcune delle funzioni. Comincia così:Confuso da "let" in Clojure
(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))"
])
Poi si passa attraverso *exprs-to-test*
, li valuta, e stampa l'output come questo:
(doseq [exstr *exprs-to-test*]
(do
(println "===" (first (read-string exstr)) "=========================")
(println "Code: " exstr)
(println "Eval: " (eval (read-string exstr)))
)
)
Il codice di cui sopra è tutto bene a lavorare. Tuttavia, (read-string exstr)
si ripete così ho cercato di usare let
per eliminare la ripetizione in questo modo:
(doseq [exstr *exprs-to-test*]
(let [ex (read-string exstr)] (
(do
(println "===" (first ex) "=========================")
(println "Code: " exstr)
(println "Eval: " (eval ex))
)
))
)
Ma questo funziona una volta per il primo elemento nella *exprs-to-test*
, poi blocca con un NullPointerException
. Perché l'aggiunta di let
provoca l'arresto anomalo?
Che risolto. Grazie anche per il suggerimento di stile indentato. –