let
이 아닌 if-let
을 사용하면 코드가 더 좋아 보이며 성능에 어떤 영향을 줍니까?Clojure에서 let-if-let을 사용하는 경우
즉, 대신
(let [result :foo]
(if result
(do-something-with result)
(do-something-else)))
의 당신이 쓰는 :
let
이 아닌 if-let
을 사용하면 코드가 더 좋아 보이며 성능에 어떤 영향을 줍니까?Clojure에서 let-if-let을 사용하는 경우
즉, 대신
(let [result :foo]
(if result
(do-something-with result)
(do-something-else)))
의 당신이 쓰는 :
난 당신이 코드의 "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)))
합니다.
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]
발견 매우 유용합니다. – octopusgrabbus
또한,이 2 개 이상을 할 수 없습니다 if-let의 결합 벡터에 양식. 예 : (if-let [a 20 b nil] (println a)) - 작동하지 않습니다! –
또한'when-let'도 있습니다. –