Я пытаюсь создать небольшой плагин drracket, который при запуске печатает текстовый эталонный объект определений на консоли.
Код, который у меня есть на данный момент:
#lang racket/unit
(require drracket/tool)
(import drracket:tool^)
(export drracket:tool-exports^)
(define (phase1) (void))
(define (phase2)
(define def (drracket:get/extend:get-definitions-text))
(writeln def))
Однако, когда я устанавливаю этот плагин и запускаю DrRacket, я получаю следующую ошибку (полное сообщение внизу поста):
phase2: can only be called in phase: 'init-complete
Что имеет смысл.Глядя на документы для drracket:get/extend:extend-unit-frame
, который используется drracket:get/extend:get-definitions-text
скажем:
Как только эта функция вызвана, drracket: get / extend: extend-unit-frame выдает ошибку, запрещая любыебольше расширений.
Итак, я предполагаю, что phase2
недостаточно поздно, чтобы предположить, что все остальные плагины инициализированы.К сожалению, нет никаких точек вставки, где я мог бы запустить код позже, чем phase2
.(Если, например, я просто поместил его в тело устройства, он будет работать до phase1
или phase2
.)
Итак, где находится подходящее место для запуска drracket:get/extend:get-definitions-text
?
Полное сообщение об ошибке:
Error in phase 2 for tool #<path:/Users/leif/test/dplugpkg/tool.rkt>; #f
phase2: can only be called in phase: 'init-complete
context...:
/Users/leif/rsrc/drracket/drracket/drracket/private/unit.rkt:528:6: get-definitions-text%
/Users/leif/rsrc/drracket/drracket/drracket/private/get-extend.rkt:119:0: get-base-definitions-text%
/Users/leif/rsrc/drracket/drracket/drracket/private/get-extend.rkt:69:2: get-built
/Users/leif/racket/racket/collects/racket/contract/private/arrow-higher-order.rkt:361:33
/Users/leif/test/dplugpkg/tool.rkt:20:0: phase2
.../more-scheme.rkt:261:28
[repeats 23 more times]
/Users/leif/rsrc/drracket/drracket/drracket/private/tools.rkt:432:0: run-phases
.../racket/unit.rkt:998:20
"/Users/leif/rsrc/drracket/drracket/drracket/tool-lib.rkt": [running body]
temp37_0
for-loop
run-module-instance!125
"/Users/leif/rsrc/drracket/drracket/drracket/private/drracket-normal.rkt": [running body]
temp37_0
for-loop
...
instantiate: contract violation
expected: class?
given: #f
context...:
/Users/leif/rsrc/drracket/drracket/drracket/private/unit.rkt:1402:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/rsrc/drracket/drracket/drracket/private/module-language.rkt:1578:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/rsrc/drracket/drracket/drracket/private/debug.rkt:1907:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
[repeats 2 more times]
/Users/leif/rsrc/drracket/drracket/drracket/private/module-language-tools.rkt:88:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/rsrc/drracket/drracket/drracket/private/syncheck/gui.rkt:2035:6
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/Library/Racket/planet/300/development/cache/jowalsh/code-coverage.plt/1/4/tool.rkt:25:6
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
[repeats 1 more time]
/Users/leif/rsrc/drracket/drracket/gui-debugger/debug-tool.rkt:1156:6
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
...
leif@FATT ~/test/dplugpkg $ drracket
Error in phase 2 for tool #<path:/Users/leif/test/dplugpkg/tool.rkt>; #f
phase2: can only be called in phase: 'init-complete
context...:
/Users/leif/rsrc/drracket/drracket/drracket/private/unit.rkt:528:6: get-definitions-text%
/Users/leif/rsrc/drracket/drracket/drracket/private/get-extend.rkt:119:0: get-base-definitions-text%
/Users/leif/rsrc/drracket/drracket/drracket/private/get-extend.rkt:69:2: get-built
/Users/leif/racket/racket/collects/racket/contract/private/arrow-higher-order.rkt:361:33
/Users/leif/test/dplugpkg/tool.rkt:20:0: phase2
.../more-scheme.rkt:261:28
[repeats 23 more times]
/Users/leif/rsrc/drracket/drracket/drracket/private/tools.rkt:432:0: run-phases
.../racket/unit.rkt:998:20
"/Users/leif/rsrc/drracket/drracket/drracket/tool-lib.rkt": [running body]
temp37_0
for-loop
run-module-instance!125
"/Users/leif/rsrc/drracket/drracket/drracket/private/drracket-normal.rkt": [running body]
temp37_0
for-loop
...
instantiate: contract violation
expected: class?
given: #f
context...:
/Users/leif/rsrc/drracket/drracket/drracket/private/unit.rkt:1402:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/rsrc/drracket/drracket/drracket/private/module-language.rkt:1578:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/rsrc/drracket/drracket/drracket/private/debug.rkt:1907:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
[repeats 2 more times]
/Users/leif/rsrc/drracket/drracket/drracket/private/module-language-tools.rkt:88:4
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/rsrc/drracket/drracket/drracket/private/syncheck/gui.rkt:2035:6
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
/Users/leif/Library/Racket/planet/300/development/cache/jowalsh/code-coverage.plt/1/4/tool.rkt:25:6
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
[repeats 1 more time]
/Users/leif/rsrc/drracket/drracket/gui-debugger/debug-tool.rkt:1156:6
/Users/leif/racket/racket/collects/racket/private/class-internal.rkt:3554:0: continue-make-object
...