在Clojure中打印并返回另一个值

时间:2014-11-29 13:02:56

标签: clojure

我有一个Clojure初学者问题,为什么下面的代码不起作用:

(defn aFun [n]
  (if (< -10 n 10) 
       ((println "Single digit" n) "A return value")
       ((println "More digits" n) "Another return value")))

我在运行时得到NullPointerException。为什么?

此功能有效:

(defn aFun [n]
  (if (< -10 n 10) 
       "A return value"
       "Another return value"))

还有这个:

(defn aFun [n]
  (if (< -10 n 10) 
       (println "Single digit" n)
       (println "More digits" n)))

我想同时做两件事:(计算和)返回一个值,同时首先打印一些东西。我确定这是非常基本的(甚至不确定如何标题我的问题),但我无法得到我做错的事。

1 个答案:

答案 0 :(得分:6)

((println "Single digit" n) "A return value")

...尝试将(println "Single digit" n)作为函数返回nil"A return value"

你可能打算

(do (println "Single digit" n) "A return value")

尽可能尝试将副作用与纯函数计算分开。例如,

(defn single-digit? [n]
  (< -10 n +10))

......很纯粹。你可以把它包装成打印你喜欢的东西。