2010-01-06 2 views

답변

69

난 당신이 코드의 "then"일부에서 if 조건의 값을 참조하고자 할 때 if-let을 사용할 필요가 생각

(if-let [result :foo] 
    (do-something-with result) 
    (do-something-else)) 

좀 더 깔끔한 수준으로 들여 쓰기를 저장합니다. 지금까지 효율이가는대로, 당신은 매크로 확장이 많은 오버 헤드를 추가하지 않는 것을 볼 수있다 : 이것은 또한 코드의 "else"부분에서 언급 할 수없는 바인딩 것을 보여

(clojure.core/let [temp__4804__auto__ :foo] 
    (if temp__4804__auto__ 
    (clojure.core/let [result temp__4804__auto__] 
     (do-something-with result)) 
    (do-something-else))) 

합니다.

+9

또한,이 2 개 이상을 할 수 없습니다 if-let의 결합 벡터에 양식. 예 : (if-let [a 20 b nil] (println a)) - 작동하지 않습니다! –

+1

또한'when-let'도 있습니다. –

30

if-let의 좋은 사용 예는 아나 포라 사용을 제거하는 것입니다. 예를 들어 Arc 프로그래밍 언어는 aif이라는 매크로를 제공합니다.이 매크로를 사용하면 if 폼의 본문에 it이라는 특수 변수를 바인딩 할 수 있습니다. 이때 지정된식이 논리 값 true로 계산됩니다. 우리는 Clojure의에서 같은 일을 만들 수 있습니다

(defmacro aif [expr & body] 
    `(let [~'it ~expr] (if ~'it (do [email protected])))) 

(aif 42 (println it)) 
; 42 

이 그 anaphora 제외하고는 둥지를하지 않습니다,하지만 if-let 않습니다, 벌금과 좋은 :

(aif 42 (aif 38 [it it])) 
;=> [38 38] 

(aif 42 [it (aif 38 it)]) 
;=> [42 38] 

(if-let [x 42] (if-let [y 38] [x y])) 
;=> [42 38] 
+0

발견 매우 유용합니다. – octopusgrabbus