la seguente espressione nella clojure funziona alla grande:Nullpointer in clojure durante l'esecuzione doseq con le espressioni multiple nel corpo
(doseq [x '(1 2 3 4)] (println x))
Questo mi dà una nullpointer:
(doseq [x '(1 2 3 4)] ((println x)(println "x")))
Si produce il seguente output:
user=> (doseq [x '(1 2 3 4)] ((println x)(println "x")))
1
x
java.lang.NullPointerException (NO_SOURCE_FILE:0)
user=> (.printStackTrace *e)
java.lang.NullPointerException (NO_SOURCE_FILE:0)
at clojure.lang.Compiler.eval(Compiler.java:4639)
at clojure.core$eval__5182.invoke(core.clj:1966)
at clojure.main$repl__7283$read_eval_print__7295.invoke(main.clj:180)
at clojure.main$repl__7283.doInvoke(main.clj:197)
at clojure.lang.RestFn.invoke(RestFn.java:426)
at clojure.main$repl_opt__7329.invoke(main.clj:251)
at clojure.main$legacy_repl__7354.invoke(main.clj:292)
at clojure.lang.Var.invoke(Var.java:359)
at clojure.main.legacy_repl(main.java:27)
at clojure.lang.Repl.main(Repl.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at jline.ConsoleRunner.main(ConsoleRunner.java:69)
Caused by: java.lang.NullPointerException
at user$eval__266.invoke(NO_SOURCE_FILE:26)
at clojure.lang.Compiler.eval(Compiler.java:4623)
... 14 more
nil
Basta aggiungere un set aggiuntivo di parentesi attorno al corpo di una doseq gi mi dice quel punto nullo. Cosa sto sbagliando?
Ho capito come risolvere questo problema, ma non lo faccio davvero. Quando doseq esegue il suo corpo valuta le espressioni lì. ((println x) (println x)) Quanto sopra valuta un elenco con il valore di ritorno di println a testa (nil). Quindi, alla successiva iterazione, tenta di valutare quell'elenco. La soluzione è usare 'do'. (doseq [x '(1 2 3 4)] (do (println x) (println "x")))) –