这是功能
(#(
(println (str "first: " %1))
(println (str "second: " %2))
(println (str "rest: " (clojure.string/join ", " %&))))
"f" "s" "x" "y" "z")
在苹果酒中运行时,我得到了理想的结果,但最后我发现我也得到了NullPointerException。
似乎这种形式的匿名函数在解构时存在一些问题。
因为,当我尝试使用以下形式的匿名函数时,它可以正常工作。
((fn [f s & rest]
(println (str "first: " f))
(println (str "second: " s))
(println (str (clojure.string/join ", " rest))))
"f" "s" "x" "y" "z")
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
您需要do
:
(#(do
(println (str "first: " %1))
(println (str "second: " %2))
(println (str "rest: " (clojure.string/join ", " %&))))
"f" "s" "x" "y" "z")
如果没有do
,您就会尝试在列表的其余元素上调用第一个println
的结果(即nil
)。 fn
有一个隐含的do
。
对于最小的情况,请比较((println))
和(do (println))