简体   繁体   English

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

[英]print and return another value in Clojure

I have a Clojure beginner question about why the following code doesn't work : 我有一个Clojure初学者问题,为什么下面的代码不起作用:

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

I get a NullPointerException at runtime. 我在运行时收到NullPointerException Why ? 为什么呢

This function works : 此功能有效:

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

And this one too : 这也是:

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

I'd like to do both at the same time however : (compute and) return a value, while printing some things first. 我想同时做两个:(计算和)返回值,同时先打印一些东西。 I'm sure this is pretty basic (not even sure how to title my question), but I can't get what I am doing wrong. 我确信这是非常基本的(甚至不确定如何给我的问题加上标题),但是我无法理解我做错了什么。

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

... attempts to apply (println "Single digit" n) , which returns nil , as a function, to "A return value" . ...尝试将返回nil作为函数的(println "Single digit" n)应用于"A return value"

You probably intend 你可能打算

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

Try, where you can, to separate side-effects from pure functional computation. 尽可能尝试将副作用与纯函数计算分开。 Here, for example, 例如,在这里

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

... is pure. ...是纯净的。 You can wrap it in stuff that prints what you like. 您可以将其包装在可以打印您喜欢的内容的东西中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM