"진짜 말 안듣는 종합게임 스트리머"1 연두는말안드뤄님이 자주 사용하는 말을 예약어로 모아 만드는 난해한 프로그래밍 언어 명세입니다.
- 중단점(
.
), 쉼표(,
), 개행문자로 명령어를 구분합니다. - 명령어로 예약된 키워드 외에는 인터프리터에서 주석으로 무시를 합니다.
오늘은 정말 날씨가 쪼오오았어!! 방송에서 뭘 해볼까...?
안녕 토템 여러분? 나는 트위치 스트리머 연두야
작심삼일 다이어트 중이라 오늘은 브라우니 먹기 싫어 아 빵떡아아!!!!! 거기 좀 올라가지마
난 트위치 최고 간땅이의 담력을 가졌으니 공포게임을 해볼까 아~~ 쒸이이이이이이이이이이X! 하-쒸 왜 게임이 안켜지지?
쪼오오았어!!
: 글자수5
와 느낌표 갯수2
를 곱한10
을 스택에 집어넣습니다.스트리머
:9
애서0
까지의 원소를 스택에 집어넣기 위한 반복문 범위의 시작입니다.브라우니 먹기 싫어 아 빵떡아아!!!!!
:브라우니 싫어
는 현 스택의 맨위 원소10
에 1 을 뺀 값9
를 새 원소로 집어넣고,빵떡아아!!!!!
는(글자수 - 2) * 느낌표 갯수 = 2 * 5 = 10
만큼스트리머
와빵떡아
사이를 반복하라는 반복문 범위의 끝입니다.트위치 최고 간땡이의 담력
:트위치
,최고
,간땡이의 담력
모두 현재 스택의 모든 값의 부호를 바꾸는 개별적인 명령어 인데,트위치
에서 양수에서 음수로 바꾸고,최고
에서 음수에서 양수로 바꾸고간떙이의 담력
에서 다시 양수에서 음수로 바꾸어집니다. 따라서 스택에 들어 있는 모든 원소는 음수로 변환이 됩니다.쒸이아이이이이이이이X!!!
: 글자수 만큼의 스택 원소를 느낌표 갯수인1
번 스택으로 옮겨 출력을 차례대로 진행합니다. 0 이상의 정수 경우 유니코드 범위의 문자로 출력이 되지만, 이 경우 스택에 음수만 존재하여 부호를 제외한 정수로 출력을 하게 됩니다.하-쒸
: 명령어로 예약된 키워드 외의 문자하-
가 주석으로 무시하여 인터프리터가 5번 절차에서도 쓰였던쒸
를 언어 토큰으로 읽어드립니다. 현재 위치한 1번 스택에 뽑기 명령을 하게 되어 프로그램을 정상적으로 종료합니다. (exit 0)
0
1
2
3
4
5
6
7
8
9
10
예제 작성 중
부라우니 좋아🤤 더 먹고 싶다고 쪼르고 싶어
으악! 3개째 먹는 중인데 정말 난 글러먹은 스트리머야
아니 그러다가 나 혈당 스파이크로 죽어
씨익! 그래도 맛있어서 쪼은걸 어떡해
(반려묘가 브라우니에 관심을 보임) 빵떡아 이거 먹으면 안돼!!!
부라우니 좋아🤤 더 먹고 싶다고 쪼르고 싶어
:좋아
에0
을 스택에 넣고쪼르고
에1
을 스택에 넣습니다.으악!
:글러먹은 스트리머
:스트리머
가 피보나치 수 목록을 스택에 넣기 위한 반복문 범위의 시작입니다.죽어
: 스택 맨 앞 두 원소를 더한 값을 새로 집어넣습니다.쪼은걸
:1
을 집어넣습니다.빵떡아
: 현재 위치한 스택의 원소 한개만큼 3단계와 4단계 사이를 다시 한번 반복합니다. 다시빵떡아
명령이 있는 라인으로 갔을 때 맨 앞의 원소가 1이 있으므로 또 다시 반복하여 무한 반복이 됩니다.
0
1
1
2
3
5
8
13
21
34
# 생략...
TODO
GuGuClass 에 존경을 담은 예제입니다.
엄랭을 보고 첫 동기를 얻어 재미 삼아 고안하게 되었습니다.
엄랭 저작자 @rycont 검수 평: 전혀 프로그래밍 언어 같지 않아 보인다는 점에서 아주 마음에 듭니다!!
난해한 혀엉... 언어의 글자수 갯수에 따라 수를 연산하는 체계와 스택 기반의 입출력 체계에 영향을 받았습니다.
아희에서 쓰이는 스택 기반의 연산 체계를 혀엉 언어와 함께 참고하여 초기 설계를 했습니다.
- 스택의 모든 원소는 유리수 또는
NaN
으로 이루어져 있습니다. 분모가 1인 유리수를 편의상 정수라고 칭합니다.- 어떠한 연산을 하더라도 그 연산에
NaN
이 있을 경우 그 연산의 값은NaN
이 됩니다.
- 어떠한 연산을 하더라도 그 연산에
- 0번 스택은 입력된 문자들의 유니코드 문자값들의 나열입니다. (stdin). 먼저 입력된 문자가 먼저 뽑힙니다. 기본적으로 빈 스택이며 이 스택이 빈 스택일 때 뽑기 연산이 일어날 시 프로그램에서 필요한 만큼 문자 입력을 받아 스택에 저장합니다.
- 1번 스택으로 넣어지는 값들은 출력됩니다. (stdout). 항상 빈 스택이며, 뽑기 연산이 일어날 경우 프로그램을 정상적으로 종료합니다. (exit 0) 모든 명령을 수행 완료하고 프로그램을 종료하고 싶을 때 쓰입니다.
- 이 스택에 넣어지는 모든 0보다 크거나 같은 정수들은 그에 해당하는 유니코드 문자로 출력됩니다.
- 이 스택에 넣어지는 모든 음수는 부호를 제외하고 0(U+0030) 이상 9(U+0039) 이하에 있는 문자들을 사용하여 10진수 숫자로 출력합니다.
- 이 스택에 넣어지는 모든 정수가 아닌 유리수들은 자신보다 작은 정수 중 가장 큰 정수를 택하여 위의 과정을 처리합니다.
- 이 스택에
NaN
이 넣어지는 경우연바두보
로 치환하여 출력됩니다. - 이 스택에 넣어지는 원소는 출력됨과 동시에 스택에서 지워집니다.
- 이 스택의 값 하나 당 출력 라인 하나를 차지하며 출력됩니다.
- 2번 스택으로 넣어지는 값들은 에러 문자로 출력됩니다. (stderr). 출력 규칙은 1번 스택과 동일합니다. 항상 빈 스택이며, 뽑기 연산이 일어날 경우 오류 메세지로
또 버그야?
를 출력하고 프로그램을 비정상적으로 종료합니다. (exit 1) - 3번 스택은 특별한 기능을 하지 않는 빈 스택입니다.
- 4번 스택은 트위치 아이디
rudbeckia7
에서rudbeckia
가 영원한 행복이라는 꽃말처럼2 스택의 원소 할당을 불변으로 강제합니다. 넣을 수만 있고 뽑기가 불가능합니다.- 뽑기 명령 시도 시 오류 메세지로
영복해
를 출력하고 종료합니다. (exit 1)
- 뽑기 명령 시도 시 오류 메세지로
- 5번 스택부터는 특별한 기능을 하지 않는 일반 스택이며, 모두 기본적으로 빈 스택입니다. 프로그램 시작 시 현재 스택은 3번 스택이 됩니다. 비어 있는 일반 스택에서 뽑기 연산이 일어날 경우
NaN
을 제공합니다.
명령어는 아래 후술할 예약어와 뒤따라 나오는 여러 느낌표 !(U+0021)로 이루어져 있습니다. 예약어마다 저마다 가변적인 길이로 표현이 가능한데, 이 길이를 글자 수
라고 하고, 후자의 느낌표 수를 느낌표 갯수
라고 합니다. 이런 표현 방식으로 스택을 다루게 됩니다.
"한글 음절 문자"는 가(U+AC00) 이상 힣(U+D7A3) 이하의 유니코드 범위를 가리킵니다.
"한글 종성 문자"는 ㄱ(U+11A8) 이상 ㅎ(U+11C2) 이하의 유니코드 범위를 가리킵니다.
-
쪼
,쪼아
,쪼오아
,쪼오아!!
:쪼
와아
사이에오
를 갯수 제한 없이 넣을 수 있으며, 글자수와 느낌표 갯수를 곱한 값을 스택에 집어넣습니다.- 숫자
0
을 넣어야 하는 경우좋
이라는 별개의 명령어를 사용합니다. 쪼아
는2
을 집어넣고,쪼오아
의 경우3
를 집어넣습니다.쪼오아!!
는 글자 수3
와 느낌표 갯수2
를 곱한6
를 집어넣습니다.쪼
와아
사이에오
이외에 한글 음절 문자를 추가적으로 넣는 방식으로 글자 수를 늘릴 수 있습니다.- 예를 들어
쪼오아
와쪼아아
는 같은 명령어입니다.
- 예를 들어
쪼아
의 마지막아
글자에 한글 종성 문자를 추가로 조합하여 더 다양한 표현이 가능합니다.- 예를 들어
쪼오아
에ㅆ
종성을 조합하고어
주석을 붙여쪼오았어
로 표현 가능합니다.
- 예를 들어
- 숫자
-
싫
,싫어
,싫어어
,싫어어!!
:싫
과어
사이에어
를 갯수 제한 없이 넣을 수 있으며, 글자수와 느낌표 갯수를 곱한 음수 값을 스택에 집어넣습니다.싫
는-1
을 집어넣고,싫어어
의 경우-3
를 집어넣습니다.싫어어!!
는 글자 수3
와 느낌표 갯수2
를 곱한6
를 집어넣습니다.싫
와어
사이에어
이외에 한글 음절 문자를 추가적으로 넣는 방식으로 글자 수를 늘릴 수 있습니다.- 예를 들어
싫어어
와싫퍼어
는 같은 명령어입니다.
- 예를 들어
싫어
의 마지막어
글자에 한글 종성 문자를 추가로 조합하여 더 다양한 표현이 가능합니다.- 예를 들어
싫어
에ㅆ
종성을 조합하고다
주석을 붙여싫었다
로 표현 가능합니다.
- 예를 들어
-
브라우니 <연산 명령>
: 현 스택의 맨위 원소에<연산 명령>
을 수행한 결과값을 새 원소로 집어넣습니다. 연산 명령으로 앞서 소개한쪼아
와싫어
를 사용 가능합니다. 다른 연산 명령어는 기존 스택의 원소를 뽑는 걸 전제로 만들어진 명령이라 제외하게 되었습니다.브라우니 좋아
,브라우니 쪼아
,브라우니 쪼아아!!
:좋아
의 경우 현 스택의 맨위 원소를 그대로 새 원소로 집어넣고,쪼아
는 1을 더한 값을 새 원소로 집어넣습니다.브라우니 싫어
:브라우니 싫어어!!
:싫어
는 현 스택의 맨위 원소에 1 을 뺀 값을 새 원소로 집어넣고,싫어어!!
는 5를 뺀 값을 새 원소로 집어넣습니다.- 현재 위치의 스택이 비어 있는 경우 0 을 집어넣습니다.
-
죽어
,죽어어
,죽어어!!
: 스택의 위쪽에서 글자 수 만큼 뽑아 그 합을 느낌표 갯수 만큼의 스택으로 이동하고 넣습니다. 0번째 스택은 표준입력 역할을 하기에 뽑은 글자를 이동할 수 없습니다. 느낌표 갯수가 0개인 경우 글자 수 만큼 뽑지 않고 글자수 만큼의 원소를 새로 복사해서 넣습니다.죽
와어
사이에어
이외에 한글 음절 문자를 추가적으로 넣는 방식으로 글자 수를 늘릴 수 있습니다.- 예를 들어
죽어어
와죽으어
는 같은 명령어입니다.
- 예를 들어
죽어
의 마지막어
글자에 한글 종성 문자를 추가로 조합하여 더 다양한 표현이 가능합니다.- 예를 들어
죽어
에ㅆ
종성을 조합하고다
주석을 붙여싫었다
로 표현 가능합니다.
- 예를 들어
-
으악
,으아악
,으아악!!
:으
와악
사이에아
를 갯수 제한 없이 넣을 수 있으며, 스택의 위쪽에서 글자 수 만큼 복사하여 느낌표 갯수 만큼의 스택에 넣습니다.- 예를 들어
으악!!
은 원소 2개를 2번 스택에 복사하여 넣습니다. 으
와악
사이에아
이외에 한글 음절 문자를 추가적으로 넣는 방식으로 글자 수를 늘릴 수 있습니다.- 예를 들어
으아악
와으악악
,으어악
은 같은 명령어입니다.
- 예를 들어
- 주의할 점으로 복사하여 붙여넣었을 때 원소의 순서를 유지하며 넣습니다. 현 스택에
1
과2
가 차례대로 있다고 가정하면,으악!
명령으로 1번째 스택은 현재 스택과 같은 순서의 같은 원소가 넣어집니다.
- 예를 들어
-
쒸익
,쒸이익
,쒸이익!!
, 또는씨익
,씨이익
,씨이익!!
또는씨X
,씨이X
,씨이X!!
: 스택의 위쪽에서 글자 수 만큼 뽑아 느낌표 갯수 만큼의 스택에 이동하고 넣습니다.- 현재 0번 스택에 위치해 있고 비어 있는 경우, 이동할 스택에 넣을 원소가 없기 때문에 뽑기 과정만 수행을 합니다.
- 예를 들어
쒸익!
명령으로B
(U+0042)가 입력이 되면 원소42
이 현재 스택에 저장을 하고 1번 스택으로 이동합니다.
- 예를 들어
쒸
와익
사이에이
이외에 한글 음절 문자를 추가적으로 넣는 방식으로 글자 수를 늘릴 수 있습니다.- 예를 들어
쒸이읔익
와쒸이익잌
은 같은 명령어입니다.
- 예를 들어
- 현재 0번 스택에 위치해 있고 비어 있는 경우, 이동할 스택에 넣을 원소가 없기 때문에 뽑기 과정만 수행을 합니다.
-
느낌표 없이 글자 수만 있는 경우 뽑기 연산만 수행합니다.
-
글자 수 없이 느낌표만 있는 경우
(느낌표 갯수 - 1)
만큼의 스택으로 이동만 합니다. 0번째 스택으로 이동을 지원하기 위해 오프셋을-1
로 설계를 했습니다. -
트위치
,최고
,간땡이의 담력
3: 현재 스택의 모든 값의 부호를 바꾸기 -
어디서
,근육질
남자
좀
떨어졌으면
,좋겠다
: 현재 스택의 모든 값을 느낌표 갯수 번째의 스택으로 옮깁니다.- 예를 들어
어디서!
,근육질!
,남자!
모두 현재 스택의 모든 값을 표준출력 역할을 하는 첫번쨰 스택으로 이동하여 출력이 됩니다.
- 예를 들어
안뇽 <명령어1> <명령어2>
: 현재 위치한 스택에 값 두개를 뽑아 비교합니다. 먼저 뽑아낸 값이 더 크거나 같으면<명령어1>
을 실행하고 아니면<명령어2>
를 실행합니다.안뇽 으악 쪼오오아
: 먼저 뽑아낸 값이 크면으악
을 명령을 실행하고 아니라면쪼오오아
를 실행합니다.
글글글글
<반복할 명령 블럭>
빵떡아
빵떡아
예약어에 뒤따라 나오는 느낌표 갯수가 없으면 현재 위치한 스택이 비어질 때까지 반복하고, 있으면 느낌표 갯수만큼 글글글글
과 빵떡아
사이에 입력된 명령어를 다시 반복합니다. 빵떡아
에도 글자수 개념이 있어 빵떡아아
, 빵떡아아아!!
가 있고 (글자수 - 2)
와 느낌표 갯수를 곱한 만큼 반복을 합니다. 글글글글
예약어의 별칭alias으로 글러먹은
또는 스트리머
가 있습니다.
글러먹은 <명령> 빵떡아
스트리머 <명령> 빵떡아
따라서 위 두 라인은 <명령>
을 동일한 횟수로 반복을 합니다.
반복 시작 범위를 지정하는 글글글글
예약어가 여러번 입력이 된 경우 가장 마지막에 명령한 글글글글
을 반복 시작 범위로 설정합니다.
글글글글 쪼아 스트리머 쪼아!! 빵떡아
따라서 위 코드는 스트리머
와 빵떡아
사이에 있는 쪼아!!
명령을 스택에서 뽑은 숫자 4만큼 반복을 합니다.
글글글글
예약어가 코드 맨 위줄을 반복 시작 줄로 자동 설정합니다.
파일 확장자로 .totem
를 사용합니다.
TC39의 명세 제안 과정을 차용해서 언어 설계의 진행도를 4가지로 구분합니다.
단계 | 진입 기준 | 진입 시 명세의 품질 | 예상되는 구현 유형 |
---|---|---|---|
0 | 첫 단계 | 미완성 | |
1 | 초안 완성 | 튜링 완전 및 다양한 예제 | |
2 | 연두님이 이 언어의 존재를 인지 | 커뮤니티 피드백이 반영됨 | |
3 | 미정 | 실행 가능한 인터프리터 구현체 및 웹 플레이그라운드 제공 |
현재 단계: 0