diff --git a/collects/drracket/private/drsig.rkt b/collects/drracket/private/drsig.rkt index 0a700f6a20..06291cc64a 100644 --- a/collects/drracket/private/drsig.rkt +++ b/collects/drracket/private/drsig.rkt @@ -190,7 +190,10 @@ get-definitions-text get-interactions-canvas get-definitions-canvas - get-unit-frame)) + get-unit-frame + + allow-re-extension! + disallow-re-extension!)) (define-signature drracket:unit-cm^ (tab% diff --git a/collects/drracket/private/get-extend.rkt b/collects/drracket/private/get-extend.rkt index 63a3c82903..165c5a1010 100644 --- a/collects/drracket/private/get-extend.rkt +++ b/collects/drracket/private/get-extend.rkt @@ -13,6 +13,10 @@ [prefix drracket:module-language-tools: drracket:module-language-tools^]) (export drracket:get/extend^) +(define re-extension-allowed? #f) +(define (allow-re-extension!) (set! re-extension-allowed? #t)) +(define (disallow-re-extension!) (set! re-extension-allowed? #f)) + (define make-extender (λ (get-base% name [final-mixin values]) (let ([extensions (λ (x) x)] @@ -27,22 +31,26 @@ new% (error 'extend-% "expected output of extension to create a subclass of its input, got: ~a" new%)))))]) + (define (add-extender extension [before? #t]) + (when built-yet? + (cond + [re-extension-allowed? + (set! built-yet? #f)] + [else + (error 'extender "cannot build a new extension of ~a after initialization" + name)])) + (set! extensions + (if before? + (compose (verify extension) extensions) + (compose extensions (verify extension))))) + (define (get-built) + (unless built-yet? + (set! built-yet? #t) + (set! built (final-mixin (extensions (get-base%))))) + built) (values - (letrec ([add-extender - (λ (extension [before? #t]) - (when built-yet? - (error 'extender "cannot build a new extension of ~a after initialization" - name)) - (set! extensions - (if before? - (compose (verify extension) extensions) - (compose extensions (verify extension)))))]) - add-extender) - (λ () - (unless built-yet? - (set! built-yet? #t) - (set! built (final-mixin (extensions (get-base%))))) - built))))) + (procedure-rename add-extender (string->symbol (format "extend-~a" name))) + (procedure-rename get-built (string->symbol (format "get-~a" name))))))) (define (get-base-tab%) (drracket:module-language:module-language-online-expand-tab-mixin diff --git a/collects/drracket/tool-lib.rkt b/collects/drracket/tool-lib.rkt index f5f4d0ff40..a5cb650e07 100644 --- a/collects/drracket/tool-lib.rkt +++ b/collects/drracket/tool-lib.rkt @@ -969,6 +969,7 @@ all of the names in the tools library, for use defining keybindings ; ;;;; + (proc-doc/names drracket:get/extend:extend-tab (->* ((make-mixin-contract drracket:unit:tab<%>)) @@ -1002,7 +1003,9 @@ all of the names in the tools library, for use defining keybindings @{Once this function is called, @racket[drracket:get/extend:extend-interactions-text] - raises an error, disallowing any more extensions.}) + raises an error, disallowing any more extensions. + + See also @racket[drracket:get/extend:allow-re-extension!].}) (proc-doc/names drracket:get/extend:extend-definitions-text @@ -1014,7 +1017,9 @@ all of the names in the tools library, for use defining keybindings @{This text is used in the top window of DrRacket frames. The @racket[before] argument controls if the mixin is applied before or - after already installed mixins.}) + after already installed mixins. + + See also @racket[drracket:get/extend:allow-re-extension!].}) (proc-doc/names drracket:get/extend:get-definitions-text @@ -1023,7 +1028,9 @@ all of the names in the tools library, for use defining keybindings @{Once this function is called, @racket[drracket:get/extend:extend-definitions-text] - raises an error, disallowing any more extensions.}) + raises an error, disallowing any more extensions. + + See also @racket[drracket:get/extend:allow-re-extension!].}) (proc-doc/names drracket:get/extend:extend-interactions-canvas @@ -1044,7 +1051,9 @@ all of the names in the tools library, for use defining keybindings @{Once this function is called, @racket[drracket:get/extend:extend-interactions-canvas] - raises an error, disallowing any more extensions.}) + raises an error, disallowing any more extensions. + + See also @racket[drracket:get/extend:allow-re-extension!].}) (proc-doc/names drracket:get/extend:extend-definitions-canvas @@ -1056,7 +1065,9 @@ all of the names in the tools library, for use defining keybindings @{This canvas is used in the top window of DrRacket frames. The @racket[before] argument controls if the mixin is applied before or - after already installed mixins.}) + after already installed mixins. + + See also @racket[drracket:get/extend:allow-re-extension!].}) (proc-doc/names drracket:get/extend:get-definitions-canvas @@ -1065,7 +1076,9 @@ all of the names in the tools library, for use defining keybindings @{Once this function is called, @racket[drracket:get/extend:extend-definitions-canvas] - raises an error, disallowing any more extensions.}) + raises an error, disallowing any more extensions. + + See also @racket[drracket:get/extend:allow-re-extension!].}) (proc-doc/names drracket:get/extend:extend-unit-frame @@ -1077,7 +1090,9 @@ all of the names in the tools library, for use defining keybindings @{This is the frame that implements the main DrRacket window. The argument, @racket[before], controls if the mixin is applied before or - after already installed mixins.}) + after already installed mixins. + + See also @racket[drracket:get/extend:allow-re-extension!].}) (proc-doc/names drracket:get/extend:get-unit-frame @@ -1086,9 +1101,24 @@ all of the names in the tools library, for use defining keybindings @{Once this function is called, @racket[drracket:get/extend:extend-unit-frame] - raises an error, disallowing any more extensions.}) + raises an error, disallowing any more extensions. + + See also @racket[drracket:get/extend:allow-re-extension!].}) + (proc-doc/names + drracket:get/extend:disallow-re-extension! + (-> void?) + () + @{Once this is called, re-extension of the mixins described in this + section is not allowed. This is the default state of mixin extension, + but it can be changed by @racket[drracket:get/extend:allow-re-extension!].}) + (proc-doc/names + drracket:get/extend:allow-re-extension! + (-> void?) + () + @{Once this is called, re-extension of the mixins described in this + section are now allowed.}) ; ;