あなたの問題を完全に理解したかどうかはわかりませんが、突き刺します。
まず、seq を保持する var を宣言します。
(def myseq '(2 3 1 4))
次に、同じシーケンスをまとめて圧縮できますが、開始点が異なります。そうすれば、前の要素に簡単にアクセスできます。これは seq の seq を返すためmapcat
、結果を 1 つのリストに連結するために使用します。
(mapcat
(fn [prev curr]
(if (< prev curr)
[`(~'- ~curr ~prev)]
[curr]))
myseq (drop 1 myseq))
;; evaluates to((- 3 2) 1 (- 4 1))
または、2 番目に提案された出力の後にいる場合:
(mapcat
(fn [prev curr]
(if (< prev curr)
[`(~'- ~curr ~prev)]
[]))
myseq (drop 1 myseq))
;; evaluates to ((- 3 2) (- 4 1))
お役に立てれば。
更新:
わかりました、これにより、必要な出力が得られます。
(mapcat
(fn [prev curr idx]
(cond
(< curr prev) [`(~'- ~prev ~curr)]
(= (+ idx 2) (count myseq)) [curr]
:else [prev]))
myseq (drop 1 myseq) (range (count myseq)))
;; evaluates to (2 (- 3 1) 4)
これがあなたの求めているものであることを願っています。