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 件のコメント:
コメントを投稿