From bb83bbd13263aca6a1e8b246fd68ce96f5dcdb43 Mon Sep 17 00:00:00 2001 From: Julian Graham Date: Thu, 10 Dec 2009 00:29:11 -0500 Subject: [PATCH 1/2] Support for renaming bindings on module export. * module/ice-9/boot-9.scm (module-export!, module-replace!, module-re-export!): Allow members of export list to be pairs, mapping internal names to external ones. * doc/ref/api-modules.texi (Creating Guile Modules): Update documentation for `#:export', `#:export-syntax', `#:replace', `#:re-export', `#:re-export-syntax', `export', and `re-export' to reflect new format for arguments. --- doc/ref/api-modules.texi | 50 +++++++++++++++++++++++++-------------------- module/ice-9/boot-9.scm | 24 +++++++++++++-------- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/doc/ref/api-modules.texi b/doc/ref/api-modules.texi index 1c9ab23..65a3564 100644 --- a/doc/ref/api-modules.texi +++ b/doc/ref/api-modules.texi @@ -421,40 +421,42 @@ the module is used. @item #:export @var{list} @cindex export -Export all identifiers in @var{list} which must be a list of symbols. -This is equivalent to @code{(export @var{list})} in the module body. +Export all identifiers in @var{list} which must be a list of symbols +or pairs of symbols. This is equivalent to @code{(export @var{list})} +in the module body. @item #:re-export @var{list} @cindex re-export Re-export all identifiers in @var{list} which must be a list of -symbols. The symbols in @var{list} must be imported by the current -module from other modules. This is equivalent to @code{re-export} -below. +symbols or pairs of symbols. The symbols in @var{list} must be +imported by the current module from other modules. This is equivalent +to @code{re-export} below. @item #:export-syntax @var{list} @cindex export-syntax -Export all identifiers in @var{list} which must be a list of symbols. -The identifiers in @var{list} must refer to macros (@pxref{Macros}) -defined in the current module. This is equivalent to address@hidden(export-syntax @var{list})} in the module body. +Export all identifiers in @var{list} which must be a list of symbols +or pairs of symbols. The identifiers in @var{list} must refer to +macros (@pxref{Macros}) defined in the current module. This is +equivalent to @code{(export-syntax @var{list})} in the module body. @item #:re-export-syntax @var{list} @cindex re-export-syntax Re-export all identifiers in @var{list} which must be a list of -symbols. The symbols in @var{list} must refer to macros imported by -the current module from other modules. This is equivalent to address@hidden(re-export-syntax @var{list})} in the module body. +symbols or pairs of symbols. The symbols in @var{list} must refer to +macros imported by the current module from other modules. This is +equivalent to @code{(re-export-syntax @var{list})} in the module body. @item #:replace @var{list} @cindex replace @cindex replacing binding @cindex overriding binding @cindex duplicate binding -Export all identifiers in @var{list} (a list of symbols) and mark them -as @dfn{replacing bindings}. In the module user's name space, this -will have the effect of replacing any binding with the same name that -is not also ``replacing''. Normally a replacement results in an -``override'' warning message, @code{#:replace} avoids that. +Export all identifiers in @var{list} (a list of symbols or pairs of +symbols) and mark them as @dfn{replacing bindings}. In the module +user's name space, this will have the effect of replacing any binding +with the same name that is not also ``replacing''. Normally a +replacement results in an ``override'' warning message, address@hidden:replace} avoids that. This is useful for modules that export bindings that have the same name as core bindings. @code{#:replace}, in a sense, lets Guile know @@ -562,8 +564,11 @@ do not know anything about dangerous procedures. @c end @deffn syntax export variable @dots{} -Add all @var{variable}s (which must be symbols) to the list of exported -bindings of the current module. +Add all @var{variable}s (which must be symbols or pairs of symbols) to +the list of exported bindings of the current module. If @var{variable} +is a pair, its @code{car} gives the name of the variable as seen by the +current module and its @code{cdr} specifies a name for the binding in +the current module's public interface. @end deffn @c begin (scm-doc-string "boot-9.scm" "define-public") @@ -573,9 +578,10 @@ Equivalent to @code{(begin (define foo ...) (export foo))}. @c end @deffn syntax re-export variable @dots{} -Add all @var{variable}s (which must be symbols) to the list of -re-exported bindings of the current module. Re-exported bindings must -be imported by the current module from some other module. +Add all @var{variable}s (which must be symbols or pairs of symbols) to +the list of re-exported bindings of the current module. Pairs of +symbols are handled as in @code{export}. Re-exported bindings must be +imported by the current module from some other module. @end deffn @node Module System Reflection diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index 20da580..7bde50f 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -2968,16 +2968,20 @@ module '(ice-9 q) '(make-q q-length))}." (define (module-export! m names) (let ((public-i (module-public-interface m))) (for-each (lambda (name) - (let ((var (module-ensure-local-variable! m name))) - (module-add! public-i name var))) + (let* ((internal-name (if (pair? name) (car name) name)) + (external-name (if (pair? name) (cdr name) name)) + (var (module-ensure-local-variable! m internal-name))) + (module-add! public-i external-name var))) names))) (define (module-replace! m names) (let ((public-i (module-public-interface m))) (for-each (lambda (name) - (let ((var (module-ensure-local-variable! m name))) + (let* ((internal-name (if (pair? name) (car name) name)) + (external-name (if (pair? name) (cdr name) name)) + (var (module-ensure-local-variable! m internal-name))) (set-object-property! var 'replace #t) - (module-add! public-i name var))) + (module-add! public-i external-name var))) names))) ;; Re-export a imported variable @@ -2985,13 +2989,15 @@ module '(ice-9 q) '(make-q q-length))}." (define (module-re-export! m names) (let ((public-i (module-public-interface m))) (for-each (lambda (name) - (let ((var (module-variable m name))) + (let* ((internal-name (if (pair? name) (car name) name)) + (external-name (if (pair? name) (cdr name) name)) + (var (module-variable m internal-name))) (cond ((not var) - (error "Undefined variable:" name)) - ((eq? var (module-local-variable m name)) - (error "re-exporting local variable:" name)) + (error "Undefined variable:" internal-name)) + ((eq? var (module-local-variable m internal-name)) + (error "re-exporting local variable:" internal-name)) (else - (module-add! public-i name var))))) + (module-add! public-i external-name var))))) names))) (defmacro export names -- 1.6.3.3