List Comprehensions in Clojure
This is a basic example of the list comprehension support in Clojure, the same feature supported by Erlang, Haskell and Common Lisp (via a libraries like incf-cl).
;; generate the positions of a chess board:
(for [file "ABCDEFGH"
rank (range 1 9)]
(format "%c%d" file rank))
;; Evaluate and put the result into the buffer: C-u 8 C-x C-e
;; ("A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8"
;; "B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8"
;; "C1" "C2" "C3" "C4" "C5" "C6" "C7" "C8"
;; "D1" "D2" "D3" "D4" "D5" "D6" "D7" "D8"
;; "E1" "E2" "E3" "E4" "E5" "E6" "E7" "E8"
;; "F1" "F2" "F3" "F4" "F5" "F6" "F7" "F8"
;; "G1" "G2" "G3" "G4" "G5" "G6" "G7" "G8"
;; "H1" "H2" "H3" "H4" "H5" "H6" "H7" "H8")
(count (for [file "ABCDEFGH"
rank (range 1 9)]
(format "%c%d" file rank)))
;; Make sure it 8x8 (64)
;; the pythagorean triples example:
(for [aa (range 1 10)
bb (range 1 10)
cc (range 1 10)
:when (= (* cc cc)
(+ (* aa aa)
(* bb bb)))]
(list aa bb cc))
;; ((3 4 5) (4 3 5))
;; all permutations
(defn all-permutations [things]
(if (= 1 (count things))
(list things)
(for [head things
tail (all-permutations (disj (set things) head))]
(do
(cons head tail)))))
(all-permutations '(a b c))
;; ((a c b) (a b c) (b a c) (b c a) (c a b) (c b a))