문서는 말한다 :'do'특수 형식은 무엇을합니까?
이
(exprs *을) 위해 표현식을 평가하고 마지막의 값을 반환합니다. 표현식이 제공되지 않으면 nil을 리턴합니다.(defn blah [] (print "how") (print "now") (print "brown") (print "cow") (+ 1 1))
이 결과 :
가 왜이 일을 다시 필요hownowbrowncow2
하지만, 난 그냥 이런 짓을?
문서는 말한다 :'do'특수 형식은 무엇을합니까?
이
(exprs *을) 위해 표현식을 평가하고 마지막의 값을 반환합니다. 표현식이 제공되지 않으면 nil을 리턴합니다.(defn blah [] (print "how") (print "now") (print "brown") (print "cow") (+ 1 1))
이 결과 :
가 왜이 일을 다시 필요hownowbrowncow2
하지만, 난 그냥 이런 짓을?
if
과 같은 형식으로 사용하면 하나의 s-exp가 "then"또는 "else"로만 사용됩니다. do
형태로 반환 마지막 형태의 평가 결과 때문에 사용할 필요는 없다 있도록
(if (= a b)
(do (println "Yes") (something))
(do (println "No") (something-else)))
일반적으로, do
하나가 부작용에 대한 아마도 위해 여러 가지 형태를 실행할 수있는 특별한 형태는,이다 그것은 순수한 기능을 가지고 있습니다. 간단히 말해, do
을 비 순수 코드의 래퍼 (wrapper)와 같이 생각할 수 있습니다. 모든 Lisp에는이 형식의 유사어가 있습니다. 예를 들어 Common Lisp에서는 progn
이라고합니다. defn
, when
, when-not
, 그리고 다른 사람 :
do
보기의 실용적인 관점에서, 당신은 if
문 (Tomo's answer 참조)와 함께 사용할 수 있으며, 당신이 (defn
에서 함수의 몸처럼) '몸'인수를 매크로를 쓸 때 유용합니다.
'do'가 매크로가 아닌 특별한 형태로 구현 된 이유는 무엇입니까? 볼 수 있듯이, 그러한 매크로를 구현하는 것은 꽤 쉽습니다 ... – neoascetic
'defn' (또는'when')에 암시적인'do'가 추가되었습니다. – Thumbnail