시리즈:쉽게 배우는 프로그래밍 입문/FORTH 편집하기

편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
1번째 줄: 1번째 줄:
{{:시리즈:쉽게 배우는 프로그래밍 입문}}
안녕하세요. 이 문서는 FORTH(이하 포스)라는 스택 기반 [[언어]]에 대한 문서입니다. 이미 망한 언어! 죽어서 거의 쓰이지 않는다는 언어!!입니다만, 스택을 이용한 물건이라는 점에서 흥미를 돋우는 언어이기도 합니다. 포스가 처음 등장했을 당시, 사람들은 포스가 세상을 지배할 것이라고 생각했다지만…
안녕하세요. 이 문서는 FORTH(이하 포스)라는 스택 기반 [[언어]]에 대한 문서입니다. 이미 망한 언어! 죽어서 거의 쓰이지 않는다는 언어!!입니다만, 스택을 이용한 물건이라는 점에서 흥미를 돋우는 언어이기도 합니다. 포스가 처음 등장했을 당시, 사람들은 포스가 세상을 지배할 것이라고 생각했다지만…


33번째 줄: 31번째 줄:
{{인용문2|2와 (3과 4를 더한 것)을 곱한 것}}
{{인용문2|2와 (3과 4를 더한 것)을 곱한 것}}
한국어로 쓰면 약간 모호해서 괄호를 넣긴 했지만, 저 형태에 주목하세요. 중요한 부분을 강조해 보겠습니다.
한국어로 쓰면 약간 모호해서 괄호를 넣긴 했지만, 저 형태에 주목하세요. 중요한 부분을 강조해 보겠습니다.
{{인용문2|2<del>와</del> 3<del>과</del> 4<del>를</del> 더한 것<del>을</del> 곱한 것<br />2 3 4 + *}}
{{인용문2|2<del>와</del> 3<del>과</del> 4<del>를</del> 더한 것<del>을</del> 곱한 것<br>2 3 4 + *}}
둘을 비교해 보고 후위 표기법으로 식을 쓰는데 익숙해져 보세요.
둘을 비교해 보고 후위 표기법으로 식을 쓰는데 익숙해져 보세요.


43번째 줄: 41번째 줄:
=== 단어 ===
=== 단어 ===
포스에서 사용하는 명령 혹은 함수입니다. 포스의 모든 계산은 단어를 통해서 이루어지며, 별다른 문법이 없습니다.
포스에서 사용하는 명령 혹은 함수입니다. 포스의 모든 계산은 단어를 통해서 이루어지며, 별다른 문법이 없습니다.
<syntaxhighlight lang="text">
<source lang="text">
1 2 + .  \ 3
1 2 + .  \ 3
</syntaxhighlight>
</source>


위 코드의 <code>+</code>와 <code>.</code>도 단어이며, 보이는 것처럼 공백으로 구분하지요.
위 코드의 <code>+</code>와 <code>.</code>도 단어이며, 보이는 것처럼 공백으로 구분하지요.
52번째 줄: 50번째 줄:
변수? 리스트? 필요 없습니다! 포스는 저 것들을 쓰지 않고도 값을 보존하고 계산할 수 있어요. 변수 없이도…ㅠㅠ
변수? 리스트? 필요 없습니다! 포스는 저 것들을 쓰지 않고도 값을 보존하고 계산할 수 있어요. 변수 없이도…ㅠㅠ
다음처럼 값을 입력해 봅시다.
다음처럼 값을 입력해 봅시다.
<syntaxhighlight lang="text">
<source lang="text">
1 2
1 2
</syntaxhighlight>
</source>


다음처럼 스택에 값이 들어간 것이 보이지요?
다음처럼 스택에 값이 들어간 것이 보이지요?
<syntaxhighlight lang="text">
<source lang="text">
Stack<10> 1 2
Stack<10> 1 2
</syntaxhighlight>
</source>


만약 보이지 않는다면, <code>.s</code> 단어를 이용하여, 데이터 스택에 들어간 값들을 볼 수 있어요.
만약 보이지 않는다면, <code>.s</code> 단어를 이용하여, 데이터 스택에 들어간 값들을 볼 수 있어요.
65번째 줄: 63번째 줄:
=== 값의 출력 ===
=== 값의 출력 ===
스택에 들어간 값을 출력하기 위해서는 <code>.</code>단어를 사용합니다.
스택에 들어간 값을 출력하기 위해서는 <code>.</code>단어를 사용합니다.
<syntaxhighlight lang="text">
<source lang="text">
1 2
1 2
     ok
     ok
72번째 줄: 70번째 줄:
2    ok
2    ok
Stack<10> 1
Stack<10> 1
</syntaxhighlight>
</source>


1과 2를 입력하고서 값을 출력하니, 화면에는 2가 찍히고 스택에는 1만 남았네요? 스택의 출력은 마지막부터 역순!
1과 2를 입력하고서 값을 출력하니, 화면에는 2가 찍히고 스택에는 1만 남았네요? 스택의 출력은 마지막부터 역순!
78번째 줄: 76번째 줄:
=== 사칙연산 ===
=== 사칙연산 ===
계산의 기본은 [[사칙연산]]이죠? 이를 위해 포스는 <code>+</code>·<code>-</code>·<code>*</code>·<code>/</code>의 단어를 제공하고 있어요.
계산의 기본은 [[사칙연산]]이죠? 이를 위해 포스는 <code>+</code>·<code>-</code>·<code>*</code>·<code>/</code>의 단어를 제공하고 있어요.
<syntaxhighlight lang="text">
<source lang="text">
0 1 +      \  1 = 0 + 1
0 1 +      \  1 = 0 + 1
2 3 4 + *  \ 14 = 2 * (3 + 4)
2 3 4 + *  \ 14 = 2 * (3 + 4)
     ok
     ok
Stack<10> 1 14
Stack<10> 1 14
</syntaxhighlight>
</source>


오호~ 스택의 특성에 따라 거꾸로 계산되네요? 스택을 이용한 계산에는 값과 연산자가 순서대로 반응하는 것이라서, 괄호를 사용하지 않아요.
오호~ 스택의 특성에 따라 거꾸로 계산되네요? 스택을 이용한 계산에는 값과 연산자가 순서대로 반응하는 것이라서, 괄호를 사용하지 않아요.
89번째 줄: 87번째 줄:
=== 단어 작성 및 사용 ===
=== 단어 작성 및 사용 ===
단어는 포스의 연산자, 명령어 혹은 함수와 같은 개념입니다. 이제 여러분은 사칙연산 항목을 통해서 단순한 계산을 할 수 있게 되었습니다. 그럼 이제 총합을 구해봅시다.
단어는 포스의 연산자, 명령어 혹은 함수와 같은 개념입니다. 이제 여러분은 사칙연산 항목을 통해서 단순한 계산을 할 수 있게 되었습니다. 그럼 이제 총합을 구해봅시다.
<syntaxhighlight lang="text">
<source lang="text">
1 2 3 4 5 6 7 8 9 10 + + + + + + + + +
1 2 3 4 5 6 7 8 9 10 + + + + + + + + +
     ok
     ok
Stack<10> 55
Stack<10> 55
</syntaxhighlight>
</source>


헥헥, 아니!! 연산자 쓰기가 넘 힘드네요ㅠㅠ 계산기에서 자주 쓰이는 기능 중 하나가 총합인데, 이렇게 힘들수가! 그러니 단어를 만들어 좀 편하게 계산해 봅시다.
헥헥, 아니!! 연산자 쓰기가 넘 힘드네요ㅠㅠ 계산기에서 자주 쓰이는 기능 중 하나가 총합인데, 이렇게 힘들수가! 그러니 단어를 만들어 좀 편하게 계산해 봅시다.
<syntaxhighlight lang="text">
<source lang="text">
: SUM  DEPTH 1 <> IF + RECURSE THEN ;
: SUM  DEPTH 1 <> IF + RECURSE THEN ;
     ok
     ok
Stack<10>
Stack<10>
</syntaxhighlight>
</source>


이제 <code>SUM</code>이라는 단어를 만들었습니다. 구조를 살펴볼까요?
이제 <code>SUM</code>이라는 단어를 만들었습니다. 구조를 살펴볼까요?
<syntaxhighlight lang="text">
<source lang="text">
:      \ 단어를 정의하는 단어입니다.
:      \ 단어를 정의하는 단어입니다.
SUM    \ 단어 이름.
SUM    \ 단어 이름.
112번째 줄: 110번째 줄:
THEN    \ 판단문 종료.
THEN    \ 판단문 종료.
;      \ 단어 정의 마침.
;      \ 단어 정의 마침.
</syntaxhighlight>
</source>


그러니까, <code>:</code>으로 단어 만들기를 시작해서, <code>SUM</code>이라는 이름을 주고서, "스택의 깊이가 1이 될 때까지 반복해서 더해보자"고한 뒤에, <code>;</code>으로 단어 만들기를 마치는 겁니다.
그러니까, <code>:</code>으로 단어 만들기를 시작해서, <code>SUM</code>이라는 이름을 주고서, "스택의 깊이가 1이 될 때까지 반복해서 더해보자"고한 뒤에, <code>;</code>으로 단어 만들기를 마치는 겁니다.
<syntaxhighlight lang="text">
<source lang="text">
1 2 3 4 5 SUM
1 2 3 4 5 SUM
     ok
     ok
Stack<10> 55
Stack<10> 55
</syntaxhighlight>
</source>


오~ 잘 동작하네요. 룰루랄라♪ ㅋㅋㅋ
오~ 잘 동작하네요. 룰루랄라♪ ㅋㅋㅋ
129번째 줄: 127번째 줄:
=== 설명문(주석) ===
=== 설명문(주석) ===
설명문에는 역슬래시(<code>\</code>)와 소괄호(<code>(…)</code>)를 사용해요.
설명문에는 역슬래시(<code>\</code>)와 소괄호(<code>(…)</code>)를 사용해요.
<syntaxhighlight lang="text">
<source lang="text">
\ 설명문이다.
\ 설명문이다.
( 주석이다. )
( 주석이다. )
Stack<10>
Stack<10>
</syntaxhighlight>
</source>


전자는 설명을 시작하면, 끝까지 설명문이고, 후자는 코드 사이에 삽입할 수가 있지요. 설명문은 포스에서 스택 이펙트라는 것을 표현하는데 종종 사용합니다.
전자는 설명을 시작하면, 끝까지 설명문이고, 후자는 코드 사이에 삽입할 수가 있지요. 설명문은 포스에서 스택 이펙트라는 것을 표현하는데 종종 사용합니다.
148번째 줄: 146번째 줄:
==== DUP: ====
==== DUP: ====
스택의 처음 값(맨 위 값)을 복제 합니다.
스택의 처음 값(맨 위 값)을 복제 합니다.
<syntaxhighlight lang="text">
<source lang="text">
2 DUP
2 DUP
     ok
     ok
Stack<10> 2 2
Stack<10> 2 2
</syntaxhighlight>
</source>


2를 복제하니까 2가 두 개가 되었어요.<br />
2를 복제하니까 2가 두 개가 되었어요.<br>
2를 복제하니까 2가 두 개가 되었어요.
2를 복제하니까 2가 두 개가 되었어요.


==== DROP: ====
==== DROP: ====
스택의 처음 값을 삭제 합니다.
스택의 처음 값을 삭제 합니다.
<syntaxhighlight lang="text">
<source lang="text">
10    \ ⏎  
10    \ ⏎  
DROP  \ ⏎  
DROP  \ ⏎  
     ok
     ok
Stack<10>
Stack<10>
</syntaxhighlight>
</source>


==== ROT/-ROT: ====
==== ROT/-ROT: ====
스택의 값을 회전시킵니다. 스택의 처음 값 이하, 3개의 값을 회전시켜요. @_@
스택의 값을 회전시킵니다. 스택의 처음 값 이하, 3개의 값을 회전시켜요. @_@
<syntaxhighlight lang="text">
<source lang="text">
1 2 3 4 ROT
1 2 3 4 ROT
     ok
     ok
Stack<10> 1 3 4 2
Stack<10> 1 3 4 2
</syntaxhighlight>
</source>


<code>1 2 3 4</code>를 회전시켰더니, <code>1 3 4 2</code>이 되었어요! <code>ROT</code>는 처음 값 이하, 3개의 값을 아래쪽으로 회전합니다. <code>-ROT</code>는 반대로 위쪽으로 회전.
<code>1 2 3 4</code>를 회전시켰더니, <code>1 3 4 2</code>이 되었어요! <code>ROT</code>는 처음 값 이하, 3개의 값을 아래쪽으로 회전합니다. <code>-ROT</code>는 반대로 위쪽으로 회전.
178번째 줄: 176번째 줄:
=== 판단문 ===
=== 판단문 ===
포스에도 다른 언어들처럼 판단문이 가능하지요. 기본은 역시 if문. 다음 단어들을 제공합니다. <code>IF</code>, <code>ELSE</code>, <code>THEN</code>. 코드를 봐주세요.
포스에도 다른 언어들처럼 판단문이 가능하지요. 기본은 역시 if문. 다음 단어들을 제공합니다. <code>IF</code>, <code>ELSE</code>, <code>THEN</code>. 코드를 봐주세요.
<syntaxhighlight lang="text">
<source lang="text">
10 5 >      \ 10이 5보다 크다면,
10 5 >      \ 10이 5보다 크다면,
IF  -1    \ -1을 입력하고,
IF  -1    \ -1을 입력하고,
185번째 줄: 183번째 줄:
     ok
     ok
Stack<10> -1
Stack<10> -1
</syntaxhighlight>
</source>


<code>IF</code>는 값을 비교하여, <code>0</code>이면 거짓, 나머지는 참으로 판단합니다. <code>IF</code>는 <code>THEN</code>과 짝을 이루며, <code>ELSE</code>는 해당하는 처리를 하고 싶지 않다면 없어도 좋아요. 참고로 포스 내에서 참값은 <code>-1</code>.
<code>IF</code>는 값을 비교하여, <code>0</code>이면 거짓, 나머지는 참으로 판단합니다. <code>IF</code>는 <code>THEN</code>과 짝을 이루며, <code>ELSE</code>는 해당하는 처리를 하고 싶지 않다면 없어도 좋아요. 참고로 포스 내에서 참값은 <code>-1</code>.
199번째 줄: 197번째 줄:
=== 예문: 삼각형 그리기 ===
=== 예문: 삼각형 그리기 ===
초급 항목에서 익혔던 것들을 토대로 삼각형 그리기를 해봐요.
초급 항목에서 익혔던 것들을 토대로 삼각형 그리기를 해봐요.
<syntaxhighlight lang="text">
<source lang="text">
: >ODD    DUP 0 <> IF 2 * 1 - THEN ;    \ 판단문.
: >ODD    DUP 0 <> IF 2 * 1 - THEN ;    \ 판단문.
: .STAR  [CHAR] * EMIT ;              \ 별표(*) 출력인데, 넘어가요.
: .STAR  [CHAR] * EMIT ;              \ 별표(*) 출력인데, 넘어가요.
218번째 줄: 216번째 줄:
   ok
   ok
Stack<10>
Stack<10>
</syntaxhighlight>
</source>


== 중급 ==
== 중급 ==


{{쉽게 배우는 프로그래밍 입문}}
[[분류:프로그래밍 시리즈|FORTH]]
[[분류:프로그래밍 시리즈|FORTH]]
리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다.
취소 편집 도움말 (새 창에서 열림)

| () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |}