2017-01-06 4 views
0

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

вот что у меня есть

defn test-optional-default-params [manA manB manC & [optA optB optC optD optE] 
            :or {[optA optAdef 
             optB optBdef 
             optC optCdef 
             optD optDdef 
             optE optEdef]}] 

(PRN (ул "manB->" manB "mnC->" Manc "optA->" ОРТА "optB->" optB», optC -> "optC", optD-> "optD", optE->»опт)))

ответ

2

вы можете использовать

(defn f [a b & {:keys [c d e] :or {c defaultc d defaultd e defaulte}}] 
    blabla) 

Но вы должны сделать

(f 1 2 :c 3 :d 4 :e 5) 

Таким образом, вы можете, возможно, сделать что-то вроде этого (я попытался с помощью основной функции: сложение):

(defn add-rest* [c d e] 
    (+ c d e)) 

(def add-rest* 
    (fnil add-rest* 0 0 0)) 

(defn add 
    [a b & [c d e]] 
    (+ a b (add-rest c d e))) 

(add 1 1) ;; 2 
(add 1 1 1) ;; 3 
(add 1 1 1 1) ;; 4 
+0

это * означает, опциональный все PARAMS? – f1wade

+0

Я думаю, что предпочитаю первый вариант 'f ab {: c c etc}' – f1wade

+0

Нет, это просто «случайное» имя –

1

Вы можете использовать несколько Арность функций, так например, с добавлением со значениями 0 по умолчанию становится:

(defn f+ 
    ([a b]  (f+ a b 0 0 0)) 
    ([a b c]  (f+ a b c 0 0)) 
    ([a b c d] (f+ a b c d 0)) 
    ([a b c d e] (+ a b c d e))) 

Заменить + выше желаемой функцией пяти переменных. Использование вышеперечисленного становится:

(f+ 1 2)   ;; 3 
(f+ 1 2 3)  ;; 6 
(f+ 1 2 3 4)  ;; 10 
(f+ 1 2 3 4 5) ;; 15 

Note: also discussed previously with additional options

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