递归可变参数clojure函数(在调用函数时取消装箱/解构列表)

时间:2018-03-30 15:32:26

标签: clojure variadic-functions destructuring

只是尝试编写一个递归的可变参数函数,它打印列表的元素,每个调用一个。第一次尝试:

(defn f1 [head & tail]

  (when-not (nil? head)
        (println head )
        (f1 tail) ;; how to unbox/destructure tail ????
  ) ;; when

) ;; defn

(f1 "one" "two" "three" "four")

但是得到: - (

one 
(two three four)

然后,在一个非常优雅的#34;方式:

(defn f2Aux [all]
    (when-not (empty? all)
      (println (first all) )
      (f2Aux (rest all))
    )
) ; defn


(defn f2 [head & tail]
    (f2Aux (list* head tail))

) ;; defn

(f2 "one" "two" "three" "four")

非常确定有更好的方法。

由于

修改即可。仍在寻找不同的东西:

(defn f3 

  ;; if we get a list
  ([all]
    (when-not (empty? all)
      (println (first all) )
      (f3 (rest all))
    ) ; when
  )

  ;; if we get several args
  ([head & tail]
    (f3 (list* head tail)) ;; pack the args and call us again
  )
) ;; defn

1 个答案:

答案 0 :(得分:1)

由于tail被解构为一个序列,并且您的函数是可变参数,因此您需要apply tail到您的函数,以便它在{{1}中的每个项目中接收一个参数}:

tail