SICP独習会 並びの演算2 (問題2.36〜)
問題2.36
さっぱりわからず、解答を見ることに。
define(accumulater-n op init seqs) (if (null? (car seqs)) '() (cons (accumulater op init (map car seqs)) (accumulater-n op init (map cdr seqs)))))
gosh> (accumulater-n + 0 (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12))) CALL accumulater-n #[proc] 0 ((1 ...) (4 ...) (7 8 ...) (10 11 12)) CALL map #[proc] ((1 2 ...) (4 5 ...) (7 8 9) (10 11 12)) RETN map (1 4 7 10) CALL accumulater #[proc] 0 (1 4 7 10) CALL accumulater #[proc] 0 (4 7 10) CALL accumulater #[proc] 0 (7 10) CALL accumulater #[proc] 0 (10) CALL accumulater #[proc] 0 () RETN accumulater 0 RETN accumulater 10 RETN accumulater 17 RETN accumulater 21 RETN accumulater 22 CALL map #[proc] ((1 2 ...) (4 5 ...) (7 8 9) (10 11 12)) RETN map ((2 3) (5 6) (8 9) (11 12)) CALL accumulater-n #[proc] 0 ((2 ...) (5 ...) (8 9) (11 12)) CALL map #[proc] ((2 3) (5 6) (8 9) (11 12)) RETN map (2 5 8 11) CALL accumulater #[proc] 0 (2 5 8 11) CALL accumulater #[proc] 0 (5 8 11) CALL accumulater #[proc] 0 (8 11) CALL accumulater #[proc] 0 (11) CALL accumulater #[proc] 0 () RETN accumulater 0 RETN accumulater 11 RETN accumulater 19 RETN accumulater 24 RETN accumulater 26 CALL map #[proc] ((2 3) (5 6) (8 9) (11 12)) RETN map ((3) (6) (9) (12)) CALL accumulater-n #[proc] 0 ((3) (6) (9) (12)) CALL map #[proc] ((3) (6) (9) (12)) RETN map (3 6 9 12) CALL accumulater #[proc] 0 (3 6 9 12) CALL accumulater #[proc] 0 (6 9 12) CALL accumulater #[proc] 0 (9 12) CALL accumulater #[proc] 0 (12) CALL accumulater #[proc] 0 () RETN accumulater 0 RETN accumulater 12 RETN accumulater 21 RETN accumulater 27 RETN accumulater 30 CALL map #[proc] ((3) (6) (9) (12)) RETN map (() () () ()) CALL accumulater-n #[proc] 0 (() () () ()) RETN accumulater-n () RETN accumulater-n (30) RETN accumulater-n (26 30) RETN accumulater-n (22 26 30) (22 26 30) gosh> (map * (list 1 2 3) (list 4 5 6)) CALL map #[proc] (1 2 3) (4 5 6) RETN map (4 10 18) (4 10 18)
これはすごいなあ。「map car seq」で第一要素だけ取りだすことができるのか。これはmapが「必ず要素に作用させてリストを返す」という性質をうまく使った例だと思う。