0

Я программист на Python, изучающий Clojure. В Python я люблю, как я могу использоваться именованные аргументы в вызове functools.partial:Частичные и именованные аргументы в Clojure

def pow(base, exponent): 
    return base ** exponent 

exp = partial(pow, 2.71828)   # exp(2) --> 7.3886 
square = partial(pow, exponent=2)  # square(2) --> 4 

Реализация exp является, очевидно, эквивалентно в Clojure - но я мог использовать partial определить square лаконично, тоже? Есть ли способ передать в ключевом слове/named аргументы частичным, чтобы определенный аргумент был заранее определен? Или это должно быть обработано не partial, а литералом функции, например. #(pow % 2)?

+1

Короткий ответ: Это не идиоматическое. Предпочтение Clojure для отправки по количеству аргументов связано с тем, что JVM может эффективно реализовать (деструктурирование значительно дороже в сравнении); чем дальше вы получаете от этого, тем больше страдает ваш код. –

ответ

1

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

Для вашей собственной функции вы можете сделать что-то подобное:

(defn my-pow [& {:keys [base exponent]}] 
    (Math/pow base exponent)) 

(def exp (partial my-pow :base 2.71828)) 
(exp :exponent 2) 
(def square (partial my-pow :exponent 2)) 
(square :base 2) 
+0

Спасибо. Но теперь я * должен * использовать ключевое слово в вызове функции, не так ли? '(exp 2)', похоже, не работает. – embee

+0

Вот почему я сказал «нечто похожее»;) – Ankur

Смежные вопросы