From 145ef2d2866cd85f09ac1a9d1636f25373af2e2c Mon Sep 17 00:00:00 2001 From: Mike Delmonaco Date: Thu, 26 Dec 2024 23:11:19 -0500 Subject: [PATCH] get-racket-referenced-identifiers emits syntax-quoted identifiers fixes #64 --- private/runtime/binding-operations.rkt | 9 ++++++--- tests/racket-references.rkt | 8 +++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/private/runtime/binding-operations.rkt b/private/runtime/binding-operations.rkt index f329c38..bc83a1a 100644 --- a/private/runtime/binding-operations.rkt +++ b/private/runtime/binding-operations.rkt @@ -11,7 +11,7 @@ syntax/parse syntax/id-table "../ee-lib/main.rkt" - (for-template "./compile.rkt")) + (for-template racket/base "./compile.rkt")) ;; Currently we use this as the notion of identifier equality: (define (identifier=? x y) (free-identifier=? (compiled-from x) (compiled-from y))) @@ -179,9 +179,12 @@ (define recording-reference-compiler (make-variable-like-reference-compiler - (lambda (x) (symbol-set-add! (current-referenced-vars) x) x) + ;; emit syntax instead of raw reference. + ;; this is necessary for languages that don't emit bindings for + ;; racket-reference-able identifiers. + (lambda (x) (symbol-set-add! (current-referenced-vars) x) #`#'#,x) (lambda (e) (syntax-parse e [(set! x _) (symbol-set-add! (current-referenced-vars) #'x) - #'x])))) + #'#'x])))) diff --git a/tests/racket-references.rkt b/tests/racket-references.rkt index bd45c7d..50a26cf 100644 --- a/tests/racket-references.rkt +++ b/tests/racket-references.rkt @@ -16,6 +16,8 @@ #:binding (scope (bind x) e) (let/c x:c-var e:my-expr) #:binding (scope (bind x) e) + (let/no-binding x:a-var e:my-expr) + #:binding (scope (bind x) e) (rkt e:racket-expr)) (host-interface/expression (my-dsl e:my-expr) @@ -23,9 +25,11 @@ (define-syntax compile-expr (syntax-parser - #:datum-literals (let/a let/b let/c rkt) + #:datum-literals (let/a let/b let/c let/no-binding rkt) [(_ ((~or let/a let/b let/c) x:id e:expr)) #'(let ([x 1]) (compile-expr e))] + [(_ (let/no-binding x:id e:expr)) + #'(compile-expr e)] [(_ (rkt e:expr)) (define/syntax-parse (x ...) (get-racket-referenced-identifiers (a-var b-var) #'e)) @@ -50,3 +54,5 @@ (let/b z (rkt (+ x y z))))))) (seteq 'y 'z)) +(check-equal? (my-dsl (let/no-binding x (rkt (+ x x)))) + '(x))