/racket-5-0-2-bin-i386-osx-mac-dmg/collects/typed/private/rewriter.rkt

http://github.com/smorin/f4f.arc · Racket · 60 lines · 54 code · 5 blank · 1 comment · 4 complexity · cad0023bef5f9dff7ed9a5e7761aa769 MD5 · raw file

  1. #lang racket/base
  2. (require (for-syntax syntax/parse racket/base syntax/id-table racket/dict
  3. unstable/debug))
  4. (define-for-syntax (rewrite stx tbl from)
  5. (define (rw stx)
  6. (syntax-recertify
  7. (syntax-parse stx #:literal-sets (kernel-literals)
  8. [i:identifier
  9. (dict-ref tbl #'i #'i)]
  10. ;; no expressions here
  11. [((~or (~literal #%top) (~literal quote) (~literal quote-syntax)) . _) stx]
  12. [(#%plain-lambda formals expr ...)
  13. (quasisyntax/loc stx (#%plain-lambda formals #,@(map rw (syntax->list #'(expr ...)))))]
  14. [(case-lambda [formals expr ...] ...)
  15. (with-syntax ([((expr* ...) ...) (for*/list ([exprs (in-list (syntax->list #'((expr ...) ...)))]
  16. [e (in-list (syntax->list exprs))])
  17. (rw e))])
  18. (quasisyntax/loc stx (case-lambda [formals expr* ...] ...)))]
  19. [(let-values ([(id ...) rhs] ...) expr ...)
  20. (with-syntax ([(rhs* ...) (map rw (syntax->list #'(rhs ...)))]
  21. [(expr* ...) (map rw (syntax->list #'(expr ...)))])
  22. (quasisyntax/loc stx (let-values ([(id ...) rhs*] ...) expr* ...)))]
  23. [(letrec-values ([(id ...) rhs] ...) expr ...)
  24. (with-syntax ([(rhs* ...) (map rw (syntax->list #'(rhs ...)))]
  25. [(expr* ...) (map rw (syntax->list #'(expr ...)))])
  26. (quasisyntax/loc stx (letrec-values ([(id ...) rhs*] ...) expr* ...)))]
  27. [(letrec-syntaxes+values ([(sid ...) srhs] ...) ([(id ...) rhs] ...) expr ...)
  28. (with-syntax ([(srhs* ...) (map rw (syntax->list #'(srhs ...)))]
  29. [(rhs* ...) (map rw (syntax->list #'(rhs ...)))]
  30. [(expr* ...) (map rw (syntax->list #'(expr ...)))])
  31. (quasisyntax/loc stx (letrec-syntaxes+values ([(sid ...) srhs*] ...) ([(id ...) rhs*] ...) expr* ...)))]
  32. [((~and kw
  33. (~or if begin begin0 set! #%plain-app #%expression
  34. #%variable-reference with-continuation-mark))
  35. expr ...)
  36. (quasisyntax/loc stx (#,#'kw #,@(map rw (syntax->list #'(expr ...)))))])
  37. stx
  38. (current-code-inspector)
  39. #f))
  40. (rw stx))
  41. (define-syntax (define-rewriter stx)
  42. (syntax-case stx ()
  43. [(_ orig-name new-name [from to] ...)
  44. #'(begin
  45. (define-for-syntax from-list (list #'from ...))
  46. (define-for-syntax tbl (make-immutable-free-id-table (map cons from-list (list #'to ...))))
  47. (define-syntax (new-name stx)
  48. (syntax-case stx ()
  49. [(_ . args)
  50. (let ([result (local-expand (syntax/loc stx (orig-name . args)) (syntax-local-context) null)])
  51. (rewrite result tbl from-list))])))]))
  52. (provide define-rewriter)
  53. #;(define-syntax-rule (m x) (+ x 7))
  54. #;(define-rewriter m n [+ -])
  55. #;(n 77)