PMX crossover implementation in Clojure
looks great!

(filter #(not (nil? %1)) ...)


Prefer % instead of %1 for single arguments

Simpler to write as (remove nil? ...)

(map #(cond
       (= %1 i1) i2
       (= %1 i2) i1
       :else %1) input))


When you have map + function definition in one statement, consider creating a named function with a defn, or using a for expression:

(for [i input]
  (cond ...))


Never ever def inside a loop:

(do
  (def i (first to-swap))


def creates a global var http://clojure.org/vars

You want:

(let [i (first to-swap)]
  ...)


Consider using destructuring:

(loop [[i &amp; more] i3
  ...
 (if i
   (recur more (swap o1 i) (swap o2 i))
   [o1 o2]))