使用CLTL2附录A系列库,我想要一个嵌套系列中的平面系列。例如:
(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) ) )我想把这个系列变成一个系列,如下:
=> #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上显示的产生宏。CLTL2中的原语部分不适用于我,因为它似乎也不平坦嵌套循环。我不能在嵌套的情况下使用下一个宏。
发布于 2013-07-24 05:53:02
(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))https://stackoverflow.com/questions/17825760
复制相似问题