|
17 | 17 | racket/match
|
18 | 18 | racket/syntax
|
19 | 19 | syntax/private/id-table
|
| 20 | + (only-in syntax/private/id-set |
| 21 | + mutable-free-id-set |
| 22 | + free-id-set-add! |
| 23 | + free-id-set-member?) |
20 | 24 | (for-syntax racket/base
|
21 | 25 | syntax/parse))
|
22 | 26 |
|
|
41 | 45 |
|
42 | 46 | (define name-sc-table (make-parameter (make-hash)))
|
43 | 47 | (define name-defs-table (make-parameter (make-hash)))
|
| 48 | +(define current-flat-names (make-parameter (mutable-free-id-set))) |
44 | 49 |
|
45 | 50 | (define (set-flat-names! gen-names)
|
46 |
| - (for* ([ns (in-hash-values (name-sc-table))] |
47 |
| - [n (in-list ns)] |
48 |
| - #:when (member (name-combinator-gen-name n) gen-names)) |
49 |
| - (set-name-combinator-flat! n #true))) |
| 51 | + (define cfn (current-flat-names)) |
| 52 | + (for ((stx (in-list gen-names))) |
| 53 | + (free-id-set-add! cfn stx))) |
50 | 54 |
|
51 | 55 | ;; Use this table to track whether a contract has already been
|
52 | 56 | ;; generated for this name type yet. Stores booleans.
|
|
63 | 67 | (define-syntax-rule (with-new-name-tables e)
|
64 | 68 | (parameterize ([name-sc-table (make-hash)]
|
65 | 69 | [name-defs-table (make-hash)]
|
66 |
| - [name-defined-table (make-free-id-table)]) |
| 70 | + [name-defined-table (make-free-id-table)] |
| 71 | + [current-flat-names (mutable-free-id-set)]) |
67 | 72 | e))
|
68 | 73 |
|
69 | 74 | (define (get-all-name-defs)
|
|
98 | 103 | type
|
99 | 104 | (list typed-sc untyped-sc both-sc)))
|
100 | 105 |
|
101 |
| -(struct name-combinator combinator (gen-name [flat #:auto #:mutable]) |
| 106 | +(struct name-combinator combinator (gen-name) |
102 | 107 | #:transparent
|
103 | 108 | #:property prop:combinator-name "name/sc"
|
104 | 109 | #:methods gen:sc
|
|
110 | 115 | (define (sc->constraints v f)
|
111 | 116 | (variable-contract-restrict (name-combinator-gen-name v)))
|
112 | 117 | (define (sc-terminal-kind v)
|
113 |
| - (if (name-combinator-flat v) |
| 118 | + (if (free-id-set-member? (current-flat-names) (name-combinator-gen-name v)) |
114 | 119 | 'flat
|
115 |
| - #f))]) |
| 120 | + #false))]) |
116 | 121 |
|
117 | 122 | (define-match-expander name/sc:
|
118 | 123 | (syntax-parser
|
119 |
| - [(_ var) #'(name-combinator _ var _)])) |
| 124 | + [(_ var) #'(name-combinator _ var)])) |
120 | 125 |
|
0 commit comments