(and (or (eq? old new) (not replace2)) old) (and replace2 new)))) (define (warn-override-core module name int1 val1 int2 val2 var val) (and (eq? int1 the-scm-module) (begin (format (current-warning-port) "WARNING: ~A: imported module ~A overrides core binding `~A'\n" (module-name module) (module-name int2) name) (module-variable int2 name)))) (define (first module name int1 val1 int2 val2 var val) (or var (module-variable int1 name))) (define (last module name int1 val1 int2 val2 var val) (module-variable int2 name)) (define (noop module name int1 val1 int2 val2 var val) #f) (set-module-name! m 'duplicate-handlers) (set-module-kind! m 'interface) (module-define! m 'check check) (module-define! m 'warn warn) (module-define! m 'replace replace) (module-define! m 'warn-override-core warn-override-core) (module-define! m 'first first) (module-define! m 'last last) (module-define! m 'merge-generics noop) (module-define! m 'merge-accessors noop) m)) (define (lookup-duplicates-handlers handler-names) (and handler-names (map (lambda (handler-name) (or (module-symbol-local-binding duplicate-handlers handler-name #f) (error "invalid duplicate handler name:" handler-name))) (if (list? handler-names) handler-names (list handler-names))))) (define default-duplicate-binding-procedures (case-lambda (() (or (module-duplicates-handlers (current-module)) ;; Note: If you change this default, change it also in ;; `define-module*'. (lookup-duplicates-handlers '(replace warn-override-core warn last)))) ((procs) (set-module-duplicates-handlers! (current-module) procs)))) (define default-duplicate-binding-handler (case-lambda (() (map procedure-name (default-duplicate-binding-procedures))) ((handlers) (default-duplicate-binding-procedures (lookup-duplicates-handlers handlers)))))