首先,如果您想处理一般序列,我认为您需要将 rev-seq 转换为使用first
/rest
而不是peek
/ pop
- 至少在 Clojure 1.4 中peek
/pop
似乎需要 PersistentStack:
(defn rev-seq
[s1]
(concat (rest s1) (list (first s1))))
那么您可能应该注意到,重复应用此函数将“循环”列表而不是反转它。如果您使用以下方法查看少量应用程序的结果,您会看到iterate
:
(def s '(1 2 3 4 5 6 7 8 9))
(nth (iterate rev-seq s) 3)
=> (4 5 6 7 8 9 1 2 3)
一个可行的选择是使用递归函数进行反转:
(defn reverse-seq [s]
(concat (reverse (next s)) (list (first s))))
(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)
或者,您可以使用 clojure.core 中的技术进行反向操作:
(defn reverse-seq [s]
(reduce conj () s))
(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)
希望这能给你一些想法!