文档说:
(do exprs *)
按顺序计算表达式并返回最后一个的值。如果未提供表达式,则返回nil。
然而,我刚刚这样做了:
(defn blah []
(print "how")
(print "now")
(print "brown")
(print "cow")
(+ 1 1))
导致:
hownowbrowncow2
那么为什么还需要这件事?
答案 0 :(得分:3)
通常,do
是一种特殊形式,允许按顺序执行多个表单,大概是为了副作用,因为do
表单返回其最后一个表单的评估结果,因此有没有理由将它与纯函数一起使用。简而言之,您可以将do
视为非纯代码的某种包装。每个Lisp都有这种形式的类似物,例如在Common Lisp中,它被称为progn
。
do
隐式用于以下宏:defn
,when
,when-not
等。
从实际的角度来看,您可以将它与if
语句一起使用(请参阅Tomo's answer),当您编写具有' body'的宏时,它会派上用场。参数(如defn
中的函数体)。
答案 1 :(得分:2)
您可以在if
这样的表单中使用它,它只需要一个s-exp作为“then”或“else”。
(if (= a b)
(do (println "Yes") (something))
(do (println "No") (something-else)))