Запускайте тело плагина DrRacket только после инициализации всех плагинов, ошибка: phase2: вызывается только в фазе: 'init-complete - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь создать небольшой плагин 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
   ...

1 Ответ

0 голосов
/ 20 ноября 2018

И phase1, и phase2, безусловно, слишком рано, чтобы использовать drracket:get/extend:get-definitions-text.Вы можете однако вставить свой собственный хук, который будет запускаться при создании нового текстового объекта определения.Вы делаете это с соответствующим именем drracket:get/extend:extend-definitions-text, которое принимает mixin (функция типа Class -> Class).Помещая вызов в тело класса, вы можете гарантировать, что будут созданы не только все плагины, но и что он будет вызываться для каждого нового определения текста, который делает DrRacket.Ваш код будет выглядеть примерно так:

(define (def-mixin super%)
  (class super%
    (super-new)
    (define the-def-text
      (drracket:get/extend:get-definitions-text))
    (writeln the-def-text)))

Конечно, к этому моменту это ссылка на собственный класс этого миксина, и поэтому использование this% вместо этого создает идентичный плагин:

(define (def-mixin super%)
  (class super%
    (super-new)
    (define the-def-text this%)
    (writeln the-def-text)))

(drracket:get/extend:extend-definitions-text def-mixin)

Собрав все воедино, вы получите:

#lang racket/unit
(require drracket/tool)
(import drracket:tool^)
(export drracket:tool-exports^)

(define (def-mixin super%)
  (class super%
    (super-new)
    (writeln this%)))

(define (phase1) (void))
(define (phase2) (void))
(drracket:get/extend:extend-definitions-text def-mixin)
...