2014-09-25 7 views
2

문서는 말한다 :'do'특수 형식은 무엇을합니까?


(exprs *을) 위해 표현식을 평가하고 마지막의 값을 반환합니다. 표현식이 제공되지 않으면 nil을 리턴합니다.

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

이 결과 :

hownowbrowncow2

가 왜이 일을 다시 필요

하지만, 난 그냥 이런 짓을?

답변

2

if과 같은 형식으로 사용하면 하나의 s-exp가 "then"또는 "else"로만 사용됩니다. do 형태로 반환 마지막 형태의 평가 결과 때문에 사용할 필요는 없다 있도록

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

'defn' (또는'when')에 암시적인'do'가 추가되었습니다. – Thumbnail

3

일반적으로, do 하나가 부작용에 대한 아마도 위해 여러 가지 형태를 실행할 수있는 특별한 형태는,이다 그것은 순수한 기능을 가지고 있습니다. 간단히 말해, do을 비 순수 코드의 래퍼 (wrapper)와 같이 생각할 수 있습니다. 모든 Lisp에는이 형식의 유사어가 있습니다. 예를 들어 Common Lisp에서는 progn이라고합니다. defn, when, when-not, 그리고 다른 사람 :

do

암시과 같은 매크로에 사용됩니다.

보기의 실용적인 관점에서, 당신은 if 문 (Tomo's answer 참조)와 함께 사용할 수 있으며, 당신이 (defn에서 함수의 몸처럼) '몸'인수를 매크로를 쓸 때 유용합니다.

+0

'do'가 매크로가 아닌 특별한 형태로 구현 된 이유는 무엇입니까? 볼 수 있듯이, 그러한 매크로를 구현하는 것은 꽤 쉽습니다 ... – neoascetic