adjust printer for sets from `racket/set' to print in constructor style

also cooperate with pretty-print
This commit is contained in:
Matthew Flatt 2010-05-24 15:15:03 -06:00
parent 97d078a156
commit 12f2c4fe2e

View File

@ -1,5 +1,6 @@
#lang scheme/base #lang racket/base
(require (for-syntax scheme/base)) (require (for-syntax racket/base)
racket/pretty)
(provide set seteq seteqv (provide set seteq seteqv
set? set-eq? set-eqv? set-equal? set? set-eq? set-eqv? set-equal?
@ -14,15 +15,53 @@
(define-struct set (ht) (define-struct set (ht)
#:omit-define-syntaxes #:omit-define-syntaxes
#:property prop:custom-print-quotable 'never
#:property prop:custom-write #:property prop:custom-write
(lambda (s port write?) (lambda (s port mode)
(define print (if write? write display)) (define recur-print (cond
(write-string "#<set:" port) [(not mode) display]
(set-for-each s [(integer? mode) (lambda (p port) (print p port mode))]
(lambda (e) [else write]))
(write-string " " port) (define (print-prefix port)
(print e port))) (if (equal? 0 mode)
(write-string ">" port)) (write-string "(set" port)
(write-string "#<set:" port)))
(define (print-suffix port)
(if (equal? 0 mode)
(write-string ")" port)
(write-string ">" port)))
(define (print-one-line port)
(print-prefix port)
(set-for-each s
(lambda (e)
(write-string " " port)
(recur-print e port)))
(print-suffix port))
(define (print-multi-line port)
(let-values ([(line col pos) (port-next-location port)])
(print-prefix port)
(set-for-each s
(lambda (e)
(pretty-print-newline port (pretty-print-columns))
(write-string (make-string (add1 col) #\space) port)
(recur-print e port)))
(print-suffix port)))
(cond
[(and (pretty-printing)
(integer? (pretty-print-columns)))
((let/ec esc
(letrec ([tport (make-tentative-pretty-print-output-port
port
(- (pretty-print-columns) 1)
(lambda ()
(esc
(lambda ()
(tentative-pretty-print-port-cancel tport)
(print-multi-line port)))))])
(print-one-line tport)
(tentative-pretty-print-port-transfer tport port))
void))]
[else (print-one-line port)]))
#:property prop:equal+hash (list #:property prop:equal+hash (list
(lambda (set1 set2 =?) (lambda (set1 set2 =?)
(=? (set-ht set1) (set-ht set2))) (=? (set-ht set1) (set-ht set2)))