(define (group lst n)
(define (group2 n2 lst2 group grouped)
(cond ((<= (length lst2) n2) (append grouped (list lst2)))
((= n2 0) (group2 n lst2 '() (append grouped (list (reverse group)))))
(else (group2 (- n2 1) (mcdr lst2) (cons (car lst2) group) grouped))))
(group2 n lst '() '() ))
[UPD] Спасибо всем за ответы. В комментариях подали идею сделать более функциональную реализацию. Получилось что-то такое:
(define (split n lst)
(map (lambda(x)(take n x))
(append (list lst) (reverse (cdr
(unfold (lambda(x)(drop n x)) lst empty?) )))))
(define (unfold func init pred)
(define (unfold2 func init pred res)
(let ((x (func init)))
(if (pred init)
res
(unfold2 func x pred (cons x res) ))))
(unfold2 func init pred '()))
(define (drop n lst)
(if (or (= n 0) (empty? lst))
lst
(drop (- n 1) (cdr lst))))
(define (take n lst)
(define (take2 lst n res)
(if (or (empty? lst) (= n 0)) (reverse res)
(take2 (cdr lst) (- n 1) (cons (car lst) res))))
(take2 lst n '()))