:
: (colon) — 콜론 정의 시작
:(colon)은 공백으로 구분된 name을 파싱해 "콜론 정의(colon definition)"라고 불리는 정의를 만들고, 컴파일 상태로 들어가 현재 정의를 시작하는 코어 단어예요.
본문
컴파일 (Compilation)
( C: "<spaces>name" -- colon-sys )
선행 공백 구분자를 건너뛰고 공백으로 구분된 name을 파싱해요. "콜론 정의"라고 불리는 name의 정의를 만들어요. 컴파일 상태로 들어가 현재 정의를 시작하고 colon-sys를 만들어요. 아래 주어진 시작 의미(initiation semantics)를 현재 정의에 추가해요. name의 실행 의미는 정의의 본문(body)에 컴파일된 단어들에 의해 결정돼요. 현재 정의는 그것이 끝날 때까지(또는 일부 시스템에서는 DOES>의 실행까지) 사전(dictionary)에서 찾을 수 없어야 해요.
시작 (Initiation)
( i*x* -- i*x* ) ( R: -- nest-sys )
호출 중인 정의에 대한 구현 의존 정보 nest-sys를 저장해요. 스택 효과 i*x*는 name에 대한 인자를 나타내요.
name 실행 (name Execution)
( i*x* -- j*x* )
정의 name을 실행해요. 스택 효과 i*x*와 j*x*는 각각 name에 대한 인자와 결과를 나타내요.
참조 (See)
- 3.4.3.2 Interpretation semantics(해석 의미)
- 3.4.1 Parsing(파싱)
- 3.4.5 Compilation(컴파일)
- 6.1.1250 DOES>
- 6.1.2500 [
- 6.1.2540 ]
- 15.6.2.0470 ;CODE
- A.6.1.0450 :
합리성 (Rationale)
전형적인 사용:
: name ... ;
Forth 83에서는 이 단어가 검색 순서를 바꾸도록 명시되어 있었어요. 이 명세는 이 표준에서 명시적으로 제거되었어요. 대부분의 경우 이는 영향이 없다고 믿지만, 많은 검색 순서를 허용하는 시스템은 Forth-83의 콜론 동작을 매우 바람직하지 않게 여겼어요. 콜론 자체가 컴파일러를 호출하지는 않는다는 점에 주목하세요. 콜론은 컴파일 상태를 설정해서 이후의 파싱 영역 단어들이 컴파일되도록 해요.
테스트 (Testing)
T{ : NOP : POSTPONE ; ; -> }T
T{ NOP NOP1 NOP NOP2 -> }T
T{ NOP1 -> }T
T{ NOP2 -> }T
다음은 사전 검색 순서를 테스트해요:
T{ : GDX 123 ; : GDX GDX 234 ; -> }T
T{ GDX -> 123 234 }T