Существует другой подход, который вы можете рассмотреть: частичные функции. Возможно, это более «функциональный» и более гибкий способ задания значений по умолчанию для функций.
Начните с создания (при необходимости) функции, в которой есть параметры, которые вы хотите указать по умолчанию в качестве ведущего (ых) параметра (ов):
(defn string->integer [base str]
(Integer/parseInt str base))
Это сделано потому, что версия Clojure partial
позволяет указывать значения по умолчанию только в том порядке, в котором они указаны в определении функции. После того, как параметры упорядочены по желанию, вы можете создать версию функции по умолчанию, используя функцию partial
:
(partial string->integer 10)
Чтобы сделать эту функцию вызываемой несколько раз, вы можете поместить ее в переменную, используя def
:
(def decimal (partial string->integer 10))
(decimal "10")
;10
Вы также можете создать «локальное значение по умолчанию», используя let
:
(let [hex (partial string->integer 16)]
(* (hex "FF") (hex "AA")))
;43350
Подход частичной функции имеет одно ключевое преимущество перед остальными: потребитель функции все еще может решить, каким будет значение по умолчанию, а не производитель функции без необходимости изменять определение функции . Это показано в примере с hex
, где я решил, что функция по умолчанию decimal
- это не то, что я хочу.
Еще одним преимуществом этого подхода является то, что вы можете назначить функции по умолчанию другое имя (десятичное, шестнадцатеричное и т. Д.), Которое может быть более информативным и / или другим объемом (var, local). При желании частичная функция также может быть смешана с некоторыми из подходов, описанных выше:
(defn string->integer
([s] (string->integer s 10))
([base s] (Integer/parseInt s base)))
(def hex (partial string->integer 16))
(обратите внимание, что это немного отличается от ответа Брайана, поскольку порядок параметров был изменен по причинам, указанным в верхней части этого ответа)