lib/ubik/explicit-renaming.ss
;; 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-renaming helper)
   (export er-transformer)
   (import (only (rnrs) 
             define-syntax lambda syntax-case syntax datum->syntax free-identifier=?))
           
   (define-syntax er-transformer
     (lambda (exp)
       (syntax-case exp ()
         ((k proc)
          (syntax
           (lambda (form)
             (proc form
                   (lambda (symbol) (datum->syntax (syntax k) symbol))
                   free-identifier=?))))))))
 
 (library (explicit-renaming)
   (export er-transformer identifier? bound-identifier=? datum->syntax)
   (import (explicit-renaming helper)
           (rnrs syntax-case)))