diff --git a/README.md b/README.md index fe7c320..2aec8af 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ smart people at [Hashrocket](http://hashrocket.com/). - [Specify the Directory of a Shell Command](clojure/specify-the-directory-of-a-shell-command.md) - [Splitting On Whitespace](clojure/splitting-on-whitespace.md) +- [Swap Two Items in a Vector](clojure/swap-two-items-in-a-vector.md) - [Type of Anything](clojure/type-of-anything.md) ### git diff --git a/clojure/swap-two-items-in-a-vector.md b/clojure/swap-two-items-in-a-vector.md new file mode 100644 index 0000000..7867e4e --- /dev/null +++ b/clojure/swap-two-items-in-a-vector.md @@ -0,0 +1,31 @@ +# Swap Two Items in a Vector + +If you want to replace the value at an index in a vector, you can use the +`assoc` function supplied by `clojure.core` like so: + +```clojure +> (assoc [5 6 7 8] 1 9) +; [5 9 7 8] +``` + +Likewise, if you want to replace two items in a vector, you can extend the +above like so: + +```clojure +> (assoc [5 6 7 8] 1 2 2 4) +; [5 2 4 8] +``` + +We can take advantage of that second example to construct a function that +will swap two values: + +```clojure +(defn swap + [items i j] + (assoc items i (items j) j (items i))) +``` + +This function will break on values of `i` and `j` that are out of the bounds +of `items`, but dealing with that is left as an exercise to the reader. + +[source](http://stackoverflow.com/questions/5979538/what-is-the-idiomatic-way-to-swap-two-elements-in-a-vector)