Существует другой подход вы, возможно, захотите рассмотреть следующие вопросы: partial функции. Это, возможно, более «функциональный» и более гибкий способ указания значений по умолчанию для функций.
Начните с создания (при необходимости) функцию, которая имеет параметр (ы), которые вы хотите предоставить по умолчанию (ы) в качестве ведущего параметра (ов):
(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))
(Обратите внимание, это немного отличается от ответа Брайана, как порядок параметров был отменен по причинам, указанным в верхней части этого ответ)
Я думаю, что было бы лучше для второй линии, чтобы сказать '(RECUR s 10)', используя [ 'recur'] (HTTP: //grimoire.arrdem .com/1.6.0/clojure.core/recur /) вместо повторения имени функции 'string-> integer'. Это облегчит переименование функции в будущем. Кто-нибудь знает какую-либо причину не использовать 'recur' в этих ситуациях? –
Похоже, что 'recur' работает только с той же аркой. если вы попытались повторить выше, например: 'java.lang.IllegalArgumentException: Неисправный аргумент count для возврата, ожидаемый: 1 args, got: 2, компиляция:' – djhaskin987
Иди в эту же проблему. Было бы разумно иметь сам вызов функции (т. Е. '(String-> integer s 10)')? –