FIND — 정의 검색
FIND — 정의 검색
FIND는 c-addr의 카운트 문자열에 이름이 들어 있는 정의를 찾는 코어 단어예요.
본문
스택 효과
( c-addr -- c-addr 0 | xt 1 | xt -1 )
설명
c-addr의 카운트 문자열에 이름이 들어 있는 정의를 찾아요. 정의가 발견되지 않으면 c-addr과 0을 반환해요. 정의가 발견되면 그 실행 토큰 xt를 반환해요. 정의가 즉시(immediate) 단어이면 1을, 그렇지 않으면 마이너스 1(-1)도 함께 반환해요. 주어진 문자열에 대해, 컴파일 중에 FIND가 반환하는 값은 컴파일 중이 아닐 때 반환하는 값과 다를 수 있어요.
참조 (See)
- 3.4.2 Finding definition names(정의 이름 찾기)
- A.6.1.0070 '
- A.6.1.1550 FIND
- A.6.1.2033 POSTPONE
- A.6.1.2510 [']
합리성 (Rationale)
위원회가 다룬 더 어려운 문제 중 하나는 구현 메커니즘의 명세를 Forth 언어의 명세에서 분리하는 문제였어요. 세 가지 기본 구현 접근 방식을 빠르게 열거할 수 있어요:
- 스레드 코드(threaded code) 메커니즘. Forth를 구현하는 전통적인 접근 방식이지만, 다른 기법도 사용될 수 있어요.
- "매크로 확장"(코드 복사)을 사용한 서브루틴 스레딩.
DUP의 코드 같은 짧은 루틴은JSR참조를 컴파일하는 대신 정의에 복사돼요. - 최적화를 가진 네이티브 코딩. 스택 최적화(예:
SWAP ROT +같은 구를 하나 또는 두 개의 기계 명령으로 교체), 병렬화 등이 포함될 수 있어요. 컴파일 주소가 사전에 컴파일되어야 한다는(Forth 83에서 물려받은) 초기 요구 사항은 타입 2와 타입 3 구현을 허용하지 않았어요. 타입 3 메커니즘과 타입 2 구현의 최적화는 모든 표준 단어의 즉시성/비즉시성의 명시적 명세에 의해 방해받았어요.POSTPONE은STATE와 무관해야 하는 소수의 Forth 단어를 제외하고 모든 단어의 즉시성/비즉시성의 비-명세화를 허용했어요. 한 타입 3 구현인 Charles Moore의 cmForth는 많은 Forth 단어의 컴파일 버전과 해석 버전을 모두 가져요. 지금은 이것이 타입 3 구현의 공통 접근 방식으로 보여요. 위원회는 이 구현 접근 방식이 허용되어야 한다고 느꼈어요. 결과적으로 해석 의미가 없는 단어들은 컴파일 중에만 발견될 수 있고, 다른 단어들은 컴파일 버전과 해석 버전 두 가지로 존재할 수 있어요. 따라서FIND가 반환하는 값은STATE에 의존할 수 있고,'와[']는 해석 의미가 없는 단어를 찾지 못할 수 있어요.
테스트 (Testing)
T{ GT1STRING FIND -> ' GT1 -1 }T
T{ GT2STRING FIND -> ' GT2 1 }T
( HOW TO SEARCH FOR NON-EXISTENT WORD? )