1 (define-module (lang elisp internals format)
3 #:use-module (ice-9 r5rs)
4 #:use-module ((ice-9 format) #:select ((format . scheme:format)))
5 #:use-module (lang elisp internals fset)
6 #:use-module (lang elisp internals signal)
10 (define (format control-string . args)
12 (define (cons-string str ls)
13 (let loop ((sl (string->list str))
17 (loop (cdr sl) (cons (car sl) ls)))))
19 (let loop ((input (string->list control-string))
25 (error "Format string ends in middle of format specifier")
26 (list->string (reverse output)))
37 (cons-string (case (car input)
38 ((#\s) (scheme:format #f "~A" (car args)))
39 ((#\d) (number->string (car args)))
40 ((#\o) (number->string (car args) 8))
41 ((#\x) (number->string (car args) 16))
42 ((#\e) (number->string (car args))) ;FIXME
43 ((#\f) (number->string (car args))) ;FIXME
44 ((#\g) (number->string (car args))) ;FIXME
45 ((#\c) (let ((a (car args)))
48 (string (integer->char a)))))
49 ((#\S) (scheme:format #f "~S" (car args)))
51 (error "Invalid format operation %%%c" (car input))))
56 (loop (cdr input) args output #t))
58 (loop (cdr input) args (cons (car input) output) #f)))))))
60 (define (message control-string . args)
61 (display (apply format control-string args))