대화형 모듈 로딩(Interactive Module Loading)
대화형 모듈 로딩(Interactive Module Loading)
REPL에서 모듈을 로드하고 다시 로드하며 바로 사용하고 싶을 때가 있어요. racket/enter와 racket/rerequire가 이런 대화형 작업을 돕습니다.
출처: Racket Reference
본문
racket/rerequire와 racket/enter 라이브러리는 모듈을 로드하고, 다시 로드하며, 사용하는 기능을 지원합니다.
모듈 진입(Entering Modules)
(require racket/enter) ; package: base
이 절에서 문서화하는 바인딩은 racket/enter와 racket/init 라이브러리가 제공합니다. 즉, Racket 실행 파일이 명령줄 인자 없이 시작될 때 사용할 수 있습니다. racket/base나 racket이 제공하지는 않습니다.
enter!
syntax
(enter! module-path)
(enter! #f)
(enter! module-path flag ...+)
flag = #:quiet
| #:verbose-reload
| #:verbose
| #:dont-re-require-enter
REPL에서 쓰기 위한 것입니다. 예를 들어 racket이 대화형 모드로 시작되었을 때입니다. module-path가 주어지면(require와 같은 의미로), 해당 모듈이 dynamic-rerequire를 통해 로드되거나 호출되고, module->namespace를 통해 현재 네임스페이스가 모듈의 본문으로 바뀝니다. #f가 주어지면 현재 네임스페이스가 원래 것으로 복원됩니다.
추가 플래그로 enter!의 측면을 커스터마이즈할 수 있습니다:
#:verbose,#:verbose-reload,#:quiet플래그는 각각dynamic-rerequire의'all,'reload,'none상세도(verbosity)에 대응합니다. 기본값은#:verbose-reload에 해당합니다.
네임스페이스를 지정된 모듈로 전환한 뒤, enter!는 네임스페이스에 racket/enter를 자동으로 require해서 enter!로 다시 네임스페이스를 전환할 수 있게 합니다. 어떤 경우에는 racket/enter를 require하는 것이 바람직하지 않을 수 있습니다(예: racket/enter를 사용하는 도구). 그런 경우 #:dont-re-require-enter 플래그로 그 require를 비활성화하세요.
dynamic-enter!
procedure
(dynamic-enter! mod
[#:verbosity verbosity
#:re-require-enter? re-require-enter?]) → void?
mod : (or/c module-path? #f)
verbosity : (or/c 'all 'reload 'none) = 'reload
re-require-enter? : any/c = #t
enter!의 프로시저 변형입니다. verbosity는 dynamic-rerequire로 전달되고, re-require-enter?는 dynamic-enter!가 새로 진입한 네임스페이스에 racket/enter를 require할지 결정합니다.
package base의 6.0.0.1 버전에서 추가되었습니다.
모듈 로딩·재로딩(Loading and Reloading Modules)
(require racket/rerequire) ; package: base
이 절에서 문서화하는 바인딩은 racket/base나 racket이 아니라 racket/rerequire 라이브러리가 제공합니다.
dynamic-rerequire
procedure
(dynamic-rerequire module-path
[#:verbosity verbosity]) → (listof path?)
module-path : module-path?
verbosity : (or/c 'all 'reload 'none) = 'reload
(dynamic-require module-path 0)과 같지만 재로딩(reloading)을 지원합니다. dynamic-rerequire 함수는 대화형 환경에서, 특히 enter!를 통해 사용하기 위한 것입니다.
module-path를 호출하는 데 파일 로딩이 필요하면 파일들의 수정 날짜가 기록됩니다. 파일이 수정되면 이후의 dynamic-rerequire가 모듈을 소스에서 다시 로드합니다. Module Redeclarations도 함께 보세요. 마찬가지로 이후의 dynamic-rerequire가 수정된 모듈을 전이적으로 require하면 그 require된 모듈도 다시 로드됩니다. 재로딩 지원은 dynamic-rerequire를 통해 (직접 또는 전이적 require를 통한 간접적으로) 처음 로드된 모듈에서만 동작합니다.
반환된 리스트는 이 dynamic-rerequire 호출에서 다시 로드된 모듈들의 절대 경로를 담고 있습니다. 반환된 리스트가 비어 있으면 변경되거나 로드된 모듈이 없다는 뜻입니다.
enter!가 파일에서 모듈을 로드하거나 다시 로드할 때 verbosity에 따라 (current-error-port)에 메시지를 출력할 수 있습니다: 'all은 모든 로드·재로드에 대해 메시지를 출력하고, 'reload는 재로드된 모듈에 대해서만 출력하며, 'none은 출력을 비활성화합니다.