1

CLTL2 付録 A の SERIES ライブラリを使用して、ネストされたシリーズからフラット シリーズが必要です。例えば:

(map-fn t (lambda (x)
            (map-fn t (lambda (y)
                        (cons x y))
                    (scan '(1 2 3))))
        (scan '(4 5 6)))

=> #Z( #Z( (4 . 1) (4 . 2) (4 . 3) )
       #Z( (5 . 1) (5 . 2) (5 . 3) )
       #Z( (6 . 1) (6 . 2) (6 . 3) ) )

以下のように、このシリーズのシリーズを1つのシリーズにしたいと思います。

=> #Z( (4 . 1) (4 . 2) (4 . 3)
       (5 . 1) (5 . 2) (5 . 3)
       (6 . 1) (6 . 2) (6 . 3) )

適切なシリーズ連結機能があればいいのですが。シリーズ ライブラリには CATENATE 関数がありますが、&rest パラメーターにはいくつかのシリーズしかありません。私はできた

(apply #'catenate list-of-series)

ただし、シリーズのシリーズではなく、シリーズのリストを受け入れます。残念ながら、シリーズを折りたたむための機能はありませんが、マッピングとフィルタリングには機能があります。A.4 に示されている PRODUCING マクロ。CLTL2 のプリミティブ セクションは、ネストされたループを平坦化しないように見えるため、機能しません。ネストされた状況で NEXT-OUT マクロを使用できません。

4

1 に答える 1

3
(apply #'catenate
       (collect (map-fn t (lambda (x)
                            (map-fn t (lambda (y)
                                        (cons x y))
                                    (scan '(1 2 3))))
                        (scan '(4 5 6)))))

しかし、それはちょっとしたごまかしです。シリーズで適切に行うには:

(producing (prod) ((zz (generator (map-fn t (lambda (x)
                                              (map-fn t (lambda (y)
                                                          (cons x y))
                                                      (scan '(1 2 3))))
                                          (scan '(4 5 6)))))
                   cur)
           (loop
              (tagbody
               redo
                 (if (null cur)
                     (setq cur (generator (next-in zz (terminate-producing)))))
                 (next-out prod (next-in cur (progn 
                                               (setq cur nil)
                                               (go redo)))))))

=> #Z((4 . 1) (4 . 2) (4 . 3)
      (5 . 1) (5 . 2) (5 . 3)
      (6 . 1) (6 . 2) (6 . 3))
于 2013-07-24T05:53:02.030 に答える