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が「必ず要素に作用させてリストを返す」という性質をうまく使った例だと思う。