Skip to content

Commit f82e96e

Browse files
iitalicsAlexKnauth
authored andcommitted
Change make-*-req/prov-tr to take id-(un)manglers to lift out repeated code
1 parent 48f6124 commit f82e96e

File tree

3 files changed

+33
-33
lines changed

3 files changed

+33
-33
lines changed

hackett-lib/hackett/private/mangle/mangle-identifier.rkt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
(provide make-id-mangler
44
or/unmangler
55
prefix/unmangler
6-
id-mangler)
6+
no-introduce/unmangler
7+
id-mangler
8+
no-introduce/mangler)
79

8-
(require racket/syntax
10+
(require racket/match
11+
racket/syntax
912
"mangle-string.rkt")
1013

1114
;; An IdMangler is an (id-mangler StxIntroducer StringMangler)
@@ -49,6 +52,16 @@
4952
(format-id unmangled "~a~a" pre unmangled
5053
#:source unmangled #:props unmangled)))
5154

55+
;; IdUnmangler -> IdUnmangler
56+
(define ((no-introduce/unmangler id-un) x)
57+
(define unmangled (id-un x))
58+
(and unmangled
59+
(datum->syntax x (syntax-e unmangled) x x)))
60+
61+
;; IdUnmangler -> IdUnmangler
62+
(define (no-introduce/mangler id-mangler*)
63+
(match-define (id-mangler _ string-mangler) id-mangler*)
64+
(id-mangler values string-mangler))
5265

5366
;; ---------------------------------------------------------
5467

@@ -65,4 +78,3 @@
6578
#false]))
6679

6780
;; ---------------------------------------------------------
68-

hackett-lib/hackett/private/mangle/mangle-reqprov.rkt

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,7 @@
2020
;; #:introducer StxIntroducer
2121
;; ->
2222
;; RequireTransformer
23-
(define (make-unmangling-require-transformer #:mangle-prefix mangle-prefix
24-
#:introducer intro)
25-
26-
(define-values [id-mangler id-unmangler]
27-
(make-id-mangler #:prefix mangle-prefix #:introducer intro))
28-
(define-values [id-mangler/no-intro id-unmangler/no-intro]
29-
(make-id-mangler #:prefix mangle-prefix #:introducer identity))
30-
23+
(define (make-unmangling-require-transformer id-unmangler)
3124
(make-require-transformer
3225
(syntax-parser
3326
[(_ {~alt {~optional {~or {~and #:no-introduce no-introduce?}
@@ -36,19 +29,20 @@
3629
...
3730
require-spec ...)
3831
#:do [(define id-unmangler*
39-
(if (or (@ no-introduce?) (@ prefix))
40-
id-unmangler/no-intro
41-
id-unmangler))
42-
(define id-unmangler**
43-
(if (@ prefix)
44-
(prefix/unmangler (syntax-e (@ prefix)) id-unmangler*)
45-
id-unmangler*))
32+
(let* ([unm id-unmangler]
33+
[unm (if (or (@ no-introduce?) (@ prefix))
34+
(no-introduce/unmangler unm)
35+
unm)]
36+
[unm (if (@ prefix)
37+
(prefix/unmangler (syntax-e (@ prefix)) unm)
38+
unm)])
39+
unm))
4640

4741
(define-values [imports sources]
4842
(expand-import #'(combine-in require-spec ...)))]
4943

5044
(values (for*/list ([i (in-list imports)]
51-
[i* (in-value (unmangle-import i id-unmangler**))]
45+
[i* (in-value (unmangle-import i id-unmangler*))]
5246
#:when (if (@ only?) i* #t))
5347
(or i* i))
5448
sources)])))
@@ -57,21 +51,14 @@
5751
;; #:introducer StxIntroducer
5852
;; ->
5953
;; ProvideTransformer
60-
(define (make-mangling-provide-transformer #:mangle-prefix mangle-prefix
61-
#:introducer intro)
62-
63-
(define-values [id-mangler id-unmangler]
64-
(make-id-mangler #:prefix mangle-prefix #:introducer intro))
65-
(define-values [id-mangler/no-intro id-unmangler/no-intro]
66-
(make-id-mangler #:prefix mangle-prefix #:introducer identity))
67-
54+
(define (make-mangling-provide-transformer id-mangler)
6855
(make-provide-transformer
6956
(λ (stx modes)
7057
(syntax-parse stx
7158
[(_ {~optional {~and #:no-introduce no-introduce?}} provide-spec ...)
7259
#:do [(define id-mangler*
7360
(if (@ no-introduce?)
74-
id-mangler/no-intro
61+
(no-introduce/mangler id-mangler)
7562
id-mangler))
7663

7764
(define exports

hackett-lib/hackett/private/type-reqprov.rkt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,18 @@
3030
syntax/parse/define
3131

3232
(for-syntax hackett/private/typecheck
33+
"mangle/mangle-identifier.rkt"
3334
"mangle/mangle-reqprov.rkt"))
3435

3536
(provide for-type unmangle-types-in)
3637

3738
(begin-for-syntax
38-
(define type-prefix "#%hackett-type:"))
39+
(define-values [type-id-mangler type-id-unmangler]
40+
(make-id-mangler #:prefix "#%hackett-type:"
41+
#:introducer type-namespace-introduce)))
3942

4043
(define-syntax for-type
41-
(make-mangling-provide-transformer #:mangle-prefix type-prefix
42-
#:introducer type-namespace-introduce))
44+
(make-mangling-provide-transformer type-id-mangler))
4345

4446
(define-syntax unmangle-types-in
45-
(make-unmangling-require-transformer #:mangle-prefix type-prefix
46-
#:introducer type-namespace-introduce))
47+
(make-unmangling-require-transformer type-id-unmangler))

0 commit comments

Comments
 (0)