아희는 한글로 된 난해한 프로그래밍 언어입니다.
주의! 아래의 스펙은 미완성이며 뒷날에 바뀔 수 있습니다.
인터프리터가 아희를 실행하는 방법은 funge와 비슷합니다. 즉, 코드 공간 안에 커서가 있어서 커서가 위치한 곳에 적혀 있는 명령을 수행하고, 또 그 명령에 따라 커서가 움직이는 것입니다. 하지만, 그 코드가 ASCII가 아니라 한글이라는 점이 다릅니다.
한글은 홀소리와 닿소리로 나눌 수 있습니다. 홀소리는 커서가 이동할 방향을 지정하고, 닿소리는 인터프리터가 수행할 명령을 지정합니다. 받침이 있는 글자는 닿소리가 두 개가 되는데, 이 때 받침은 명령을 보조하는 인자로 작용합니다. (사용되지 않는 받침은 모두 무시됩니다.) 커서가 글자 위에 오게 되면 닿소리부터 실행한 다음 홀소리에 따라서 움직입니다.
커서는 코드 공간의 맨 첫 줄 맨 첫번째 칸에서 시작합니다. 맨 처음에 홀소리가 없을 경우 커서는 기본값으로 아랫쪽으로 이동하는데, 이는 #!과 호환시키기 위한 것으로, 기본 방향이 오른쪽인 funge와는 다른 점입니다.
코드 공간의 한 쪽 끝에 다다르면 커서는 반대편 끝으로 이동합니다. 이는 Funge-98의 wrapping algorithm과 동일합니다.
아희에서 쓰이는 저장 공간은 여러 개가 있습니다. 대부분이 스택이고, 큐가 하나 있습니다. 그리고 확장기능과 소통하는 통로가 있는데, 스택과 마찬가지로 씁니다. 집어넣기(push)로 인수를 전달하고 뽑아내기(pop)로 결과를 받아옵니다. 중복 명령을 포함한 모든 뽑아내기를 쓰는 명령에서 저장 공간에 값이 모자랄 경우, 커서는 그 명령을 실행하지 않고 커서가 있는 글자의 홀소리의 반대방향으로 움직입니다.
각 홀소리의 기능은 다음과 같습니다.
각 닿소리의 기능은 다음과 같습니다.
ㅇ 묶음
ㄷ 묶음 - 셈
ㅁ 묶음 - 저장공간
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다. 나머지 받침은 뽑아낸 값을 그냥 버립니다. ㅂ도 마찬가지로 ㅇ받침이 있으면 입력받은 숫자를, ㅎ받침이 있으면 입력받은 문자의 유니코드 코드값을 저장공간에 집어넣습니다.
단, ㅂ의 경우 나머지 받침이 있으면 그 받침을 구성하는 선의 수에 따른 값을 집어넣습니다. 받침이 없으면 0을 집어넣습니다.
| ㄱ | ㄴ | ㄷ | ㄹ | ㅁ | ㅂ | ㅅ | ㅈ | ㅊ | ㅋ | ㅌ | ㅍ | |
| 2 | 2 | 3 | 5 | 4 | 4 | 2 | 3 | 4 | 3 | 4 | 4 | |
| ㄲ | ㄳ | ㄵ | ㄶ | ㄺ | ㄻ | ㄼ | ㄽ | ㄾ | ㄿ | ㅀ | ㅄ | ㅆ |
| 4 | 4 | 5 | 5 | 7 | 9 | 9 | 7 | 9 | 9 | 8 | 6 | 4 |
받침 중에는 1획인 것이 없는데, 1은 2/2나 3-2 같은 셈으로 간단하게 만들 수 있습니다. 예: `반밧나`, `밪반타` 등.
ㅅ 묶음 - 제어, 저장공간 확장
ㅅ나 ㅆ으로 선택할 수 있는 스택은 (받침 없음), ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅅ, ㅈ, ㅊ, ㅋ, ㅌ, ㅍ, ㄲ, ㄳ, ㄵ, ㄶ, ㄺ, ㄻ, ㄼ, ㄽ, ㄾ, ㄿ, ㅀ, ㅄ, ㅆ이 있습니다. ㅇ은 큐이며, ㅎ을 선택하면 확장 기능과 소통하기 위한 통로가 선택됩니다.
처음에 선택되어 있는 스택은 (받침 없음) 스택입니다. ("사" 와 같은 명령으로 선택할 수 있습니다.)
코드는 UTF-8로 된 텍스트 형식입니다. 코드는 한글로만 이루어지는데, 여기서 한글은 유니코드 U+AC00에서 U+D7A3까지의 범위에 있는 글자(Hangul Syllable 영역)를 말합니다. 그 밖의 글자나 코드에서 지정하지 않은 나머지 공간은 모두 빈 칸으로 처리되어 커서가 이동하는 방향에 아무 영향을 주지 않습니다.
다음은 "Hello, world!"를 출력하는 프로그램입니다.
더 많은 코드는 코드를 참고하세요.