Я пришел с этим:
(defn string-> integer [str & [base]] (Целое число / parseInt str (if (nil? Base) 10 base))) (строка-> целое число "10") (строка-> целое число "FF" 16)
Но это должен быть лучший способ сделать это.
Я пришел с этим:
(defn string-> integer [str & [base]] (Целое число / parseInt str (if (nil? Base) 10 base))) (строка-> целое число "10") (строка-> целое число "FF" 16)
Но это должен быть лучший способ сделать это.
Функция может иметь несколько подписей, если подписи различаются по арности. Вы можете использовать это для предоставления значений по умолчанию.
(defn string->integer
([s] (string->integer s 10))
([s base] (Integer/parseInt s base)))
Обратите внимание, что оба предположения false
и nil
считаются не значениями, (if (nil? base) 10 base)
их можно сократить до (if base base 10)
или далее до (or base 10)
.
(recur s 10)
, используяrecur
вместо повторения имя функцииstring->integer
. Это упростило бы переименование функции в будущем. Кто-нибудь знает причину не использоватьrecur
в таких ситуациях?recur
работает только с той же арностью. если вы пробовали повторять выше, например:java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:
(string->integer s 10)
)?Вы также можете деструктурировать
rest
аргументы как карту, начиная с Clojure 1.2 [ ref ]. Это позволяет вам назвать и указать значения по умолчанию для аргументов функции:Теперь ты можешь позвонить
или
Вы можете увидеть это в действии здесь: https://github.com/Raynes/clavatar/blob/master/src/clavatar/core.clj (например)
источник
Это решение ближе к духу оригинального решения , но немного чище.
Аналогичная картина , которая может быть удобно использование в
or
сочетании сlet
Хотя в этом случае более подробный, он может быть полезен, если вы хотите, чтобы значения по умолчанию зависели от других входных значений . Например, рассмотрим следующую функцию:
Этот подход можно легко расширить для работы с именованными аргументами (как в решении М. Гиллиара):
Или используя еще больше фьюжн:
источник
or
or
отличается от:or
такor
как не знает разницы междуnil
иfalse
.Вы можете рассмотреть еще один подход: частичные функции. Возможно, это более «функциональный» и более гибкий способ указания значений по умолчанию для функций.
Начните с создания (при необходимости) функции, которая имеет параметр (ы), который вы хотите предоставить по умолчанию в качестве ведущего параметра (ов):
Это сделано потому, что версия Clojure
partial
позволяет вам указывать значения «по умолчанию» только в том порядке, в котором они появляются в определении функции. После того, как параметры будут упорядочены по желанию, вы можете создать версию функции по умолчанию, используяpartial
функцию:Чтобы сделать эту функцию вызываемой несколько раз, вы можете поместить ее в var, используя
def
:Вы также можете создать «локальное значение по умолчанию», используя
let
:Подход с частичной функцией имеет одно ключевое преимущество перед другими: потребитель функции все еще может решить, какое будет значение по умолчанию, а не производитель функции, без необходимости изменять определение функции . Это проиллюстрировано в примере, в
hex
котором я решил, что функция по умолчаниюdecimal
- это не то, что мне нужно.Еще одно преимущество этого подхода заключается в том, что вы можете присвоить функции по умолчанию другое имя (десятичное, шестнадцатеричное и т. Д.), Которое может быть более наглядным и / или иметь другую область действия (var, local). При желании частичную функцию также можно смешать с некоторыми из вышеперечисленных подходов:
(Обратите внимание, что это немного отличается от ответа Брайана, поскольку порядок параметров был изменен на обратный по причинам, указанным в верхней части этого ответа)
источник
Вы также можете посмотреть
(fnil)
https://clojuredocs.org/clojure.core/fnilисточник