Clojure 什么是';do';特殊表格怎么办?

Clojure 什么是';do';特殊表格怎么办?,clojure,special-form,Clojure,Special Form,文件说: (不表达*) 按顺序计算表达式并返回最后一个表达式的值。如果未提供表达式,则返回nil 然而,我只是这样做了: (defn blah [] (print "how") (print "now") (print "brown") (print "cow") (+ 1 1)) 因此: hownowbrowncow2 那么,为什么还需要这个东西呢?您可以使用类似于if的形式,它只接受单个s-exp作为“then”或“else” 通常,是一种特殊形式,它允许一个人按顺序执

文件说:

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

然而,我只是这样做了:

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

hownowbrowncow2


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

您可以使用类似于
if
的形式,它只接受单个s-exp作为“then”或“else”

通常,是一种特殊形式,它允许一个人按顺序执行多个形式,可能是为了产生副作用,因为
do
form返回最后一个形式的求值结果,因此没有理由将其用于纯函数。简单地说,您可以将
do
看作非纯代码的某种包装器。在每个Lisp中都有类似的形式,例如在公共Lisp中,它被称为
progn

do
隐式用于以下宏中:、、和其他宏


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

我要补充的是,在
defn
中有一个隐式的
do
(或
when
).你知道为什么
do
是作为特殊形式而不是宏实现的吗?正如我所看到的,实现这样一个宏非常容易。。。
(if (= a b)
    (do (println "Yes") (something))
    (do (println "No") (something-else)))