-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinform.rkt
45 lines (37 loc) · 1.57 KB
/
inform.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#lang racket
(provide inform inform-verbosity inform-verbosity-quiet inform-verbosity-all with-info inform-level indent-string
inform-tab-spaces with-info*)
(define inform-verbosity-quiet 0)
(define inform-verbosity-all 7)
(define inform-verbosity (make-parameter inform-verbosity-all))
(define inform-level (make-parameter 0))
(define inform-tab-spaces (make-parameter 2))
(define (indent-string level #:tab-spaces [tab-spaces (inform-tab-spaces)])
(make-string (* (max (sub1 level) 0) tab-spaces) #\space))
(define (inform msg
#:verbosity [verbosity inform-verbosity-all]
#:port [port (current-output-port)]
#:indent-level [indent-level (inform-level)] . args)
(unless (< (inform-verbosity) verbosity)
(display (indent-string indent-level) port)
(if (null? args)
(display msg port)
(apply fprintf (cons port (cons msg args)))))
(flush-output port))
(define-syntax with-info
(syntax-rules ()
((with-info (msg args ...) body ... (msg2 args2 ...))
(parameterize ([inform-level (add1 (inform-level))])
(dynamic-wind
(lambda () (inform msg args ...))
(lambda () body ...)
(lambda () (inform msg2 args2 ...)))))))
(define-syntax with-info*
(syntax-rules ()
((with-info (msg args ...) body ... (msg2 args2 ...))
(parameterize ([inform-level (add1 (inform-level))])
(dynamic-wind
(lambda () (inform msg args ...))
(lambda () body ...)
(lambda () (parameterize ([inform-level 1])
(inform msg2 args2 ...))))))))