Clojure中下面的表達式的偉大工程:空指針Clojure中在身體上運行多個表情doseq時
(doseq [x '(1 2 3 4)] (println x))
這一次給了我一個空指針:
(doseq [x '(1 2 3 4)] ((println x)(println "x")))
它產生下面的輸出:
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
只需在doseq gi的身體周圍添加一組額外的括號我指的是空指針。 我在做什麼錯?
我已經想出瞭如何解決這個問題,但我並沒有真正理解它。 當doseq執行它的主體時,它評估那裏的表達式。 ((println x)(println x)) 以上計算結果爲println在head(nil)處返回值的列表。然後,在下一次迭代時,它會嘗試評估該列表。 解決方案是使用'do'。 (dosel [x'(1 2 3 4)](do(println x)(println「x」))) –