2

文档说:

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

但是,我只是这样做了:

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

结果是:

hownowbrownow2

那么为什么又需要这个东西呢?

4

2 回答 2

3

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

do在以下宏中隐含使用:defnwhenwhen-not等。

从实际的角度来看,您可以将它与if语句一起使用(请参阅Tomo 的答案),并且当您编写具有“body”参数的宏时(如 中的函数体),它会派上用场defn

于 2014-09-25T11:53:46.527 回答
2

您可以在像这样的形式中使用它if,它只需要一个 s-exp 作为“then”或“else”。

(if (= a b)
    (do (println "Yes") (something))
    (do (println "No") (something-else)))
于 2014-09-25T10:35:05.197 回答