'做什么'特殊形式吗?

时间:2014-09-25 10:30:59

标签: clojure special-form

文档说:

  

(do exprs *)
  按顺序计算表达式并返回最后一个的值。如果未提供表达式,则返回nil。

然而,我刚刚这样做了:

(defn blah []
  (print "how")
  (print "now")
  (print "brown")
  (print "cow")
  (+ 1 1))

导致:

  

hownowbrowncow2

那么为什么还需要这件事?

2 个答案:

答案 0 :(得分:3)

通常,do是一种特殊形式,允许按顺序执行多个表单,大概是为了副作用,因为do表单返回其最后一个表单的评估结果,因此有没有理由将它与纯函数一起使用。简而言之,您可以将do视为非纯代码的某种包装。每个Lisp都有这种形式的类似物,例如在Common Lisp中,它被称为progn

do隐式用于以下宏:defnwhenwhen-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)))