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

Я бы добавил, что существует неявное 'do' в' defn' (или 'when'). – Thumbnail

3

Вообще, do специальная форма, которая позволяет выполнять различные формы в порядке, предположительно за побочные эффекты, потому что do формы возвращает результат оценки своей последней формы, так что нет никаких оснований для использования он с чистыми функциями. Проще говоря, вы можете думать о do как о какой-то оболочке для нечистого кода. Существуют аналоги этой формы в каждом Lisp, например, в Common Lisp это называется progn.

do неявно используется в таких макросов, как: defn, when, when-not и другие.

С практической точки зрения, вы можете использовать его с if заявления (см Tomo's answer) и очень удобно, когда вы пишете макросы, которые имеют аргументы «тело» (как тело функции в defn).

+0

Любая идея, почему 'do' реализуется как специальная форма, а не как макрос? Как я вижу, довольно легко реализовать такой макрос ... – neoascetic

Смежные вопросы