fix Scribble rendering of S-expression graphs

svn: r14886
This commit is contained in:
Matthew Flatt 2009-05-20 22:05:09 +00:00
parent f23ee1965e
commit f1d4fe02ea

View File

@ -529,13 +529,15 @@
(+ (syntax-column c) delta))) (+ (syntax-column c) delta)))
(set! src-col (+ orig-col (syntax-span c)))))] (set! src-col (+ orig-col (syntax-span c)))))]
[(graph-reference? (syntax-e c)) [(graph-reference? (syntax-e c))
(advance c init-line!)
(out (format "#~a#" (unbox (graph-reference-bx (syntax-e c)))) (out (format "#~a#" (unbox (graph-reference-bx (syntax-e c))))
(if (positive? quote-depth) (if (positive? quote-depth)
value-color value-color
paren-color))] paren-color))
(set! src-col (+ src-col (syntax-span c)))]
[(graph-defn? (syntax-e c)) [(graph-defn? (syntax-e c))
(advance c init-line!)
(let ([bx (graph-defn-bx (syntax-e c))]) (let ([bx (graph-defn-bx (syntax-e c))])
(set-box! bx 0)
(out (format "#~a=" (unbox bx)) (out (format "#~a=" (unbox bx))
(if (positive? quote-depth) (if (positive? quote-depth)
value-color value-color
@ -723,12 +725,12 @@
(define-struct graph-defn (r bx)) (define-struct graph-defn (r bx))
(define (syntax-ize v col [line 1]) (define (syntax-ize v col [line 1])
(do-syntax-ize v col line (make-hasheq) #f)) (do-syntax-ize v col line (box #hasheq()) #f))
(define (graph-count ht graph?) (define (graph-count ht graph?)
(and graph? (and graph?
(let ([n (hash-ref ht '#%graph-count 0)]) (let ([n (hash-ref (unbox ht) '#%graph-count 0)])
(hash-set! ht '#%graph-count (add1 n)) (set-box! ht (hash-set (unbox ht) '#%graph-count (add1 n)))
n))) n)))
(define (do-syntax-ize v col line ht graph?) (define (do-syntax-ize v col line ht graph?)
@ -746,7 +748,7 @@
s s
s s
(just-context-ctx v)))] (just-context-ctx v)))]
[(hash-ref ht v #f) [(hash-ref (unbox ht) v #f)
=> (lambda (m) => (lambda (m)
(unless (unbox m) (unless (unbox m)
(set-box! m #t)) (set-box! m #t))
@ -770,17 +772,18 @@
(vector? v) (vector? v)
(and (struct? v) (and (struct? v)
(prefab-struct-key v))) (prefab-struct-key v)))
(let ([graph-box (box (graph-count ht graph?))]) (let ([orig-ht (unbox ht)]
(hash-set! ht v graph-box) [graph-box (box (graph-count ht graph?))])
(let ([r (let* ([vec-sz (+ (if graph? (set-box! ht (hash-set (unbox ht) v graph-box))
(let* ([graph-sz (if graph?
(+ 2 (string-length (format "~a" (unbox graph-box)))) (+ 2 (string-length (format "~a" (unbox graph-box))))
0) 0)]
(cond [vec-sz (cond
[(vector? v) [(vector? v)
(+ 1 #;(string-length (format "~a" (vector-length v))))] (+ 1 #;(string-length (format "~a" (vector-length v))))]
[(struct? v) 2] [(struct? v) 2]
[else 0]))]) [else 0])]
(let ([l (let loop ([col (+ col 1 vec-sz)] [r (let ([l (let loop ([col (+ col 1 vec-sz graph-sz)]
[v (cond [v (cond
[(vector? v) [(vector? v)
(vector->short-list v values)] (vector->short-list v values)]
@ -799,33 +802,40 @@
[(struct? v) [(struct? v)
(apply make-prefab-struct (prefab-struct-key v) (cdr l))] (apply make-prefab-struct (prefab-struct-key v) (cdr l))]
[else l]) [else l])
(vector #f line col (+ 1 col) (vector #f line
(+ graph-sz col)
(+ 1 graph-sz col)
(+ 2 (+ 2
vec-sz vec-sz
(if (zero? (length l)) (if (zero? (length l))
0 0
(sub1 (length l))) (sub1 (length l)))
(apply + (map syntax-span l)))))))]) (apply + (map syntax-span l))))))])
(unless graph? (unless graph?
(hash-set! ht v #f)) (set-box! ht (hash-set (unbox ht) v #f)))
(cond (cond
[graph? (datum->syntax #f [graph? (datum->syntax #f
(make-graph-defn r graph-box) (make-graph-defn r graph-box)
r)] (vector #f (syntax-line r)
(- (syntax-column r) graph-sz)
(- (syntax-position r) graph-sz)
(+ (syntax-span r) graph-sz)))]
[(unbox graph-box) [(unbox graph-box)
;; Go again, this time knowing that there will be a graph: ;; Go again, this time knowing that there will be a graph:
(set-box! ht orig-ht)
(do-syntax-ize v col line ht #t)] (do-syntax-ize v col line ht #t)]
[else r])))] [else r])))]
[(pair? v) [(pair? v)
(let ([graph-box (box (graph-count ht graph?))]) (let ([orig-ht (unbox ht)]
(hash-set! ht v graph-box) [graph-box (box (graph-count ht graph?))])
(set-box! ht (hash-set (unbox ht) v graph-box))
(let* ([inc (if graph? (let* ([inc (if graph?
(+ 2 (string-length (format "~a" (unbox graph-box)))) (+ 2 (string-length (format "~a" (unbox graph-box))))
0)] 0)]
[a (do-syntax-ize (car v) (+ col 1 inc) line ht #f)] [a (do-syntax-ize (car v) (+ col 1 inc) line ht #f)]
[sep (if (and (pair? (cdr v)) [sep (if (and (pair? (cdr v))
;; FIXME: what if it turns out to be a graph reference? ;; FIXME: what if it turns out to be a graph reference?
(not (hash-ref ht (cdr v) #f))) (not (hash-ref (unbox ht) (cdr v) #f)))
0 0
3)] 3)]
[b (do-syntax-ize (cdr v) (+ col 1 inc (syntax-span a) sep) line ht #f)]) [b (do-syntax-ize (cdr v) (+ col 1 inc (syntax-span a) sep) line ht #f)])
@ -834,7 +844,7 @@
(vector #f line (+ col inc) (+ 1 col inc) (vector #f line (+ col inc) (+ 1 col inc)
(+ 2 sep (syntax-span a) (syntax-span b))))]) (+ 2 sep (syntax-span a) (syntax-span b))))])
(unless graph? (unless graph?
(hash-set! ht v #f)) (set-box! ht (hash-set (unbox ht) v #f)))
(cond (cond
[graph? (datum->syntax #f [graph? (datum->syntax #f
(make-graph-defn r graph-box) (make-graph-defn r graph-box)
@ -842,6 +852,7 @@
(+ inc (syntax-span r))))] (+ inc (syntax-span r))))]
[(unbox graph-box) [(unbox graph-box)
;; Go again... ;; Go again...
(set-box! ht orig-ht)
(do-syntax-ize v col line ht #t)] (do-syntax-ize v col line ht #t)]
[else r]))))] [else r]))))]
[(box? v) [(box? v)