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))