srfi-28.scm 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. ;; Copyright (C) Scott G. Miller (2002). All Rights Reserved.
  2. ;; Revised uses of ERROR as compared to the reference implementation.
  3. (define format
  4. (lambda (format-string . the-objects)
  5. (let ((buffer (open-output-string)))
  6. (let loop ((format-list (string->list format-string))
  7. (objects the-objects))
  8. (cond ((null? format-list) (get-output-string buffer))
  9. ((char=? (car format-list) #\~)
  10. (if (null? (cdr format-list))
  11. (assertion-violation 'format "Incomplete escape sequence" format-string)
  12. (case (cadr format-list)
  13. ((#\a)
  14. (if (null? objects)
  15. (apply assertion-violation 'format "No value for escape sequence"
  16. format-string the-objects)
  17. (begin
  18. (display (car objects) buffer)
  19. (loop (cddr format-list) (cdr objects)))))
  20. ((#\s)
  21. (if (null? objects)
  22. (apply assertion-violation 'format "No value for escape sequence"
  23. format-string the-objects)
  24. (begin
  25. (write (car objects) buffer)
  26. (loop (cddr format-list) (cdr objects)))))
  27. ((#\%)
  28. (newline buffer)
  29. (loop (cddr format-list) objects))
  30. ((#\~)
  31. (write-char #\~ buffer)
  32. (loop (cddr format-list) objects))
  33. (else
  34. (assertion-violation 'format "Unrecognized escape sequence" format-string)))))
  35. (else (write-char (car format-list) buffer)
  36. (loop (cdr format-list) objects)))))))