Racket 또는 GRacket 실행하기
Racket 또는 GRacket 실행하기 (Running Racket or GRacket)
Racket 코어 런타임 시스템은 Racket과 GRacket 두 가지 주요 변형으로 제공돼요. 시작 시 초기화 과정, 명령줄 플래그, 초기화 라이브러리, 그리고 언어 실행·확장 구성 방법을 설명해요.
출처: Racket Reference
본문
18.1 Racket 또는 GRacket 실행하기
Racket 코어 런타임 시스템은 두 가지 주요 변형으로 제공돼요.
- Racket:
racket/base가 구현되는 기반이 되는 프리미티브 라이브러리를 제공해요. 유닉스와 Mac OS에서 실행 파일은 racket이라고 불러요. Windows에서는 실행 파일을 Racket.exe라고 불러요. - GRacket: 시스템이 구분하는 한도에서 GUI 변형인 racket이에요. 유닉스에서 실행 파일은 gracket이라고 불리며, 단일 인스턴스 플래그와 X11 관련 플래그가 특별히 처리되고
racket/gui/base라이브러리로 특별히 전달돼요. Windows에서는 실행 파일이 GRacket.exe이고, 단일 인스턴스 지원을 구현하는 (콘솔 애플리케이션이 아닌) GUI 애플리케이션이에요. Mac OS에서 gracket 스크립트는 GRacket.app을 실행해요.
18.1.1 초기화 (Initialization)
시작 시 최상위 환경에는 바인딩이 하나도 없어요—함수 적용을 위한 #%app조차도 없어요. #%로 시작하는 이름의 프리미티브 모듈은 정의되어 있지만 직접 사용하기 위한 것이 아니며, 그런 모듈의 집합은 바뀔 수 있어요. 예를 들어 #%kernel 모듈은 결국 racket/base 구현을 부트스트랩하는 데 사용돼요.
Racket 또는 GRacket의 첫 동작은 current-library-collection-paths를 (find-library-collection-paths pre-extras extras)의 결과로 초기화하는 거예요. 여기서 pre-extras는 보통 null이고 extras는 명령줄에서 -S/--search로 순서대로 제공된 추가 디렉터리 경로들이에요. Racket 또는 GRacket 실행 파일에서 만든 실행 파일은 pre-extras로 사용되는 경로를 내장할 수 있어요.
Racket과 GRacket은 다음으로 각각 racket/init과 racket/gui/init을 require하는데, 명령줄이 어떤 eval, load, 또는 read-eval-print-loop 플래그(-e/--eval, -f/--load, -r/--script, -m/--main, 또는 -i/--repl)보다 앞에 require 플래그(-t/--require, -l/--lib, 또는 -u/--require-script)를 지정하지 않는 경우에만 그래요. 초기화 라이브러리는 -I 구성 옵션으로 바꿀 수 있어요. 초기화 라이브러리의 configure-runtime 서브모듈이나 초기화 라이브러리 언어의 configure-runtime 속성이, 라이브러리가 인스턴스화되기 전에 사용돼요. 언어 실행 시 구성(Language Run-Time Configuration)을 보세요.
초기화 모듈을 잠재적으로 로드한 뒤, 표현식 eval들, 파일 load들, 모듈 require들이 명령줄에 제공된 순서대로 실행돼요. 어떤 것이든 잡히지 않은 예외를 발생시키면 나머지 eval, load, require는 건너뛰어져요. 첫 require가 어떤 eval이나 load보다 앞에 있어 초기화 라이브러리가 건너뛰어지면, 요구된 모듈의 configure-runtime 서브모듈이나 요구된 모듈의 라이브러리 언어의 configure-runtime 속성이, 모듈이 인스턴스화되기 전에 사용돼요. 언어 실행 시 구성을 보세요.
모든 명령줄 표현식, 파일, 모듈을 실행한 뒤, Racket이나 GRacket은 구성 옵션 외에 명령줄 플래그가 제공되지 않으면 대화형 평가를 위한 read-eval-print 루프를 시작해요. Racket의 경우 racket/repl의 read-eval-print-loop를 호출해 read-eval-print 루프를 실행해요. GRacket의 경우 racket/gui/base의 graphical-read-eval-print-loop를 호출해 read-eval-print 루프를 실행해요. 구성 옵션이 아닌 어떤 명령줄 인자든 제공되면 read-eval-print 루프가 시작되지 않는데, 명령줄에 -i/--repl 플래그가 제공되어 명시적으로 다시 활성화하지 않는 한 그래요.
또한 read-eval-print 루프가 시작되기 직전에 Racket은 racket/interactive를, GRacket은 racket/gui/interactive를 실행해요. 설치의 "config.rktd" 파일((find-config-dir)에서 찾음)에서 다른 대화형 파일을 지정하거나, (find-system-path 'addon-dir)에서 "interactive.rkt" 파일을 찾지 않는 한 그래요. 명령줄에 -q/--no-init-file 플래그가 지정되면 어떤 대화형 파일도 실행되지 않아요.
마지막으로 Racket이나 GRacket이 종료되기 전에, -V/--no-yield 명령줄 플래그가 지정되지 않았다면 executable-yield-handler의 현재 값인 프로시저를 메인 스레드에서 호출해요. racket/gui/base를 require하면 이 파라미터가 (racket 'yield) 호출로 설정돼요.
package base 6.7에서 변경: (find-system-path 'init-file)을 직접 실행하는 대신 racket/interactive 파일을 실행함.
6.90.0.30에서 변경: racket/base나 racket/gui/init 대신 racket/repl이나 racket/gui/base를 사용해 read-eval-print 루프를 실행함.
18.1.2 종료 상태 (Exit Status)
Racket 또는 GRacket 프로세스의 기본 종료 상태는, 명령줄 eval(-e 등), load(-f, -r 등), 또는 require(-l, -t 등) 중에 오류가 발생하면(더 일반적으로는 그 평가를 둘러싼 프롬프트의 abort 핸들러가 호출되면) 0이 아니지만, read-eval-print 루프가 시작되지 않을 때만 그래요. 그 외에는 기본 종료 상태가 0이에요.
모든 경우에 (기본 종료 핸들러가 설치되어 있을 때) exit 호출은 특정 상태 값으로 프로세스를 끝낼 수 있어요.
18.1.3 초기화 라이브러리 (Init Libraries)
(require racket/init) package: base
racket/init 라이브러리는 Racket의 기본 시작 라이브러리예요. racket, racket/enter, racket/help 라이브러리를 다시 내보내고, current-print가 pretty-print를 사용하도록 설정해요.
(require racket/interactive) package: base
racket/interactive는 REPL이 시작될 때의 기본 시작 라이브러리예요. -q/--no-init-file이 지정되면 실행되지 않아요. 대화형 파일은 (find-config-dir)에서 찾은 "config.rktd" 파일의 interactive-file을 수정해 바꿀 수 있어요. 대안으로, (find-system-path 'addon-dir)에 "interactive.rkt" 파일이 존재하면 설치 전체 대화형 모듈 대신 그것이 실행돼요. 기본 대화형 모듈은 xrepl을 시작하고 사용자 홈 디렉터리의 (find-system-path 'init-file) 파일을 실행해요. 다른 대화형 파일은 racket/interactive를 require해 이 동작을 유지할 수 있어요.
package base 6.7에서 추가.
(require racket/language-info) package: base
racket/language-info 라이브러리는 어떤 값이든 받아 다른 함수를 반환하는 get-info 함수를 제공해요. 반환된 함수는 키 값과 기본 값을 받고, 키가 'configure-runtime이면 #(racket/runtime-config configure #f), 그렇지 않으면 기본 값을 반환해요.
Racket 가이드의 모듈 처리 구성(Module-Handling Configuration)도 함께 보세요.
벡터 #(racket/language-info get-info #f)는 모듈에 언어 정보로 붙여 racket/base 언어와 같은 언어 정보를 얻기에 적합해요.
(require racket/runtime-config) package: base
racket/runtime-config 라이브러리는 어떤 값이든 받아 print-as-expression을 #t로 설정하는 configure 함수를 제공해요.
벡터 #(racket/runtime-config configure #f)는 런타임 구성 명세 목록(모듈의 언어 정보 함수가 'configure-runtime 키에 대해 반환하는)의 구성원으로 적합하며, racket/base 언어와 같은 런타임 구성을 얻을 수 있어요.
18.1.4 명령줄 (Command Line)
Racket과 GRacket 실행 파일은 다음 명령줄 플래그를 인식해요.
- 파일 및 표현식 옵션:
-e ‹expr›또는--eval ‹expr›: ‹expr›을eval해요. 평가 결과는current-print로 출력돼요.-f ‹file›또는--load ‹file›: ‹file›을load해요. ‹file›이 "-"이면 표현식이 표준 입력에서 읽혀 평가돼요.-t ‹file›또는--require ‹file›: ‹file›을require하고, 가능하면(submod (file "‹file›") main)도require해요.-l ‹path›또는--lib ‹path›:(lib "‹path›")를require하고, 가능하면(submod (lib "‹path›") main)도require해요.-p ‹package›:(planet "‹package›")을require하고, 가능하면(submod (planet "‹package›") main)도require해요.-r ‹file›또는--script ‹file›: ‹file›을 스크립트로load해요. 이 플래그는 -f ‹file›에 프로그램 이름을 설정하는 -N ‹file›과 이후 모든 명령줄 원소를 비플래그 인자로 취급하게 하는 --가 더해진 것과 같아요. 이름에도 불구하고 --script는 보통 유닉스 스크립트용으로 사용되지 않아요. 스크립트에 대한 자세한 내용은 스크립트(Scripts)를 보세요.-u ‹file›또는--require-script ‹file›: ‹file›을 스크립트로require해요. 이 플래그는 -t ‹file›에 프로그램 이름을 설정하는 -N ‹file›과 이후 모든 명령줄 원소를 비플래그 인자로 취급하게 하는 --가 더해진 것과 같아요.-k ‹n› ‹m› ‹p›: 실행 파일에 내장된 코드를 파일 위치 ‹n›에서 ‹m›까지, ‹m›에서 ‹p›까지 로드해요. (Mac OS에서 ‹n›, ‹m›, ‹p›는 실행 파일의 __PLTSCHEME 세그먼트에 상대적이에요. Windows에서는 타입 257, ID 1인 리소스에 상대적이에요. ELF를 사용하는 유닉스에서는 실행 파일의 .rackprog 세그먼트에 상대적이에요.) 첫 범위는 모든 새 place에서 로드되고, 그 범위에서 선언된 모듈은module-predefined?의 의미에서 미리 정의된 것으로 간주돼요. 이 옵션은 보통 Racket 코드도 내장하는 독립 실행 바이너리에 내장돼요.-Y ‹file› ‹n› ‹m› ‹p›: -k ‹n› ‹m› ‹p›와 같지만, ‹file›에서(세그먼트나 리소스 오프셋 보정 없이) 읽어요.-m또는--main: 최상위 환경에 바인딩된main호출을 평가해요. 옵션으로 처리되지 않은 모든 명령줄 인자(current-command-line-arguments에 들어가는 인자)가main에 인자로 전달돼요. 호출 결과는current-print로 출력돼요.main호출은 표현식(main arg-str ...)으로 구성되며, 그 표현식의 어휘 문맥은#%app와#%datum바인딩을#%plain-app과#%datum으로 제공하지만,main의 어휘 문맥은 최상위 환경이에요.
- 상호작용 옵션:
-i또는--repl:(banner)를 보여주고(find-system-path 'init-file)을 로드한 뒤read-eval-print-loop(Racket) 또는graphical-read-eval-print-loop(GRacket)를 사용해 대화형 read-eval-print 루프를 실행해요. Racket의 경우(read-eval-print-loop)뒤에(newline)이 따라와요. GRacket은 -z/--text-repl 구성 옵션을 제공해graphical-read-eval-print-loop대신read-eval-print-loop(및newline)을 사용할 수 있어요.-n또는--no-lib: 달리 비활성화되지 않았을 때 초기화 라이브러리(즉racket/init또는racket/gui/init, -I 플래그로 바뀌지 않았다면) require를 건너뜀.-v또는--version:(banner)를 보여줌.-K또는--back: GRacket, Mac OS 전용; 애플리케이션을 백그라운드로 둠.-V--no-yield: 마지막executable-yield-handler동작을 건너뜀. 이 동작은racket/gui/base를 사용하는 프로그램에서 종료 전에 메인 이벤트스페이스의 모든 프레임이 닫힐 때까지 보통 기다려요. 역사적 이유로 이 플래그는 -v를 암시하는데, 이는 덜 유용하게 만들지만 -V 단독으로 -v처럼 동작한다는 뜻이에요.
- 구성 옵션:
-y또는--make: 초기 네임스페이스에서 로드된 모듈용 컴파일된 ".zo" 파일의 자동 생성과 갱신을 활성화해요. 구체적으로(make-compilation-manager-load/use-compiled-handler)의 결과가 다른 모듈 로딩 동작 전에 컴파일된 로드 핸들러로 설치돼요. 주의: 이 플래그는 대화형 환경에서 사용하기 위한 것이에요. 스크립트에서 사용하면 스크립트의 동시 호출이 컴파일된 파일 갱신을 시도하며 충돌하거나 파일시스템 권한 문제가 있을 수 있으므로 아마 나쁜 생각이에요. -c/--no-compiled는 -y/--make의 효과를 취소해요.-c또는--no-compiled:use-compiled-file-paths를null로 초기화해 컴파일된 ".zo" 파일 로딩을 비활성화해요. 현명하게 사용하세요: 이것은 모든 "compiled" 하위 디렉터리의 내용을 효과적으로 무시하므로, 사용된 모듈이(심지어racket/base와 그 의존성까지) 즉석에서 컴파일되어 엄청나게 비싼 실행 시간을 초래해요.-q또는--no-init-file: -i/--repl에 대해(find-system-path 'init-file)로딩을 건너뜀.-z또는--text-repl: GRacket 전용; -i/--repl이graphical-read-eval-print-loop대신textual-read-eval-print-loop를 사용하도록 변경함.-I ‹path›: 네임스페이스 초기화가 비활성화되지 않았다면, 네임스페이스를 초기화하기 위해 require할 경로로(lib "‹path›")을 설정해요. 이 플래그로 read-eval-print 루프와 다른 최상위 평가의 언어를 효과적으로 설정할 수 있어요.-X ‹dir›또는--collects ‹dir›:(find-system-path 'collects-dir)가 ‹dir›을 만들게 해 ‹dir›을 라이브러리 메인 컬렉션의 경로로 설정해요. ‹dir›이 빈 문자열이면(find-system-path 'collects-dir)는 "."을 반환하지만,current-library-collection-paths는 빈 리스트로,use-collection-link-paths는#f로 초기화돼요.-S ‹dir›또는--search ‹dir›: ‹dir›을 메인 컬렉션 디렉터리 뒤의 기본 라이브러리 컬렉션 검색 경로에 추가해요. -S/--dir 플래그가 여러 번 제공되면 검색 순서는 제공된 순서대로예요.-G ‹dir›또는--config ‹dir›:(find-system-path 'config-dir)가 반환하는 디렉터리를 설정해요.-A ‹dir›또는--addon ‹dir›:(find-system-path 'addon-dir)가 반환하는 디렉터리를 설정해요.-U또는--no-user-path:use-user-specific-search-paths파라미터를#f로 초기화해 컬렉션, C 라이브러리 등의 검색에서 사용자별 경로를 생략해요.-A ‹dir›또는--addon ‹dir›:(find-system-path 'addon-dir)가 반환하는 디렉터리를 설정해요.-R ‹paths›또는--compiled ‹paths›: PLTCOMPILEDROOTS 설정을 무시하고current-compiled-file-roots파라미터의 초기값을 설정해요. ‹paths› 인자는 PLTCOMPILEDROOTS와 같은 방식으로 파싱돼요(current-compiled-file-roots참고).-C또는--cross: 크로스 플랫폼 빌드 모드를 선택해(system-type 'cross)가'force를 보고하게 하고,(find-system-path 'config-dir),(find-system-path 'collects-dir),(find-system-path 'addon-dir)의 현재 구성을 각각(find-system-path 'host-config-dir),(find-system-path 'host-collects-dir),(find-system-path 'host-addon-dir)의 결과로 설정해요. -C 또는 --cross가 여러 번 제공되면 첫 인스턴스만 효과가 있어요.-N ‹file›또는--name ‹file›:(find-system-path 'run-file)이 보고하는 실행 파일 이름을 ‹file›로 설정해요.-E ‹file›또는--exe ‹file›:(find-system-path 'exec-file)이 보고하는 실행 파일 이름을 ‹file›로 설정해요.-J ‹name›또는--wm-class ‹name›: GRacket, 유닉스 전용; WM_CLASS 프로그램 클래스를 ‹name›으로 설정해요(WM_CLASS 프로그램 이름은 실행 파일 이름이나 -N/--name 인자에서 파생됨).-j또는--no-jit:eval-jit-enabled파라미터를#f로 설정해 네이티브 코드 JIT(just-in-time) 컴파일러를 비활성화해요.-M또는--compile-any:current-compile-target-machine파라미터를#f로 설정해 머신 독립 바이트코드를 활성화해요.-d또는--no-delay:read-on-demand-source파라미터를#f로 설정해 컴파일된 코드와 문법 객체의 온디맨드 파싱을 비활성화해요.-b또는--binary: 프로세스의 입력, 출력, 오류 포트에 텍스트 모드 대신 바이너리 모드를 요청해요. 이 플래그는 현재 효과가 없는데, 바이너리 모드가 항상 사용되기 때문이에요.-W ‹levels›또는--warn ‹levels›: 원본 오류 포트에 이벤트를 쓰는 로깅 수준을 설정해요. 가능한 ‹level› 값은 PLTSTDERR 환경 변수와 같아요. 자세한 내용은 로깅(Logging)을 보세요.-O ‹levels›또는--stdout ‹levels›: 원본 출력 포트에 이벤트를 쓰는 로깅 수준을 설정해요. 가능한 ‹level› 값은 PLTSTDOUT 환경 변수와 같아요. 자세한 내용은 로깅을 보세요.-L ‹levels›또는--syslog ‹levels›: 시스템 로그에 이벤트를 쓰는 로깅 수준을 설정해요. 가능한 ‹level› 값은 PLTSYSLOG 환경 변수와 같아요. 자세한 내용은 로깅을 보세요.
- 메타 옵션:
-Z: 이 플래그 뒤의 인자는 무시돼요. 이 플래그는 빈약한 스크립팅 환경에서 다른 명령줄 인자를 대체하거나 취소하는 데 유용할 수 있어요.--: 이 플래그 뒤의 인자는 스스로 플래그로 사용되지 않아요.-h또는--help: 명령줄 플래그와 시작 과정에 대한 정보를 보여주고 다른 모든 플래그를 무시하며 종료해요.
명령줄 인자가 적어도 하나 제공되고, 구성 옵션 뒤의 첫 번째 것이 플래그가 아니면, 첫 번째 비플래그 인자 앞에 -u/--require-script 플래그가 암시적으로 추가돼요.
구성 옵션 외에 명령줄 인자가 제공되지 않으면 -i/--repl 플래그가 효과적으로 추가돼요.
유닉스의 GRacket에서, 명령줄 시작 부분에 나타날 때 인식되고 구성 옵션으로 간주되는(즉 read-eval-print 루프를 비활성화하거나 -u/--require-script 삽입을 막지 않는) 플래그는:
-display ‹display›: 사용할 X11 디스플레이를 설정해요.-geometry ‹arg›,-bg ‹arg›,-background ‹arg›,-fg ‹arg›,-foreground ‹arg›,-fn ‹arg›,-font ‹arg›,-iconic,-name ‹arg›,-rv,-reverse,+rv,-selectionTimeout ‹arg›,-synchronous,-title ‹arg›,-xnllanguage ‹arg›, 또는-xrm ‹arg›: 다른 X11 프로그램과의 호환성을 위해 대부분 무시되지만 받아들여지는 표준 X11 인자들. -synchronous 플래그는 보통 방식으로 동작해요.-singleInstance: 같은 X11 디스플레이에 기존 GRacket이 이미 실행 중이고, 같은 호스트명의 머신에서 시작되었으며,(find-system-path 'run-file)이 보고하는 같은 이름으로 시작되었다면(-N/--name 명령줄 인자로 설정될 수 있음), 모든 비옵션 명령줄 인자는 파일 이름으로 취급되어 애플리케이션 파일 핸들러(application-file-handler참고)를 통해 기존 GRacket 인스턴스로 보내져요.
마찬가지로 Mac OS에서 -psn_로 시작하는 앞선 스위치는 특수 구성 옵션으로 취급돼요. 그것은 Finder가 애플리케이션을 시작했음을 나타내므로, 현재 입력·출력·오류 출력이 GUI 창으로 리다이렉트돼요.
단일 문자 스위치(단일 하이픈이 앞에 붙은 것)는 글자를 연결해 하나의 스위치로 축약될 수 있어요. 단, 첫 스위치가 --이 아니어야 해요. 각 스위치의 인자는 축약된 스위치 뒤에(스위치 순서대로) 배치돼요. 예를 들어
-ifve ‹file› ‹expr›
와
-i -f ‹file› -v -e ‹expr›
는 동등해요. 축약된 --가 같은 축약 집합의 다른 축약 스위치보다 앞에 나타나면, 암시적으로 축약 집합의 끝으로 이동돼요.
마지막 옵션 뒤의 추가 인자는 current-command-line-arguments 파라미터에서 얻을 수 있어요.
package base 6.90.0.17에서 변경: -O/--stdout 추가. 7.1.0.5에서 변경: -M/--compile-any 추가. 7.8.0.6에서 변경: -Z 추가. 8.0.0.10에서 변경: -E 추가. 8.0.0.11에서 변경: -Y 추가. 8.4.0.1에서 변경: -y/--make 추가.
18.1.5 언어 실행 시 구성 (Language Run-Time Configuration)
Racket 가이드의 모듈 처리 구성(Module-Handling Configuration)도 함께 보세요.
모듈이 프로그램의 메인 모듈일 때, 모듈은 모듈 자체가 인스턴스화되기 전에 dynamic-require되는 configure-runtime 서브모듈을 가질 수 있어요. 보통 configure-runtime 서브모듈은 모듈의 언어가 모듈에 추가해요(즉 module의 초기 바인딩 사이의 #%module-begin 폼이). configure-runtime 서브모듈의 본문은 보통 current-interaction-info를 포함한 파라미터를 설정해요.
대안으로 또는 추가로, 더 오래된 프로토콜이 있어요. 모듈이 #lang으로 구현될 때, #lang 뒤의 언어는 그 언어를 사용하는 모듈이 프로그램의 메인 모듈일 때 수행할 구성 동작을 지정할 수 있어요. 언어는 다음으로 실행 시 구성을 지정해요.
- 소스에서 읽힌 모듈에
'module-language문법 속성을 붙임(module과module-compiled-language-info참고); 'module-language문법 속성이 나타내는 함수가'configure-runtime키를 인식하게 함(그 키에 대해 벡터 리스트를 반환; 각 벡터는(vector mp name val)형태여야 하며,mp는 모듈 경로,name은 심볼,val은 임의의 값); 그리고- 각 함수를
((dynamic-require mp name) val)로 호출해 보통current-print같은 파라미터를 설정해 실행 시간 환경을 구성하게 함.
'configure-runtime 쿼리는 환경을 직접 구성하는 대신 벡터 리스트를 반환해, 독립 실행 실행 파일을 만들 때 표시된 모듈들이 프로그램에 함께 포함되도록 해요. raco exe: 독립 실행 실행 파일 만들기를 보세요.
새 #lang 언어 정의에 대한 정보는 syntax/module-reader를 보세요.
18.1.6 언어 확장 구성 (Language Expand Configuration)
모듈 lang은 (module name lang ....)으로 구현된 다른 모듈의 확장 전에 dynamic-require되는 configure-expand 서브모듈을 가질 수 있어요. 서브모듈은 리더 모듈과 같은 루트 네임스페이스에 로드돼요. 서브모듈은 enter-parameterization과 exit-parameterization을, 각각 인자를 받지 않고 파라미터화(parameterization)를 반환하는 프로시저로 제공해야 해요.
lang의enter-parameterization은 모듈(module name lang ....)확장의 시작에 호출되고, 그 파라미터화가call-with-parameterization으로 모듈 확장을 감싸요.lang에 대한exit-parameterization은(module name lang ....)의 확장이 다른 모듈의 확장을 촉발하면 호출돼요. 보통 확장 중인 모듈이require하기 때문이에요. 그 경우exit-parameterization은 새로 확장 중인 모듈의 언어에 대한enter-parameterization호출 주위에 배치되는 파라미터화를 얻기 위해 호출돼요.
current-parameterization 프로시저는 enter-parameterization과 exit-parameterization 둘 다의 기본값으로 동작해요.
enter-parameterization이 만든 파라미터화는 보통 error-syntax->string-handler 같은 확장 중 오류 보고에 영향을 주는 파라미터를 설정해요. exit-parameterization이 만든 파라미터화는 일반적으로 current-load-relative-directory 같은 다른 파라미터 값은 그대로 두면서 enter-parameterization이 만든 변경을 되돌려야 해요. enter-parameterization 사용에서 중첩된 exit-parameterization 사용으로 통신하려면 비공개 파라미터를 사용해요.
enter-parameterization과 exit-parameterization 프로시저는 현재 파라미터화를 기반으로 구축할 것으로 예상되지만, 현재 파라미터를 변경(mutate)해서는 안 돼요. 그런 변경은 반환된 파라미터화 사용을 넘어 확장될 수 있기 때문이에요. 대신 parameterize를 사용해 갱신된 파라미터 값으로 새 파라미터화를 만들어요. enter-parameterization과 exit-parameterization은 또한 현재 네임스페이스에서 동작해선 안 돼요. 그것은 모듈 확장에 간섭할 수 있기 때문이에요.
package base 8.8.0.6에서 추가.