strange-fold

sicpのaccumulate-nのところで出てきた。

((1 2 3) (4 5 6) (7 8 9) (10 11 12))

こんな感じの並びを簡単に作れたらいいなー

srfi-1の中にこんなのがあった

これがあれば楽に作れるかもしれない

(use-srfi 1)

(define (f lst n)
  (if (null? lst)
      '()
      (cons (take lst n) (f (drop lst n) n))))
(f (iota 10) 2)
;;10:user> => ((0 1) (2 3) (4 5) (6 7) (8 9))

もう少し一般化できそう

(define (strange-fold op init seq n)
  (if (null? seq)
      init
      (op (take seq n)
          (strange-fold op init (drop seq n) n))))

(strange-fold cons '() (iota 12 1) 3)
;;11:user> => ((1 2 3) (4 5 6) (7 8 9) (10 11 12))

いや、まぁこれでもできるんだけど…

(map (pa$ iota 3) (iota 4 1 3))
;;13:user> => ((1 2 3) (4 5 6) (7 8 9) (10 11 12))