Когда использовать let против if-let в Clojure - PullRequest
35 голосов
/ 06 января 2010

Когда использование if-let вместо let делает код лучше и влияет на производительность?

Ответы [ 2 ]

72 голосов
/ 06 января 2010

Я думаю, if-let следует использовать, если вы хотите сослаться на значение условия if в части кода "then":

т.е. вместо

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

Вы пишете:

(if-let [result :foo]
  (do-something-with result)
  (do-something-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)))

Это также показывает, что на привязку нельзя ссылаться в части кода "else".

33 голосов
/ 13 января 2010

Хорошим вариантом использования if-let является устранение необходимости использования анафоры. Например, язык программирования Arc предоставляет макрос под названием aif, который позволяет связывать специальную переменную с именем it в теле формы if, когда данное выражение оценивается как логическое истина. Мы можем создать то же самое в Clojure:

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

(aif 42 (println it))
; 42

Это хорошо и хорошо, за исключением того, что анафора не гнездится, но 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...