first
まず、一般的なシーケンスで作業したい場合は、 /rest
ではなくpeek
/を使用するようにrev-seqを変換する必要があると思います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)
これがあなたにいくつかのアイデアを与えることを願っています!