Code: Select all
(define (func element items)
  (map (fn (permutation) (cons element permutation)) 
       (permutations (clean 
                     (fn (f) (= element f)) 
                     items))))
(define (permutations items)
    (if (nil? items) 
        nil
        (apply list 
           (map 
           (fn (f) (func f items))
           items
           ))))
(println (permutations '(1 2 3 4)))
;-> (((1 (2 (3)) (2 (4))) (1 (3 (2)) (3 (4))) (1 (4 (2)) (4 (3)))) ((2 
   (1 (3)) 
   (1 (4))) 
  (2 (3 (1)) (3 (4))) 
  (2 (4 (1)) (4 (3)))) 
 ((3 (1 (2)) (1 (4))) (3 (2 (1)) (2 (4))) (3 (4 (1)) (4 (2)))) 
 ((4 (1 (2)) (1 (3))) (4 (2 (1)) (2 (3))) (4 (3 (1)) (3 (2)))))