使用默认值定义可选项

时间:2017-01-06 08:46:56

标签: parameters clojure default optional

我正在尝试使用可选参数定义一个函数,如果没有传入,则每个可选参数也都有一个默认值。 但是我不能让它编译,也无法在网上找到任何可行的东西。

这是我的

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(str“manB->”manB“,mnC->”manC“,optA->”optA“,optB->”optB“,optC->”optC“,optD- >“optD”,optE->“optE)))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用多个arity函数,因此添加默认值为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