このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1367772345/105
#  103じゃないけど、yieldを使ってジェネレータが書ける 
こんな感じで 
#  
#  def product(xss): 
#      if xss: 
#          for x in xss[0]: 
#              for y in product(xss[1:]): 
#                  yield x + y 
#      else: 
#          yield '' 
#  
#  print(','.join(product(['abc', 'xy', '12']))) #=> ax1,ax2,ay1,ay2,bx1,bx2,by1,by2,cx1,cx2,cy1,cy2 
#  
#  106 :デフォルトの名無しさん :sage :2013/05/07(火) 07:27:40.99
#  普通の3重ループじゃ駄目なの? 
#  
#  107 :デフォルトの名無しさん :sage :2013/05/07(火) 07:30:37.41
#  
#  
#  >>106 
#  ループ数は引数のリストの長さで決まるから、 
#  再帰を使った方が書きやすいよ 
#  
#  108 :デフォルトの名無しさん :sage :2013/05/07(火) 07:58:37.14
#  >>106 
#  n重ループ 
#  
#  109 :デフォルトの名無しさん :sage :2013/05/07(火) 08:27:20.88
#  やっぱpythonのjoinはちょっと気持ち悪いな 
#  List.joinでいいじゃんと思ってしまう 
#  設計思想的にこうなんだろうけど 
#  
#  110 :デフォルトの名無しさん :sage :2013/05/07(火) 08:54:06.01
#  List.joinでは手続き的すぎて古臭いって思想か 
#  ジェネレータもそれかな 
#  ただの軽量スレッドでは面白くないからジェネレータなのだ 
#  
#  111 :デフォルトの名無しさん :sage :2013/05/07(火) 10:25:49.03
#  ジェネレータで書けるものを再帰で再現するとスタックの無駄遣いで 
#  再帰の方が非効率だと思う 
#  
#  
#  yield from 使ってみたくて使ったけど不要だった 
#  
#  def product(xss): 
#      return (x + y for x in xss[0] for y in product(xss[1:])) if xss else [''] 
% Prologでジェネレータ書いてみる。やはり再帰でしか書けない。 

'def product(xss): 
    if xss: 
        for x in xss[0]: 
            for y in product(xss[1:]): 
                yield x + y 
    else: 
        yield '''' '(_文字列ならび,_生成文字列) :-
        'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列).


'def product(xss): 
    return (x + y for x in xss[0] for y in product(xss[1:])) if xss else ['''']'(_文字列ならび,_生成文字列) :-
        'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列).


'Prologでジェネレータ書いてみる'([_文字列],_一文字) :- 
        sub_atom(_文字列,_,1,_,_一文字). 
'Prologでジェネレータ書いてみる'([_文字列|R1],_生成文字列) :- 
        sub_atom(_文字列,_,1,_,_一文字), 
        'Prologでジェネレータ書いてみる'(R1,_生成文字列_2), 
        atom_concat(_一文字,_生成文字列_2,_生成文字列). 


%  
%  'def product(xss): 
%      if xss: 
%          for x in xss[0]: 
%              for y in product(xss[1:]): 
%                  yield x + y 
%      else: 
%          yield '''' '([abc,xy,'12'],X).
%  
%  X = ax1; 
%  X = ax2; 
%  X = ay1; 
%  X = ay2; 
%  X = bx1; 
%  X = bx2; 
%  X = by1; 
%  X = by2; 
%  X = cx1; 
%  X = cx2; 
%  X = cy1; 
%  X = cy2; 
%  no
%  
%  ?- 'Prologでジェネレータ書いてみる'([abc,xy,'12'],X). 
%  
%  X = ax1; 
%  X = ax2; 
%  X = ay1; 
%  X = ay2; 
%  X = bx1; 
%  X = bx2; 
%  X = by1; 
%  X = by2; 
%  X = cx1; 
%  X = cx2; 
%  X = cy1; 
%  X = cy2; 
%  no
%  
%  ?-