; common-characters

(define (fold-left op base xs)
  (if (null? xs)
      base
      (fold-left op (op base (car xs)) (cdr xs))))

(define (common x-str y-str)
  (let loop ((xs (sort (string->list x-str) char<?))
             (ys (sort (string->list y-str) char<?))
             (zs (list)))
    (cond ((or (null? xs) (null? ys))
            (list->string (reverse zs)))
          ((char<? (car xs) (car ys))
            (loop (cdr xs) ys zs))
          ((char<? (car ys) (car xs))
            (loop xs (cdr ys) zs))
          (else (loop (cdr xs) (cdr ys)
                      (cons (car xs) zs))))))

(define (common-chars . words)
  (fold-left common (car words) (cdr words)))

(display (common-chars "bella" "label" "roller")) (newline)