;; van Tonder explicit renaming library.
;; Nonstandard explicit renaming library:
;; See also examples and discussion in file examples.scm.
;;
;; Exports:
;;
;; er-transformer (syntax)
;; bound-identifier=? (procedure)
;; datum->syntax (procedure)
;;
;; Differences with traditional explicit renaming:
;;
;; - The renaming procedure has signature <symbol> -> <identifier>,
;; where the <identifier> type is disjoint from the <symbol> type.
;;
;; - The renaming procedure acts as a mathematical function in the sense that
;; the identifiers obtained from any two calls with the same argument will
;; be the same in the sense of bound-identifier=?, not eqv?
;;
;; - The output may not contain raw symbols, so implicit identifiers must
;; be introduced using datum->syntax.
;;
;; - Breaking hygiene with datum->syntax allows more modular macro
;; programming than traditional explicit renaming.
;; See in particular the example of while in terms of loop below.
;;
;; - The renaming procedure is aware of the transformer environment,
;; so that identifiers not bound at the usage site will resolve to
;; the r6rs library-local bindings at the transformer site.
;; More precisely, they will be resolved in the lexical environment
;; of the er-transformer keyword.
;;
;; - Fully compatible with my r6rs syntax-case macro system.
;;
;; Portability and complexity note:
;;
;; This library is not r6rs-portable, since it assumes that the input
;; to a transformer is always an unwrapped syntax object, which is
;; allowed but not required by r6rs, and is currently only true for my
;; implementation. The library could be ported to other implementations
;; by inserting a step that unwrapped the input to the transformer.
;; However, that would adversely modify the complexity class of
;; er-transformer macros in those implementations.
(library (explicit-renaminghelper)
(exporter-transformer)
(import (only (rnrs)
define-syntaxlambdasyntax-casesyntaxdatum->syntaxfree-identifier=?))
(define-syntaxer-transformer
(lambda (exp)
(syntax-caseexp ()
((kproc)
(syntax
(lambda (form)
(procform
(lambda (symbol) (datum->syntax (syntaxk) symbol))
free-identifier=?))))))))
(library (explicit-renaming)
(exporter-transformeridentifier?bound-identifier=?datum->syntax)
(import (explicit-renaminghelper)
(rnrssyntax-case)))