Допустим, у меня есть следующие функции для получения числовых значений из байтового буфера:Идиоматические способ вернуть значение, не последнее выражение в последовательности выражений в Clojure
(defn get-from-bytebuffer
([^ByteBuffer buffer width endianness]
(let [buffer-endianness (.order buffer)]
(.order buffer endianness)
(cond
(= width 1) (.get buffer)
(= width 2) (.getShort buffer)
(= width 4) (.getInt buffer)
(= width 8) (.getLong buffer))
(.order buffer buffer-endianness))))
Пользователь может указать число читаемых чисел. Чтобы свести к минимуму побочные эффекты, функция сначала получает текущий порядок байтов буфера, устанавливает его в тот, который указан пользователем, а затем восстанавливает старую сущность. Проблема заключается в том, что значение последнего выражения в теле let
является значением выражения let
, но мне нужно значение cond
. В общем, у меня есть некоторый код пролога/эпилога вокруг выражения, но я хочу, чтобы результат выражения возвращался (будь то значение прилагаемого выражения.)
Легкое обходное решение, которое я придумал, просто связывает значение из cond
в другом выражении, пусть, то есть, что в качестве последнего выражения, как так:
(defn get-from-bytebuffer-fix
([^ByteBuffer buffer width endianness]
(let [buffer-endianness (.order buffer)]
(.order buffer endianness)
(let [result (cond
(= width 1) (.get buffer)
(= width 2) (.getShort buffer)
(= width 4) (.getInt buffer)
(= width 8) (.getLong buffer))]
(.order buffer buffer-endianness)
result))))
Но это чувствует запутано. Имеет ли Clojure идиоматический/«правильный» способ окружающего выражения с некоторым кодом пролога/эпилога, а затем возвращает значение этого выражения?
Смотрите также [это] (http://stackoverflow.com/questions/17235657/clojure-functions-returning- value-computed-before-the-last-statement) и [this] (http://stackoverflow.com/questions/7491360/how-do-you-return-from-a-function-early-in-clojure) previous вопросов. –