2014-09-25 77 views
2

文件说:'做'特殊形式做什么?

(做exprs *)
评估表达的顺序,并返回的最后的值。如果没有提供表达式,则返回nil。

不过,我只是这样做:

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

在由此产生:

hownowbrowncow2

那么,为什么这事再次需要?

回答

2

您可以像if这样的形式使用它,它只将单个s-exp作为“then”或“else”。

(if (= a b) 
    (do (println "Yes") (something)) 
    (do (println "No") (something-else))) 
+2

我想补充说,在'defn'(或'when')中有一个隐式'do'。 – Thumbnail 2014-09-25 10:38:10

3

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

do隐含地用于诸如以下的宏:defn,whenwhen-not和其他。

从实际的角度来看,你可以用if报表(见Tomo's answer)使用它,当你写有“体”的参数(如在defn函数体)宏就派上用场了。

+0

任何想法为什么'做'是作为特殊形式而不是宏来实现的?正如我所看到的,实现这样一个宏很容易...... – neoascetic 2016-08-03 22:36:05