mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 20:30:28 +02:00
62 lines
1.8 KiB
Scheme
62 lines
1.8 KiB
Scheme
(define-module (lang elisp internals format)
|
|
#:pure
|
|
#:use-module (ice-9 r5rs)
|
|
#:use-module ((ice-9 format) #:select ((format . scheme:format)))
|
|
#:use-module (lang elisp internals fset)
|
|
#:use-module (lang elisp internals signal)
|
|
#:replace (format)
|
|
#:export (message))
|
|
|
|
(define (format control-string . args)
|
|
|
|
(define (cons-string str ls)
|
|
(let loop ((sl (string->list str))
|
|
(ls ls))
|
|
(if (null? sl)
|
|
ls
|
|
(loop (cdr sl) (cons (car sl) ls)))))
|
|
|
|
(let loop ((input (string->list control-string))
|
|
(args args)
|
|
(output '())
|
|
(mid-control #f))
|
|
(if (null? input)
|
|
(if mid-control
|
|
(error "Format string ends in middle of format specifier")
|
|
(list->string (reverse output)))
|
|
(if mid-control
|
|
(case (car input)
|
|
((#\%)
|
|
(loop (cdr input)
|
|
args
|
|
(cons #\% output)
|
|
#f))
|
|
(else
|
|
(loop (cdr input)
|
|
(cdr args)
|
|
(cons-string (case (car input)
|
|
((#\s) (scheme:format #f "~A" (car args)))
|
|
((#\d) (number->string (car args)))
|
|
((#\o) (number->string (car args) 8))
|
|
((#\x) (number->string (car args) 16))
|
|
((#\e) (number->string (car args))) ;FIXME
|
|
((#\f) (number->string (car args))) ;FIXME
|
|
((#\g) (number->string (car args))) ;FIXME
|
|
((#\c) (let ((a (car args)))
|
|
(if (char? a)
|
|
(string a)
|
|
(string (integer->char a)))))
|
|
((#\S) (scheme:format #f "~S" (car args)))
|
|
(else
|
|
(error "Invalid format operation %%%c" (car input))))
|
|
output)
|
|
#f)))
|
|
(case (car input)
|
|
((#\%)
|
|
(loop (cdr input) args output #t))
|
|
(else
|
|
(loop (cdr input) args (cons (car input) output) #f)))))))
|
|
|
|
(define (message control-string . args)
|
|
(display (apply format control-string args))
|
|
(newline))
|