Skip to content

Commit bd3ccad

Browse files
committed
use syntax-local-apply-transformer
Switch enforestation-level expansion away from a custom expansion step and scope management, and use `syntax-local-apply-transformer`, instead. Thanks to @michaelballantyne for reminding me how this is supposed to work.
1 parent eeb3287 commit bd3ccad

15 files changed

+184
-176
lines changed

enforest/main.rkt

+6-4
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,12 @@
211211
[() (raise-syntax-error #f (format "missing ~a" form-kind-str) stxes)]
212212
[(head::name . tail)
213213
(define name-path? (starts-like-name-path? #'head #'tail))
214+
(define head-name (and name-path? (in-name-root-space #'head.name)))
214215
(cond
215216
[(and name-path?
216-
(syntax-local-value* (in-name-root-space #'head.name) name-root-ref))
217+
(syntax-local-value* head-name name-root-ref))
217218
=> (lambda (v)
218-
(define-values (head tail) (apply-name-root #'head.name v in-space stxes))
219+
(define-values (head tail) (apply-name-root head-name v in-space stxes))
219220
(enforest-step (datum->syntax #f (cons head tail)) current-op current-op-stx stop-on-unbound?))]
220221
[else
221222
(define head-id (in-space #'head.name))
@@ -271,11 +272,12 @@
271272
[() (values init-form stxes)]
272273
[(head::name . tail)
273274
(define name-path? (starts-like-name-path? #'head #'tail))
275+
(define head-name (and name-path? (in-name-root-space #'head.name)))
274276
(cond
275277
[(and name-path?
276-
(syntax-local-value* (in-name-root-space #'head.name) name-root-ref))
278+
(syntax-local-value* head-name name-root-ref))
277279
=> (lambda (v)
278-
(define-values (head tail) (apply-name-root #'head.name v in-space stxes))
280+
(define-values (head tail) (apply-name-root head-name v in-space stxes))
279281
(enforest-step init-form (datum->syntax #f (cons head tail)) current-op current-op-stx stop-on-unbound?))]
280282
[else
281283
(define head-id (in-space #'head.name))

enforest/name-root.rkt

+14-11
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@
1717

1818
(define (apply-name-root op-stx lxc in-space stxes)
1919
(define proc (name-root-proc lxc))
20-
(call-as-transformer
21-
op-stx
22-
syntax-track-origin
23-
(lambda (in out)
24-
(define-values (target tail) (proc in-space (in stxes)))
25-
(unless (or (identifier? target)
26-
(and (syntax? target)
27-
(pair? (syntax-e target))
28-
(eq? 'op (syntax-e (car (syntax-e target))))))
29-
(raise-result-error (proc-name proc) "identifier-or-operator?" target))
30-
(check-transformer-result (out target) (out tail) proc))))
20+
(define-values (target tail)
21+
(call-as-transformer
22+
op-stx
23+
(list stxes)
24+
syntax-track-origin
25+
(lambda (stxes)
26+
(define-values (target tail) (proc in-space stxes))
27+
(unless (or (identifier? target)
28+
(and (syntax? target)
29+
(pair? (syntax-e target))
30+
(eq? 'op (syntax-e (car (syntax-e target))))))
31+
(raise-result-error (proc-name proc) "identifier-or-operator?" target))
32+
(values target tail))))
33+
(check-transformer-result target tail proc))
3134

3235
(define (name-root-ref-root v ref)
3336
(ref v))

enforest/operator.rkt

+40-32
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@
136136
[else dir])]))
137137

138138
(define (lookup-prefix-implicit alone-name adj-context adj-form in-space operator-ref operator-kind form-kind)
139-
(define op-stx (datum->syntax adj-context alone-name))
140-
(define op (syntax-local-value* (in-space op-stx) operator-ref))
139+
(define op-stx (in-space (datum->syntax adj-context alone-name)))
140+
(define op (syntax-local-value* op-stx operator-ref))
141141
(unless op
142142
(raise-syntax-error #f
143143
(format (string-append
@@ -155,8 +155,8 @@
155155

156156
(define (lookup-infix-implicit adjacent-name prev-form adj-context adj-form in-space operator-ref operator-kind form-kind
157157
stop-on-unbound? lookup-space-description)
158-
(define op-stx (datum->syntax adj-context adjacent-name))
159-
(define op (syntax-local-value* (in-space op-stx) operator-ref))
158+
(define op-stx (in-space (datum->syntax adj-context adjacent-name)))
159+
(define op (syntax-local-value* op-stx operator-ref))
160160
(unless op
161161
(cond
162162
[(identifier? prev-form)
@@ -215,39 +215,47 @@
215215
#f)
216216

217217
(define (apply-prefix-direct-operator op form stx track-origin checker)
218-
(call-as-transformer
219-
stx
220-
track-origin
221-
(lambda (in out)
222-
(define proc (operator-proc op))
223-
(out (checker (proc (in form) stx) proc)))))
218+
(define proc (operator-proc op))
219+
(checker (call-as-transformer
220+
stx
221+
(list form)
222+
track-origin
223+
(lambda (form)
224+
(proc form stx)))
225+
proc))
224226

225227
(define (apply-infix-direct-operator op form1 form2 stx track-origin checker)
226-
(call-as-transformer
227-
stx
228-
track-origin
229-
(lambda (in out)
230-
(define proc (operator-proc op))
231-
(checker (out (proc (in form1) (in form2) stx)) proc))))
228+
(define proc (operator-proc op))
229+
(checker (call-as-transformer
230+
stx
231+
(list form1 form2)
232+
track-origin
233+
(lambda (form1 form2)
234+
(proc form1 form2 stx)))
235+
proc))
232236

233237
(define (apply-prefix-transformer-operator op op-stx tail track-origin checker)
234238
(define proc (operator-proc op))
235-
(call-as-transformer
236-
op-stx
237-
track-origin
238-
(lambda (in out)
239-
(define-values (form new-tail) (proc (in tail)))
240-
(check-transformer-result (out (checker form proc))
241-
(out new-tail)
242-
proc))))
239+
(define-values (form new-tail)
240+
(call-as-transformer
241+
op-stx
242+
(list tail)
243+
track-origin
244+
(lambda (tail)
245+
(define-values (form new-tail) (proc tail))
246+
(values (checker form proc)
247+
new-tail))))
248+
(check-transformer-result form new-tail proc))
243249

244250
(define (apply-infix-transformer-operator op op-stx form1 tail track-origin checker)
245251
(define proc (operator-proc op))
246-
(call-as-transformer
247-
op-stx
248-
track-origin
249-
(lambda (in out)
250-
(define-values (form new-tail) (proc (in form1) (in tail)))
251-
(check-transformer-result (out (checker form proc))
252-
(out new-tail)
253-
proc))))
252+
(define-values (form new-tail)
253+
(call-as-transformer
254+
op-stx
255+
(list form1 tail)
256+
track-origin
257+
(lambda (form1 tail)
258+
(define-values (form new-tail) (proc form1 tail))
259+
(values (checker form proc)
260+
new-tail))))
261+
(check-transformer-result form new-tail proc))

enforest/private/transform.rkt

+24-21
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,33 @@
1010

1111
(define no-props (datum->syntax #f #f))
1212

13-
(define current-transformer-introduce (make-parameter (lambda (stx) stx)))
1413
(define (transform-in stx)
15-
((current-transformer-introduce) stx))
14+
(syntax-local-introduce stx))
1615
(define (transform-out stx)
17-
((current-transformer-introduce) stx))
16+
(syntax-local-introduce stx))
1817

19-
(define (call-as-transformer id track-origin thunk)
20-
(define intro (make-syntax-introducer))
21-
(parameterize ([current-transformer-introduce intro])
22-
(thunk intro
23-
(lambda (stx)
24-
(let loop ([stx stx])
25-
(cond
26-
[(syntax? stx)
27-
(track-origin (intro stx)
28-
(let ([du (syntax-property id 'disappeared-use)])
29-
(if du
30-
(syntax-property no-props 'disappeared-use du)
31-
no-props))
32-
id)]
33-
[(pair? stx) (cons (loop (car stx))
34-
(loop (cdr stx)))]
35-
[else stx]))))))
18+
(define (call-as-transformer id args track-origin proc)
19+
(call-with-values
20+
(lambda ()
21+
(apply syntax-local-apply-transformer
22+
proc
23+
id
24+
;; for now, use contexts that imply no use-site scopes:
25+
(if (eq? 'top-level (syntax-local-context))
26+
'top-level
27+
'expression)
28+
#f
29+
(map syntax-local-introduce args)))
30+
(lambda stxes
31+
(apply values (map syntax-local-introduce (map (track track-origin id) stxes))))))
32+
33+
(define ((track track-origin id) stx)
34+
(track-origin stx
35+
(let ([du (syntax-property id 'disappeared-use)])
36+
(if du
37+
(syntax-property no-props 'disappeared-use du)
38+
no-props))
39+
id))
3640

3741
(define (check-transformer-result form tail proc)
3842
(unless (syntax? form) (raise-result-error (proc-name proc) "syntax?" form))
@@ -51,4 +55,3 @@
5155
(syntax-track-origin e from-stx id))
5256
stx
5357
stx))
54-

enforest/sequence.rkt

+10-8
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,13 @@
7878

7979
(define (apply-sequence-transformer t id stx tail track-origin checker)
8080
(define proc (sequence-transformer-proc t))
81-
(call-as-transformer
82-
id
83-
track-origin
84-
(lambda (in out)
85-
(define-values (forms new-tail) (proc (in stx) (in tail)))
86-
(check-transformer-result (out (datum->syntax #f (checker forms proc)))
87-
(out new-tail)
88-
proc))))
81+
(define-values (forms new-tail)
82+
(call-as-transformer
83+
id
84+
(list stx tail)
85+
track-origin
86+
(lambda (stx tail)
87+
(define-values (forms new-tail) (proc stx tail))
88+
(values (datum->syntax #f (checker forms proc))
89+
(datum->syntax #f new-tail)))))
90+
(check-transformer-result forms new-tail proc))

enforest/transformer.rkt

+4-5
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
transformer
1919
transformer-ref
2020

21-
transform-in
22-
transform-out
2321
call-as-transformer
2422

2523
track-sequence-origin
@@ -116,7 +114,8 @@
116114
(define proc (transformer-proc t))
117115
(call-as-transformer
118116
id
117+
(list stx)
119118
track-origin
120-
(lambda (in out)
121-
(define forms (checker (proc (in stx)) proc))
122-
(datum->syntax #f (out forms)))))
119+
(lambda (stx)
120+
(define forms (checker (proc stx) proc))
121+
(datum->syntax #f forms))))

rhombus/private/binding.rkt

+6-7
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,12 @@
5757
"cannot find a transformer for an infoer"
5858
#'infoer-id))]
5959
#:with info (check-binding-info-result
60-
(transform-out
61-
(let ([form (transform-in #'form)])
62-
(call-as-transformer
63-
#'infoer-id
64-
syntax-track-origin
65-
(lambda (in out)
66-
(out (proc (in form)))))))
60+
(let ([form #'form])
61+
(call-as-transformer
62+
#'infoer-id
63+
(list form)
64+
syntax-track-origin
65+
proc))
6766
proc)))
6867

6968
;; To unpack a binding infoer result:

rhombus/private/export.rkt

+9-9
Original file line numberDiff line numberDiff line change
@@ -92,26 +92,26 @@
9292
#:make-identifier-form make-identifier-export
9393
#:make-operator-form make-identifier-export)
9494

95-
(define (make-export-modifier-ref transform-in ex)
95+
(define (make-export-modifier-ref ex)
9696
;; "accessor" closes over `ex`:
9797
(lambda (v)
9898
(define mod (export-modifier-ref v))
9999
(and mod
100100
(transformer (lambda (stx)
101-
((transformer-proc mod) (transform-in ex) stx))))))
101+
((transformer-proc mod) (syntax-local-introduce ex) stx))))))
102102

103103
(define-rhombus-transform
104104
#:syntax-class (:export-modifier parsed-ex)
105105
#:desc "export modifier"
106106
#:parsed-tag #:rhombus/expo
107107
#:in-space in-export-space
108-
#:transformer-ref (make-export-modifier-ref transform-in (syntax-parse parsed-ex
109-
#:datum-literals (parsed)
110-
[(parsed #:rhombus/expo req) #'req]
111-
[_ (raise-arguments-error
112-
'export_meta.ParsedModifier
113-
"given export to modify is not parsed"
114-
"base export" parsed-ex)])))
108+
#:transformer-ref (make-export-modifier-ref (syntax-parse parsed-ex
109+
#:datum-literals (parsed)
110+
[(parsed #:rhombus/expo req) #'req]
111+
[_ (raise-arguments-error
112+
'export_meta.ParsedModifier
113+
"given export to modify is not parsed"
114+
"base export" parsed-ex)])))
115115

116116
(define-syntax-class :modified-export
117117
#:attributes (parsed)

rhombus/private/expr-macro.rkt

+3-4
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,9 @@
158158
(syntax-parse (unpack-group s who #f)
159159
[e::expression
160160
(define-values (expr opaque)
161-
(syntax-local-expand-expression
162-
(syntax-local-introduce (transform-out #'e.parsed))))
161+
(syntax-local-expand-expression #'e.parsed))
163162
(values (relocate+reraw expr #`(parsed #:rhombus/expr
164-
#,(transform-in (syntax-local-introduce expr))))
163+
#,expr))
165164
(relocate+reraw expr #`(parsed #:rhombus/expr
166-
#,(transform-in (syntax-local-introduce opaque)))))]))
165+
#,opaque)))]))
167166
)

rhombus/private/import.rkt

+3-3
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@
122122
(define mod (or (import-modifier-ref v)
123123
(import-modifier-block-ref v)))
124124
(and mod
125-
(transformer (let ([req (transform-in req)]) ; import transformer scope
125+
(transformer (let ([req (syntax-local-introduce req)]) ; import transformer scope
126126
(lambda (stx)
127-
((transformer-proc mod) (transform-in req) ; import-modifier transformer scope
127+
((transformer-proc mod) (syntax-local-introduce req) ; import-modifier transformer scope
128128
stx)))))))
129129

130130
(define-rhombus-transform
@@ -506,7 +506,7 @@
506506
(syntax-parse i
507507
#:datum-literals (parsed nspace)
508508
[(parsed mod-path parsed-r)
509-
(define-values (mp r) (import-invert (syntax-local-introduce (transform-in #'parsed-r)) #f #f))
509+
(define-values (mp r) (import-invert (syntax-local-introduce #'parsed-r) #f #f))
510510
#`(reimport #,id #,mp #,r)]
511511
[(nspace . _) #`(import-root #,id #,i #,space-id)]))])))
512512
(cond

rhombus/private/name-root-ref.rkt

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
field-id
5151
field-id)
5252
'disappeared-use
53-
(transform-out (in-name-root-space prefix))))
53+
(syntax-local-introduce (in-name-root-space prefix))))
5454
(define (next form-id field-id what tail)
5555
(define binding-end? (and binding-ref
5656
(syntax-parse tail
@@ -228,8 +228,8 @@
228228
(syntax-e root-id))
229229
(syntax-e field-id))))
230230
'disappeared-use
231-
(let ([root (transform-out (in-name-root-space root-id))])
232-
(if (syntax-original? (transform-out field-id))
231+
(let ([root (syntax-local-introduce (in-name-root-space root-id))])
232+
(if (syntax-original? (syntax-local-introduce field-id))
233233
;; enable arrows, etc., from `new-field-id` based on its binding
234234
(cons (syntax-property (datum->syntax new-field-id
235235
(syntax-e new-field-id)

rhombus/private/namespace.rkt

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
#:with name::dotted-identifier #'name-seq
4242
(define intro syntax-local-introduce)
4343
#`((rhombus-nested-forwarding-sequence
44-
(define-name-root-for-exports [name.name name.extends plain #,(intro #'scoped)])
44+
(define-name-root-for-exports [name.name name.extends #,(intro #'plain) scoped])
4545
#,(intro
4646
#`(rhombus-nested form ...))))]))))
4747

0 commit comments

Comments
 (0)