|
|
|
#lang br
|
|
|
|
(require (for-syntax br/syntax racket/function) racket/splicing)
|
|
|
|
|
|
|
|
(define-for-syntax (->syntax x)
|
|
|
|
(if (syntax? x) x (datum->syntax #f x)))
|
|
|
|
|
|
|
|
(define (context stx)
|
|
|
|
(hash-ref (syntax-debug-info stx) 'context))
|
|
|
|
|
|
|
|
(define #'(define-scope _color . _parents)
|
|
|
|
(let ([msi (make-syntax-introducer #t)])
|
|
|
|
(with-syntax ([color-scope (suffix-id #'_color "-scope")]
|
|
|
|
[add-color (prefix-id "add-" #'_color)]
|
|
|
|
[p1-add-color (prefix-id "p1-add-" #'_color)]
|
|
|
|
[color? (suffix-id #'_color "?")]
|
|
|
|
[color:define (suffix-id #'_color ":define")]
|
|
|
|
[msi msi])
|
|
|
|
#'(begin
|
|
|
|
(begin-for-syntax
|
|
|
|
(define color-scope (begin (displayln (gensym)) (procedure-rename msi 'color-scope)))
|
|
|
|
(define (add-color x) ((procedure-rename (curryr color-scope 'add) 'add-color) (->syntax x))))
|
|
|
|
(define #'(color? _x)
|
|
|
|
(with-syntax ([p1-add-color add-color])
|
|
|
|
#'(and (member (report (car (context (p1-add-color (datum->syntax #f '_))))) (report (context #'_x))) #t)))
|
|
|
|
(define #'(color:define _id-in _expr)
|
|
|
|
(with-syntax ([colored-binding-id (add-color #'_id-in)]
|
|
|
|
[color:id (prefix-id #'_color ":" #'_id-in)])
|
|
|
|
#'(begin
|
|
|
|
(define colored-binding-id _expr)
|
|
|
|
(define-syntax color:id
|
|
|
|
(syntax-id-rules ()
|
|
|
|
[_ colored-binding-id])))))))))
|
|
|
|
|
|
|
|
(require rackunit)
|
|
|
|
|
|
|
|
(define-scope blue)
|
|
|
|
|
|
|
|
(blue:define x 42)
|
|
|
|
|
|
|
|
(check-equal? blue:x 42)
|
|
|
|
|
|
|
|
|
|
|
|
(context #'blue:x)
|
|
|
|
(blue? blue:x)
|
|
|
|
|
|
|
|
#|
|
|
|
|
(define (double-x)
|
|
|
|
(with-blue-identifiers (x)
|
|
|
|
(set! x (+ x x))))
|
|
|
|
|
|
|
|
(define (display-x)
|
|
|
|
(with-blue-identifiers (x)
|
|
|
|
(displayln x)))
|
|
|
|
|
|
|
|
(blue:define x 42)
|
|
|
|
|
|
|
|
blue:x
|
|
|
|
|
|
|
|
(double-x)
|
|
|
|
|
|
|
|
(display-x)
|
|
|
|
|#
|