2014-09-25 32 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