Programming Comparisons: Power Set


Problem: give the smallest possible complete subroutine/function/method definition in a language of your choice which, when called with a list, array, whatever, returns the power set of that list. It may be in any order, but must not contain duplicates.
e.g.: p([1, 2, 3]) returns: [[], [1], [2], [3], [2, 3], [1, 2], [1, 3], [1, 2, 3]]

haskell: 46 {- p [1,2,3] -} p=foldr(\h t->t++map(h:)t)[[]]
perl: 53 # p(1, 2, 3) sub p{my$y=pop;$y?map{[$y,@$_],$_}&p:[]}
haskell*: 64 {- p [0..] -} p l=[]:do{(n,x)<-zip[0..]l;map(x:)$take (2^n)$p l}
ruby: 69 # r([1, 2, 3]) def r(l)l==[]?[l]:(a=l.pop;s=r l;s+s.map{|i|[a]+i})end
python: 73 # p([1, 2, 3]) p=lambda l:l and p(l[1:])+[l[:1]+y for y in p(l[1:])]or[l]
ocaml: 77 (* p [1; 2; 3];; *) let rec p=function a::b->p b@List.map((@)[a])(p b)|l->[l]
prolog: 81 % p([1,2,3],X). s([],L).s([A|B],L):-member(A,L),s(B,L).p(L,X):-setof(Z,s(Z,L),X).
lisp: 88 ; (p '(1 2 3)) (defun p(l)(if l(mapcan #'(lambda(x)`(,x(,(car l).,x)))(p(cdr l)))`(,l)))
javascript: 152 // p([1, 2, 3]) function p(l){if(!l.length)return[[]];var a=[];var s=p(l.slice(1));for(var i=0;i<s.length;i++)a.push(s[i],[l[0]].concat(s[i]));return a}
php: 157 # p(array(1, 2, 3)) function p($l){if(!$l)return array($l);$a=array();foreach(p(array_slice($l,1))as$i){$a[]=$i;$a[]=array_merge(array($l[0]),$i);}return$a;}
gnu smalltalk: 163 "(Set from: #(1 2 3)) p" Set extend[p[|a s|^self isEmpty ifTrue:[Set with:self]ifFalse:[a:=self remove:self anyOne. s:=self p. s+(s collect:[:i|i+(Set with:a)])]]]
*: The second haskell entry works for infinite lists!