; powerset
(define (power-set xs)
(if (null? xs) (list (list))
(let ((rest (power-set (cdr xs))))
(append rest (map (lambda (x) (cons (car xs) x)) rest)))))
(display (power-set '(1 2 3))) (newline)
(define (bits n len)
(let loop ((n n) (len len) (bs (list)))
(if (zero? len) bs
(loop (quotient n 2) (- len 1)
(cons (if (odd? n) 1 0) bs)))))
(define (collect n xs)
(let loop ((bs (bits n (length xs))) (xs xs) (zs (list)))
(if (null? bs) zs
(loop (cdr bs) (cdr xs)
(if (zero? (car bs)) zs (cons (car xs) zs))))))
(define (power-set xs)
(do ((n 0 (+ n 1)) (xss (list) (cons (collect n xs) xss)))
((= n (expt 2 (length xs))) xss)))
(display (power-set '(1 2 3))) (newline)
(define (for-power-set op xs)
(let ((len (length xs)))
(do ((n 0 (+ n 1))) ((= n (expt 2 len)))
(op (collect n xs)))))
(for-power-set (lambda (s) (display s) (newline)) '(1 2 3))
OyBwb3dlcnNldAoKKGRlZmluZSAocG93ZXItc2V0IHhzKQogIChpZiAobnVsbD8geHMpIChsaXN0IChsaXN0KSkKICAgIChsZXQgKChyZXN0IChwb3dlci1zZXQgKGNkciB4cykpKSkKICAgICAgKGFwcGVuZCByZXN0IChtYXAgKGxhbWJkYSAoeCkgKGNvbnMgKGNhciB4cykgeCkpIHJlc3QpKSkpKQoKKGRpc3BsYXkgKHBvd2VyLXNldCAnKDEgMiAzKSkpIChuZXdsaW5lKQoKKGRlZmluZSAoYml0cyBuIGxlbikKICAobGV0IGxvb3AgKChuIG4pIChsZW4gbGVuKSAoYnMgKGxpc3QpKSkKICAgIChpZiAoemVybz8gbGVuKSBicwogICAgICAobG9vcCAocXVvdGllbnQgbiAyKSAoLSBsZW4gMSkKICAgICAgICAgICAgKGNvbnMgKGlmIChvZGQ/IG4pIDEgMCkgYnMpKSkpKQoKKGRlZmluZSAoY29sbGVjdCBuIHhzKQogIChsZXQgbG9vcCAoKGJzIChiaXRzIG4gKGxlbmd0aCB4cykpKSAoeHMgeHMpICh6cyAobGlzdCkpKQogICAgKGlmIChudWxsPyBicykgenMKICAgICAgKGxvb3AgKGNkciBicykgKGNkciB4cykKICAgICAgICAoaWYgKHplcm8/IChjYXIgYnMpKSB6cyAoY29ucyAoY2FyIHhzKSB6cykpKSkpKQoKKGRlZmluZSAocG93ZXItc2V0IHhzKQogIChkbyAoKG4gMCAoKyBuIDEpKSAoeHNzIChsaXN0KSAoY29ucyAoY29sbGVjdCBuIHhzKSB4c3MpKSkKICAgICAgKCg9IG4gKGV4cHQgMiAobGVuZ3RoIHhzKSkpIHhzcykpKQoKKGRpc3BsYXkgKHBvd2VyLXNldCAnKDEgMiAzKSkpIChuZXdsaW5lKQoKKGRlZmluZSAoZm9yLXBvd2VyLXNldCBvcCB4cykKICAobGV0ICgobGVuIChsZW5ndGggeHMpKSkKICAgIChkbyAoKG4gMCAoKyBuIDEpKSkgKCg9IG4gKGV4cHQgMiBsZW4pKSkKICAgICAgKG9wIChjb2xsZWN0IG4geHMpKSkpKQoKKGZvci1wb3dlci1zZXQgKGxhbWJkYSAocykgKGRpc3BsYXkgcykgKG5ld2xpbmUpKSAnKDEgMiAzKSk=