diff --git a/collects/racket/set.rkt b/collects/racket/set.rkt index 2d007c66c7..5c9c7f9641 100644 --- a/collects/racket/set.rkt +++ b/collects/racket/set.rkt @@ -1,5 +1,6 @@ -#lang scheme/base -(require (for-syntax scheme/base)) +#lang racket/base +(require (for-syntax racket/base) + racket/pretty) (provide set seteq seteqv set? set-eq? set-eqv? set-equal? @@ -14,15 +15,53 @@ (define-struct set (ht) #:omit-define-syntaxes + #:property prop:custom-print-quotable 'never #:property prop:custom-write - (lambda (s port write?) - (define print (if write? write display)) - (write-string "#" port)) + (lambda (s port mode) + (define recur-print (cond + [(not mode) display] + [(integer? mode) (lambda (p port) (print p port mode))] + [else write])) + (define (print-prefix port) + (if (equal? 0 mode) + (write-string "(set" 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 (lambda (set1 set2 =?) (=? (set-ht set1) (set-ht set2)))