закрывающие функции, позволяют & возвращают значения - PullRequest
4 голосов
/ 25 марта 2011

Неразумно возвращать границу с помощью let?

(let [pipeline (Channels/pipeline)]
  (.addLast pipeline "codec" (HttpClientCodec.))
  ;; several more lines like this
  pipeline)

Является ли связывание здесь только лексической областью (в отличие от def) и небезопасно обойти?

Обновление При написании этого вопроса я понял, что вышеизложенное было ужасно. И если что-то уродливое в Clojure, вы, вероятно, делаете это неправильно.

Я думаю, что это, вероятно, более идиоматический способ решения вышесказанного (что делает вопрос спорным, кстати, но все же полезное знание).

(doto (Channels/pipeline)
  (.addLast "codec" (HttpClientCodec.))) 

1 Ответ

8 голосов
/ 25 марта 2011

let является чисто лексической областью и не создает переменную. Локальные объекты, созданные let (или loop), ведут себя точно так же, как аргументы функции. Так что да, безопасно использовать столько локальных элементов, определенных let / loop, сколько вам нужно, закрывать их и т. Д. Возвращение локального из функции просто возвращает ее значение, а не внутреннее представление (которое на самом деле находится на стек, если не закрыт). let / loop привязки, следовательно, также являются входными / поточно-ориентированными.

Кстати, для вашего конкретного примера кода с большим количеством java-вызовов вы можете рассмотреть возможность использования doto вместо или дополнительно. http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/doto

...