Clem은 일류 기능을 갖춘 최소 스택 기반 프로그래밍 언어입니다. 귀하의 목표는 Clem 언어에 대한 통역사를 작성하는 것입니다. 참조 구현에 포함 된 모든 예제를 올바르게 실행해야합니다 ( 여기 참조) .
- 평소와 같이 표준 허점이 적용됩니다.
- 바이트 수로 가장 작은 항목이 이깁니다.
클렘 언어
Clem은 일류 함수를 사용하는 스택 기반 프로그래밍 언어입니다. Clem을 배우는 가장 좋은 방법은 clem
인수없이 통역사 를 운영하는 것 입니다. 대화식 모드에서 시작하여 사용 가능한 명령으로 재생할 수 있습니다. 예제 프로그램을 실행하려면 clem example.clm
여기서 example은 프로그램 이름입니다.를 입력하십시오. 이 간단한 자습서는 시작하기에 충분해야합니다.
함수에는 두 가지 주요 클래스가 있습니다. 원자 함수와 복합 함수. 복합 함수는 다른 복합 함수와 원자 함수로 구성된 목록입니다. 복합 함수는 자체를 포함 할 수 없습니다.
원자 함수
원자 함수의 첫 번째 유형은 상수 입니다. 상수는 단순히 정수 값이다. 예를 들어 -10입니다. 인터프리터가 상수를 만나면 스택으로 푸시합니다. 실행 clem
지금. -10
프롬프트에서 입력 하십시오. 넌 봐야 해
> -10
001: (-10)
>
이 값 001
은 스택에서 함수의 위치를 나타내며 방금 입력 (-10)
한 상수 입니다. 이제 +11
프롬프트에서 입력하십시오 . 넌 봐야 해
> +11
002: (-10)
001: (11)
>
공지 (-10)
스택의 제 2 위치로 이동하고있다 (11)
지금은 제를 차지한다. 이것이 스택의 본질입니다! -
또한 감소 명령 임을 알 수 있습니다. 때마다 -
또는 +
숫자 앞에, 그들은 그 숫자의 기호가 아닌 해당 명령을 나타낸다. 다른 모든 원자 함수는 명령 입니다. 총 14 개가 있습니다 :
@ Rotate the top three functions on the stack
# Pop the function on top of the stack and push it twice
$ Swap the top two functions on top of the stack
% Pop the function on top of the stack and throw it away
/ Pop a compound function. Split off the first function, push what's left,
then push the first function.
. Pop two functions, concatenate them and push the result
+ Pop a function. If its a constant then increment it. Push it
- Pop a function. If its a constant then decrement it. Push it
< Get a character from STDIN and push it to the stack. Pushes -1 on EOF.
> Pop a function and print its ASCII character if its a constant
c Pop a function and print its value if its a constant
w Pop a function from the stack. Peek at the top of the stack. While it is
a non-zero constant, execute the function.
프롬프트에서 명령을 입력하면 명령이 실행됩니다. #
프롬프트에서 입력 하십시오 (중복 명령). 넌 봐야 해
> #
003: (-10)
002: (11)
001: (11)
>
(11)이 복제되었습니다. 이제 %
프롬프트에서 입력 하십시오 (drop 명령). 넌 봐야 해
> %
002: (-10)
001: (11)
>
명령을 스택으로 푸시하려면 간단히 괄호로 묶으십시오. (-)
프롬프트에서 입력 하십시오. 감소 연산자를 스택으로 푸시합니다. 넌 봐야 해
> (-)
003: (-10)
002: (11)
001: (-)
>
복합 기능
복합 함수를 형성하기 위해 여러 원자 함수를 괄호로 묶을 수도 있습니다. 프롬프트에서 복합 함수를 입력하면 스택으로 푸시됩니다. ($+$)
프롬프트에서 입력 하십시오. 넌 봐야 해
> ($+$)
004: (-10)
003: (11)
002: (-)
001: ($ + $)
>
기술적으로 스택의 모든 것은 복합적인 기능입니다. 그러나 스택의 일부 복합 함수는 단일 원자 함수로 구성됩니다 (이 경우 편의상 원자 함수로 간주 함). 스택에서 복합 기능을 조작 할 때 .
명령 (연결)이 종종 유용합니다. .
지금 입력하십시오 . 넌 봐야 해
> .
003: (-10)
002: (11)
001: (- $ + $)
>
스택의 첫 번째 및 두 번째 기능이 연결되었으며 스택의 두 번째 기능이 결과 목록에서 먼저 나타납니다. 스택에있는 함수를 실행하려면 (원자이든 복합이든) w
명령을 실행 해야합니다 (그 동안). 이 w
명령은 스택의 첫 번째 함수를 팝하고 스택의 두 번째 함수가 0이 아닌 상수 인 한 반복해서 실행합니다. 입력하면 어떤 일이 일어날 지 예측해보십시오 w
. 이제을 입력하십시오 w
. 넌 봐야 해
> w
002: (1)
001: (0)
>
그게 당신이 예상 한 것입니까? 스택 위에 앉아있는 두 숫자가 추가되었고 그 합은 남아 있습니다. 다시 해보자. 먼저을 입력하여 0을 삭제하고 10을 입력 %10
합니다. 넌 봐야 해
> %10
002: (1)
001: (10)
>
이제 전체 기능을 한 번에 입력하지만 %
끝에 0을 제거하기 위해 추가 기능을 추가 합니다. (-$+$)w%
프롬프트에서 입력 하십시오. 넌 봐야 해
> (-$+$)w%
001: (11)
>
이 알고리즘은 스택의 첫 번째 상수가 양수인 경우에만 작동합니다.
현
문자열도 있습니다. 그것들은 주로 구문 설탕이지만 꽤 유용 할 수 있습니다. 인터프리터가 문자열을 만나면 각 문자를 마지막에서 맨 처음으로 스택으로 푸시합니다. %
이전 예제에서 11을 삭제하려면 입력 하십시오. 이제 0 10 "Hi!"
프롬프트에 입력 하십시오. 는 0
널 (NULL) 터미네이터를 삽입되고는 10
개행 문자를 삽입합니다. 넌 봐야 해
> 0 10 "Hi!"
005: (0)
004: (10)
003: (33)
002: (105)
001: (72)
>
(>)w
NULL 터미네이터가 나올 때까지 스택에서 문자를 인쇄하려면 입력 하십시오. 넌 봐야 해
> (>)w
Hi!
001: (0)
>
결론
잘하면 이것이 통역사를 시작하기에 충분해야합니다. 언어 디자인은 비교적 간단해야합니다. 어떤 것이 몹시 불분명한지 알려주세요 :) 의도적으로 모호한 것이 몇 가지 있습니다. 값은 부호가 있어야하고 16 비트 이상 이어야하며, 스택은 모든 참조 프로그램을 실행할 수있을 정도로 커야합니다. 완전한 언어 사양이 게시하기에는 엄청나게 클 것이므로 (아직 작성하지 않았습니다 : P). 의심스러운 경우 참조 구현을 모방하십시오.