Esta é uma pergunta de acompanhamento desta resposta de QA . Eu uso o Racket v8.16.
Para doc1 :compile_time_instantiation.rkt
(module compile-time-number racket/base
(require (for-syntax racket/base))
(begin-for-syntax
(printf "picked ~a\n" (random)))
(printf "running\n"))
Então:
$ racket -i -e '(dynamic-require "compile_time_instantiation.rkt" #f)'
Welcome to Racket v8.16 [cs].
picked 0.015421409441077423
running
$ racket -i -e '(require "compile_time_instantiation.rkt")'
Welcome to Racket v8.16 [cs].
picked 0.14007121863188537
running
picked 0.7200261945290138
$ racket -i
Welcome to Racket v8.16 [cs].
> (require "compile_time_instantiation.rkt")
picked 0.7451208846143317
running
$ racket compile_time_instantiation.rkt
picked 0.9883107842338839
running
doc1 diz:
Enquanto isso, dynamic-require apenas instancia um módulo; ele não visita o módulo . Essa simplificação é o motivo pelo qual alguns dos exemplos anteriores usam dynamic-require em vez de require .
Quando um módulo é instanciado, as expressões de tempo de execução em seu corpo são avaliadas .
Então o extra "picked ..." no 2º comando é da visita extra de require
beyond quando da expansão:
Quando um módulo é visitado, as expressões de tempo de compilação (como a definição de macro) em seu corpo são avaliadas.
À medida que um módulo é expandido , ele é visitado .
As expressões de tempo de compilação de um módulo que são avaliadas pela visita incluem os lados direitos dos formulários define-syntax e o corpo dos formulários begin-for-syntax .
Mas por que o 3º não tem isso?