如何在clojure中深层嵌套的向量中交换所有元素对?

Lov*_*ing 3 clojure clojurescript

说我有类似的东西

[[[[1 2] [3 4] [5 6]]] [[[7 8] [9 10]]] [[[2 4]]]]
Run Code Online (Sandbox Code Playgroud)

我想交换最内层的对来做它

[[[[2 1] [4 3] [6 5]]] [[[8 7] [10 9]]] [[[4 2]]]]
Run Code Online (Sandbox Code Playgroud)

假设在得到数据之前我不知道深度,并且所有对都处于相同的深度级别.

实现这一目标的惯用方法是什么?

Ole*_*Cat 5

clojure.walk 会做的工作:

(require '[clojure.walk :as walk])

(defn pair? [s]
  (and (vector? s)
       (every? (complement vector?) s)
       (= (count s) 2)))

(defn swap-pairs [s]
  (walk/prewalk #(if (pair? %)
                   (vec (reverse %))
                   %)
                s))
Run Code Online (Sandbox Code Playgroud)

您可能会提出pair?更适合您的域名的不同谓词.