STATE — 컴파일 상태 주소
STATE — 컴파일 상태 주소
STATE는 컴파일 상태(compilation state)를 포함하는 셀의 주소 a-addr를 반환하는 코어 단어예요.
본문
스택 효과
( -- a-addr )
설명
a-addr는 컴파일 상태를 포함하는 셀의 주소예요. 표준 프로그램은 해석 상태를 변경하는 데 ]와 [을 사용해야 하고, 컴파일 상태를 변경하는 데 : 및 ;를 사용해야 해요. 표준 프로그램은 STATE의 내용을 직접 변경해서는 안 돼요.
참고 (Note)
프로그램은 STATE의 내용을 직접 변경해서는 안 돼요.
참조 (See)
- 3.4 The Forth text interpreter
- 6.1.0450 :
- 6.1.0460 ;
- 6.1.0670 ABORT
- 6.1.2050 QUIT
- 6.1.2500 [
- 6.1.2540 ]
- 6.2.0455 :NONAME
- 15.6.2.2250 STATE
- A.6.1.2250 STATE
합리성 (Rationale)
STATE의 내용은 해석 상태에서는 0, 컴파일 상태에서는 0이 아니야. 표준 프로그램은 STATE의 내용을 변경해서는 안 된다. 그것은 [과 ]이 하는 것처럼 컴파일 상태와 해석 상태가 어떻게 전환되는지에 대한 특정 구현을 요구하게 만들기 때문이다. 시스템은 전혀 그렇게 할 필요 없이 STATE의 내용을 전혀 바꾸지 않고 해석·컴파일 상태를 전환할 수 있다. 일부 구현은 [과 ]을 부분적으로 STATE의 내용을 바꾸도록 구현하지만, 이것은 표준에 필요하지 않다.
STATE는 텍스트 해석기 중첩과 함께 중첩되지 않아요. 예를 들어 코드 시퀀스:
: FOO S" ]" EVALUATE ; FOO
는 시스템을 컴파일 상태로 남길 거예요. 마찬가지로 ]를 포함하는 블록을 LOAD한 후 시스템은 컴파일 상태가 될 거예요.
]는 파싱 영역에 영향을 주지 않고 :가 파싱 영역에 미치는 유일한 효과는 단어를 파싱하는 것이라는 점에 주목하세요. 이것은 프로그램이 파싱 영역에 알려진 부작용을 가지고 상태를 설정하기 위해 이 단어들을 사용할 자격을 부여해요.
: NOP : POSTPONE ; IMMEDIATE ;
NOP ALIGN
NOP ALIGNED
일부 비준수 시스템은 ]가 STATE를 설정하는 것 외에도 컴파일러 루프를 호출하게 한다. 그런 시스템은 두 번째 NOP 사용을 부적절하게 컴파일하려 할 거예요.
테스트 (Testing)
T{ : FE1 STATE @ ; -> }T
T{ FE1 -> 0 }T
T{ : FE2 STATE @ ; IMMEDIATE -> }T
T{ FE2 -> 1 }T
T{ : FE3 FE2 ; -> }T
T{ FE3 -> 1 }T