2012/02/19

Series でネストしたループはどう書けばいいんだろう

例えば次のようなのを Series ではどう書けばいいんだろう。

(loop for i in '(100 200 300)
nconc (loop for j in '(10 20 30)
nconc (loop for k in '(1 2 3)
collect (+ i j k))))
;;=> (111 112 113 121 122 123 131 132 133 211 212 213 221 222 223 231 232 233 311
;; 312 313 321 322 323 331 332 333)

SERIES::*SERIES-IMPLICIT-MAP*t にしているので、次のように書けるかと思ったがだめだった。

(collect-nconc
(let ((x (scan '(100 200 300))))
(collect-nconc
(let ((y (scan '(10 20 30))))
(collect (+ x y (scan '(1 2 3))))))))

素直に mapping で書けば動く。

(collect-nconc (mapping ((i (scan '(100 20 300))))
(collect-nconc (mapping ((j (scan '(10 20 30))))
(collect (mapping ((k (scan '(1 2 3))))
(+ i j k)))))))

しかし、どうしても implicit map で書きたい。

labels を使ってみた。動いた。可読性は。。。でも implicit map だ。

(labels ((f (x)
(collect-nconc (ff x (scan '(10 20 30)))))
(ff (x y)
(collect (+ x y (scan '(1 2 3))))))
(collect-nconc (f (scan '(100 200 300)))))

次のような感じでネストを指定できたらいいかもしれない。

(collect (+ (scan '(100 200 300))
(#2Lscan '(10 20 30))
(#3Lscan '(1 2 3))))

0 件のコメント: