; counting digits

(define (filter pred? xs)
  (let loop ((xs xs) (ys '()))
    (cond ((null? xs) (reverse ys))
          ((pred? (car xs))
            (loop (cdr xs) (cons (car xs) ys)))
          (else (loop (cdr xs) ys)))))

(define (digits n . args)
  (let ((b (if (null? args) 10 (car args))))
    (let loop ((n n) (d '()))
      (if (zero? n) d
          (loop (quotient n b)
                (cons (modulo n b) d))))))

(define (f lo hi)
  (define (is258 d) (or (= d 2) (= d 5) (= d 8)))
  (define (cnt n) (length (filter is258 (digits n))))
  (do ((n lo (+ n 1)) (c 0 (+ c (cnt n)))) ((< hi n) c)))
 
(display (f 295 305)) (newline)
(display (f 11 100000)) (newline)