2014-10-17 3 views
2

Я пытаюсь получить необязательный параметр ключевого слова, который зависит от другого необязательного параметра ключевого слова для его значения.Аргумент ключевого слова Clojure по умолчанию в зависимости от другого аргумента ключевого слова?

Пример функции:

(defn printab [& {:keys [a b] :or {:a 5 :b 200}}] 
    (println "a is" a "b is" b)) 

Я хочу значение по умолчанию :b быть значение :a. Есть ли способ сделать это в макросе defn, или мне просто нужно создать привязку let для обработки этого поведения?

Ниже функция не работает так, как я надеялся:

(defn printab [& {:keys [a b] :or {:a 5 :b a}] 
    (println "a is" a "b is" b)) 
+0

Я не думаю, что ваш пример функции делает то, что вы думаете. – soulcheck

+0

@amalloy Почему вы удалили теги «аргументы» «параметры-передачи» «необязательные параметры» и «ключевое слово-аргумент»? Я не понимаю. – user1559027

+0

Теги для помощи людям с соответствующими знаниями находят ваш вопрос. Просто загрузка с кучей тегов не помогает, если никто не следит за этими тегами: вам не нужны «аргументы» (существует такая вещь?), Вам нужен эксперт «clojure». В большинстве вопросов, связанных с языком, не нужны никакие вторичные теги; они в основном полезны, если проблема сосредоточена вокруг какой-либо сторонней библиотеки или чего-то еще. – amalloy

ответ

3

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

(defn printab [& {:keys [a b] :as m :or {a 5 b (:a m 5)}}] 
    (println "a is" a "b is" b)) 
+2

вы можете сократить ': или {a 5 b (или (: a m) 5)}' часть до просто ': или {a 5 b (: a m 5)}' – soulcheck

+0

Совершенно так! Ответ исправлен соответственно - спасибо! – umbriel

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