The procedure `format-spec' bellow allows to format strings using
arbitrary user-defined escape sequences.  This can be useful when
generating text from a template, as in the following example:

 (format-spec
  "From: me <me@localhost>
 To: \"%n\" <%a>
 Subject: Hello

 Dear %n,

 ..."
  `((#\n . ,(customer-name cust))
    (#\a . ,(customer-address cust))))

Here is the code:

 ;;; formatting arbitrary formatting strings
 ;; Emilio Lopes <eclig@gmx.net>, 2006-04-17

 ;; Based on the Emacs library `format-spec' by Lars Magne Ingebrigtsen.

 ;; THIS FILE IS IN THE PUBLIC DOMAIN. USE AT YOUR OWN RISK!

 (define-structure format-spec
   (export format-spec)

   (open let-opt
         srfi-13
         scheme-with-scsh)
   (begin
     " For the sake of Emacs' indentation
 ("

 (define *escape-char* #\%)

 (define (format-spec fmt specification)
   ;; Return a string based on FMT and SPECIFICATION.
   ;; FMT is a string containing `format'-like specs like \"bash %u %k\",
   ;; while SPECIFICATION is an alist mapping from format spec characters
   ;; to values.
   (define esc (string *escape-char*))
   (define (match-handler m)
     (let-match m (#f spec)
       (cond
        ((string-null? spec)
         (error 'format-spec
                (format #f "Invalid format string at char ~a." (match:start m 0))))
        ((string=? spec esc) esc)
        ((assq (string-ref spec 0) specification) => cdr)
        (else
         (error 'format-spec
                (format #f "Unknown format specifier `~a' at char ~a." spec (match:start m 0)))))))
   (regexp-substitute/global #f (rx ,esc (submatch (? (| ,esc alphabetic))))
                             fmt
                             'pre match-handler 'post))
 ))

 ;; (format-spec "%a %%xy %z %c %a"
 ;;              '((#\a . "foo") (#\c . "bar") (#\z . "baz")))
