Forth

Forth

어려움

지침

아주 단순한 Forth의 부분 집합을 위한 평가기를 구현해 보세요.

Forth는 스택 기반 프로그래밍 언어예요. Forth의 작은 부분 집합을 위한 아주 기본적인 평가기를 구현해 보세요.

평가기는 다음 단어들을 지원해야 해요:

  • +, -, *, / (정수 연산)
  • DUP, DROP, SWAP, OVER (스택 조작)

평가기는 또한 관례적인 문법인 : word-name definition ;을 사용해 새로운 단어를 정의하는 것도 지원해야 해요.

간단하게 유지하기 위해 지원해야 하는 유일한 데이터 타입은 최소 16비트 크기의 부호 있는 정수예요.

문법에는 다음 규칙을 사용하세요: 숫자는 하나 이상의 (ASCII) 숫자로 이루어진 연속이고, 단어는 숫자가 아닌 하나 이상의 문자, 숫자, 기호 또는 구두점으로 이루어진 연속이에요. (Forth는 아마 조금 다른 규칙을 사용하지만, 이 정도면 충분히 비슷해요.)

단어는 대소문자를 구분하지 않아요.

구현

Forth에서 함수는 words라고 부르고, 데이터 스택 위에서 동작해요. 각 워드는 매개변수를 스택에서 가져와서 결과를 스택에 반환해요.

Forth 문서에는 워드가 실행되기 전과 실행된 후의 데이터 스택 상태가 항상 다음과 같은 형식으로 적혀 있어요: ( p1 p2 ... pN --- r1 r2 ... rN ). p1부터 pN까지의 값은 호출 전 스택에 있는 워드의 매개변수를 나타내고(스택에는 여기에 표시되지 않은 다른 데이터가 더 있을 수 있어요), r1부터 rN까지의 값은 호출 후 스택에 있는 워드의 반환 값을 나타내요. 구분자 ---는 워드가 실행되기 전과 후의 스택 상태를 구분해요.

구현할 워드는 다음과 같이 정의돼요:

  • ToS는 Top of Stack의 약자예요
  • 스택의 맨 위는 가장 오른쪽 값으로 나타내요
워드 스택 상태 설명
+ ( a b --- sum ) sum = a + b
- ( a b --- diff ) diff = a - b
* ( a b --- prod ) prod = a * b
/ ( a b --- quot ) quot = a / b
dup ( a --- a a ) ToS에 있는 값을 복제해요
drop ( a --- ) ToS에 있는 값을 버려요
swap ( a b --- b a ) ToS에 있는 두 값을 서로 바꿔요
over ( a b c --- a b c b ) 두 번째 값을 ToS로 복사해요

온라인 Forth 인터프리터를 직접 써보고 싶거나 구현할 워드에 대해 더 알아보고 싶다면 Easy Forth를 한번 살펴봐요(특히 Adding Some Numbers, Defining Words, Stack Manipulation 섹션을요).

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Odin Exercism

Forth 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Odin 트랙을 연습 문제 73개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.