文件说:'做'特殊形式做什么?
(做exprs *)
评估表达的顺序,并返回的最后的值。如果没有提供表达式,则返回nil。
不过,我只是这样做:
(defn blah []
(print "how")
(print "now")
(print "brown")
(print "cow")
(+ 1 1))
在由此产生:
hownowbrowncow2
那么,为什么这事再次需要?
文件说:'做'特殊形式做什么?
(做exprs *)
评估表达的顺序,并返回的最后的值。如果没有提供表达式,则返回nil。
不过,我只是这样做:
(defn blah []
(print "how")
(print "now")
(print "brown")
(print "cow")
(+ 1 1))
在由此产生:
hownowbrowncow2
那么,为什么这事再次需要?
您可以像if
这样的形式使用它,它只将单个s-exp作为“then”或“else”。
(if (= a b)
(do (println "Yes") (something))
(do (println "No") (something-else)))
一般来说,do
是一种特殊形式,允许一个为了副作用执行几种形式,大概是因为do
形式返回其最后形式的评估结果,所以没有理由使用它具有纯粹的功能。简而言之,您可以将do
视为非纯代码的某种包装。在每个Lisp中都有类似的形式,例如在Common Lisp中,它被称为progn
。
do
隐含地用于诸如以下的宏:defn
,when
,when-not
和其他。
从实际的角度来看,你可以用if
报表(见Tomo's answer)使用它,当你写有“体”的参数(如在defn
函数体)宏就派上用场了。
任何想法为什么'做'是作为特殊形式而不是宏来实现的?正如我所看到的,实现这样一个宏很容易...... – neoascetic 2016-08-03 22:36:05
我想补充说,在'defn'(或'when')中有一个隐式'do'。 – Thumbnail 2014-09-25 10:38:10