대화형 모듈 로딩(Interactive Module Loading)

대화형 모듈 로딩(Interactive Module Loading)

REPL에서 모듈을 로드하고 다시 로드하며 바로 사용하고 싶을 때가 있어요. racket/enterracket/rerequire가 이런 대화형 작업을 돕습니다.

출처: Racket Reference

본문

racket/rerequireracket/enter 라이브러리는 모듈을 로드하고, 다시 로드하며, 사용하는 기능을 지원합니다.

모듈 진입(Entering Modules)

(require racket/enter)    ; package: base

이 절에서 문서화하는 바인딩은 racket/enterracket/init 라이브러리가 제공합니다. 즉, Racket 실행 파일이 명령줄 인자 없이 시작될 때 사용할 수 있습니다. racket/baseracket이 제공하지는 않습니다.

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!의 프로시저 변형입니다. verbositydynamic-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/baseracket이 아니라 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은 출력을 비활성화합니다.

더 알아보기