Подтвердить что ты не робот

В clojure как выбрать значение, если nil

В Clojure что такое идиоматический способ тестирования для nil и если что-то nil, то заменить значение?

Например, я делаю это много:

 let [ val    (if input-argument input-argument "use default argument")]

: но я нахожу, что повторяю необходимость дважды использовать "вход-аргумент".

4b9b3361

Ответ 1

Предложение Alex "или" действительно является идиоматическим способом переписать ваш примерный код, но обратите внимание, что он не только заменит значения nil, но и те, которые являются false.

Если вы хотите сохранить значение false, но отбросить nil, вам нужно:

(let [val (if (nil? input-argument) "use default argument" input-argument)]
   ...)

Ответ 2

просто используйте или:

(or input-argument "default")

Ответ 3

Если вы привязываете только переменную, чтобы получить правильное значение, а не использовать его дважды, вы можете это сделать другим способом. В ядре называется функция fnil.

Вы вызываете fnil с помощью функции, которую хотите вызвать, и аргумента по умолчанию. Это вернет функцию, которая заменит nils на значение по умолчанию, которое вы указали.

Вы можете сделать одну из вещей в зависимости от того, что вы хотите. Создайте локальную функцию.

(let [default-fn (fnil fn-you-want-to call "default-argument")]
(default-fn input-argument))

В somecases (где у вас всегда есть один и тот же аргумент по умолчанию) вы можете перейти к логике, чтобы сделать это из своего кода, и поместить его туда, где была исходная функция (или обернуть функцию в случае, если она находится в другой библиотеке).

(defn fn-you-want-to-call [arg] ....)
(def fn-you-want-to-call-default (fnil fn-you-want-to-call "default-argument"))

Затем в вашем коде сводится только к

(fn-you-want-to-call-default input-argument)

Подробнее вы можете найти здесь: http://clojuredocs.org/clojure_core/clojure.core/fnil