(define n-reverse-sublist
  (lambda (n ls)
    ; REQUIRES: n > 0
    (letrec
	((n-dup-on
	  ; TYPE: int, datum, list -> list
	  (lambda (n to-dup tail)
            ; REQUIRES: n > 0
            ; ENSURES: result is n conses
            ; of to-dup in front of tail
	    (if (zero? n)
		tail
		(cons
		  to-dup
		  (n-dup-on (sub1 n)
			    to-dup
			    tail))))))
      (if (null? ls) '()
	  (n-dup-on
	    n
	    (reverse (car ls))
	    (n-reverse-sublist
	      n
	      (cdr ls)))))))



(define n-reverse-sublist2
  (lambda (n ls)
    ; REQUIRES: n > 0
    (let ((n-dup-on
	   ; TYPE: datum, list -> list
	   (lambda (to-dup tail)
             ; ENSURES: result is n conses
             ; of to-dup in front of tail
	     (letrec ((n-dup
		       ; TYPE: num -> list
		       (lambda (n*)
			 (if (zero? n*)
			     tail
			     (cons
			      to-dup
			      (n-dup
			       (sub1 n*)))
			     ))))
	       (n-dup n)))))
      (n-dup-on
       (reverse (car ls))
       (n-reverse-sublist n (cdr ls))))))
