DOES> — 정의의 실행 의미 재정의
DOES> — 정의의 실행 의미 재정의
DOES>는 가장 최근 정의의 실행 의미를 바꾸고, 새로운 실행 의미의 시작점에 데이터 필드 주소를 제공하는 코어 단어예요. CREATE로 만든 정의의 동작을 확장하는 데 쓰여요.
본문
컴파일 (Compilation)
( C: colon-sys1 -- colon-sys2 )
아래 주어진 실행 시점 의미를 현재 정의에 추가해요. DOES>의 컴파일에 의해 현재 정의가 사전에서 찾을 수 있게 되는지 여부는 구현 정의예요. colon-sys1을 소비하고 colon-sys2를 만들어요. 아래 주어진 시작 의미를 현재 정의에 추가해요.
실행 (Run-time)
( -- ) ( R: nest-sys1 -- )
name이라 불리는 가장 최근 정의의 실행 의미를, 아래 주어진 name 실행 의미로 교체해요. nest-sys1이 지정하는 호출 정의로 제어를 반환해요. name이 CREATE 또는 CREATE를 호출하는 사용자 정의 단어로 정의되지 않았으면 애매한 조건이 존재해요.
시작 (Initiation)
( i*x* -- i*x* a-addr ) ( R: -- nest-sys2 )
호출 중인 정의에 대한 구현 의존 정보 nest-sys2를 저장해요. name의 데이터 필드 주소를 스택에 놓아요. 스택 효과 i*x*는 name에 대한 인자를 나타내요.
name 실행 (name Execution)
( i*x* -- j*x* )
name을 수정한 DOES>가 추가한 시작 의미로 시작하는 정의 부분을 실행해요. 스택 효과 i*x*와 j*x*는 각각 name에 대한 인자와 결과를 나타내요.
참조 (See)
- 6.1.1000 CREATE
- A.6.1.1250 DOES>
합리성 (Rationale)
전형적인 사용:
: X ... DOES> ... ;
DOES> 다음에, 표준 프로그램은 DOES>를 포함하는 정의의 이름이나, 그것이 가릴 수 있는 이전 정의의 이름을 찾을 수 있는지에 대해 어떤 가정도 해서는 안 돼요. DOES>는 지역 변수와 제어 흐름 구조에 관해서는 한 정의를 효과적으로 끝내고 다른 정의를 시작해요. 컴파일 동작은 사용자가 DOES>를 어떤 제어 흐름 구조 안에 넣을 자격이 없다는 것을 분명히 해요.
테스트 (Testing)
T{ : DOES1 DOES> @ 1 + ; -> }T
T{ : DOES2 DOES> @ 2 + ; -> }T
T{ CREATE CR1 -> }T
T{ CR1 -> HERE }T
T{ 1 , -> }T
T{ CR1 @ -> 1 }T
T{ DOES1 -> }T
T{ CR1 -> 2 }T
T{ DOES2 -> }T
T{ CR1 -> 3 }T
T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
T{ WEIRD: W1 -> }T
T{ ' W1 >BODY -> HERE }T
T{ W1 -> HERE 1 + }T
T{ W1 -> HERE 2 + }T