LangDev

열정 프로그래밍 언어 코드 예제

임수서룬뫼

그 유명하다는 99병의 soda pop입니다. 연소자 패치가 적용돼서 그래요. (현재 중2) 능력만 되면 구현 꼭 해보고 싶습니다. 언어 이름은 http://music.naver.com/album.nhn?tubeid=2kk120015832랑 전혀 관련이 없습니다.

-- 99sodapop.me

""->일부분
목록생성(99, 2, 1)로부터 횟수
    {일부분, 횟수, "bottle", 횟수=1이면 "" 아니면 "s", " of soda pop"} 대상출력
        -- 대상출력 함수는 sprintf의 역할을 함
    {일부분, " on the wall!"} 행출력
    {일부분, "!"} 행출력 -- "!\n"을 사용하고 출력 사용 가능
    "Take one down and pass it around\n" 출력 -- \n을 제거하고 행출력 사용 가능
    횟수=2이면 중단
    {횟수 - 1 -> 횟수, "bottles of soda pop on the wall!"} 행출력
    "" 행출력 -- [["\n" 출력]]과 같은 의미이다.
마침
[[\n
1 bottle of soda pop on the wall!
1 bottle of soda pop!
Take on down and pass it around
No bottles of soda pop on the wall!
No bottles of soda pop!
Go to the... -- Not enough mineral\n]] 출력
<!--
    [[...]] 문자열 내부에서는
    --를 사용한 한 줄 주석이
    적용되지 않는다.
-->

Lua와 같이 따로 수치 for문을 제공하지 않고 목록생성 함수를 사용하여 수치의 목록을 생성한 뒤(99, 2, 1을 주면 99에서 2까지 1 간격으로 목록이 생성됩니다.) 그 원소인 "횟수"를 뽑아서 반복합니다. 이러한 제어 구조가 로부터문입니다.

수치를 다루는 자료형은 IEEE 754-1985 double precision floating point를 사용하는 (중형)수치와 최소 64비트 크기를 지니는 정수, 메모리가 남는 한 크기에 제한이 없는 대형(수치)가 있습니다.

문자는 유니코드 코드 포인트 하나씩을 담는데, 정확하게는 UTF-16으로 표현된 것을 실제로(internal representation) 담습니다. 따라서 2바이트 또는 4바이트가 됩니다. 구현에서는 필요한 경우 비표준 확장인 6바이트도 지원할 수 있습니다.

목록은 아무 자료형의 값 여러 개를 늘어놓은 것입니다. 문자 또는 문자열의 목록을 특별히 문자열이라고 합니다. 2개의 원소를 가진 목록을 특별히 순서쌍이라고 하며, 순서쌍의 목록을 특별히 사전이라고 합니다.

변수는 사용하기 전에 선언해야 합니다. 선언의 문법은 반드시 초기화를 동반하며, 변수에 값을 배정하는 데 사용되는 -> 연산자를 사용합니다. 초기화할 때에 ->전역을 사용하면 전역 변수를 선언할 수 있습니다.

-> 연산자의 오른쪽의 기본 또는 사용자 정의 자료형 이름을 사용할 경우 형변환이 됩니다.

열정 프로그래밍 언어의 소스 코드 확장명은 me입니다. 왜 me일까요? 알아맞추시는 분께는 죄송하지만 공허값(nil 또는 null)을 드립니다. 그래도 시도해 보시기 바랍니다.

함수 호출은 단일 매개 변수 뒤에 함수명을 붙이는 방식으로 이루어집니다. 매개 변수 여러 개를 넘겨받을 필요가 있을 경우, 목록(일반 목록 또는 문자열/순서쌍/사전)을 사용하면 됩니다.

주석은 -- (한 줄) 또는 <!-- ... --> (구역)을 사용할 수 있습니다. --|을 이용한 문서화 주석 또한 사용할 수 있습니다. 문서화 주석의 형식은 lifthrasiir님의 naru 프로그래밍 언어에서 차용된 것이며, 자세한 것은 향후 결정할 계획입니다. 아마도 인터프리터에 +d (extract Documentation) 옵션을 주면 이것만 뽑아내줄 겁니다. XML을 지원하는데, well-formed가 아닌 경우 인터프리터에서 오류를 낼 것 같습니다. (단, 루트 노드가 반드시 있을 필요는 없을 것으로 결론될 것 같습니다.)

위 프로그램의 출력 결과는 매우 길기 때문에 생략하겠습니다.

이왕이면 출력하는 내용도 한국말로 하지 그러셨어요. (\n 같은 녀석도.) =3

디토

한말글로 반복되는 노랫말...처럼 편하게 예제 보이는 데 쓸 수 있는 게 없는 것 같아요. 예를 제시해 주세요.

\n과 같은 탈출열은 적절히 바꿀 말이 없군요. 기존의 \ + 1문자 식의 탈출열을 여러 문자를 쓰도록 바꿔볼까요?

"열정짱\줄바꿈"

좀 이상하군요. 위와 같은 경우에는 탈출열이 그것을 제외한 문자열의 나머지 부분보다 길어질지도 모르겠습니다.

임수서룬뫼

"하나면 하나지 둘이겠느냐~" 노래가 있죠. 99병의 맥주보다는 좀 변화가 적지만...; (추가: 이 노래는 숫자를 문자열로 바꿔야 하니 오히려 좋은 예제가 될 수도 있겠네요.)

그리고 "안녕하세요" 줄바꿈 "저는 디토군입니다."처럼 하는 방법도 있겠죠.

디토

표준 C의 매크로와 자동 문자열 달라붙기로도 가능하겠군요.

#define NEWLINE "\n"
puts("안녕하세요" NEWLINE "저는 디토군입니다.");
/* 헉! 거짓을 리턴했다! 이거 뭐지! */

나름 좋기는 합니다...만 \줄바꿈보다 " 줄바꿈 "이 3타, 6바이트(열정은 UTF-16 사용)를 더 소요합니다. 아무래도 \n과 같이 문자열 상수에 내장할 수 있는 좋은 표기가 필요하겠습니다.

그나저나 인라인으로 코드 적용하는 법 좀 알려주세요. --와 <!-- ... -->를 쓰는데 &#45;와 &lt; ~ &gt; 쌍을 썼습니다.

임수서룬뫼

그나저나 저건 절대 beer가 아니라 soda pop입니다. 연소자 패치가 적용되었어요.

임수서룬뫼

\새줄이나 \줄 같은 건 어때요?

홍민희

"\새줄"은 newline, "\줄"은 바꿈인가요? 그런데 이렇게 한글화해도 \uAC00, \20u10FFFF, \32uABCDEF01 같은 건 답이 없는 것 같습니다. (그나저나 \20u10FFFF보다는 \U10FFEF가 나으려나요? 탈출열 안에서만은 대소문자로 문제 일으키기 싫어서요.)

임수서룬뫼

프로그래밍 언어 자체에 대해 고견을 주실 분 없으세요? (흑흑)

임수서룬뫼

언어 자체는 너무 C하고 비슷한 것 같아요. 좀 자연스럽게 (어떻게?) 바꾸면 어떨까요... 키워드 선택도 좀 부적절한 게 있는 것 같고.

디토

저 같은 경우 새로운 언어를 볼 때 표기 방식보다 내재된 철학, 패러다임 쪽에 더 관심이 가는데… 이 예제로는 그런 점들이 잘 보이지 않는 것 같습니다.

홍민희

지금까지의 설계는 사실 표기법에 중점을 둔 겁니다. 사실 기존에 설계하던 프로그래밍 언어(무려 순서쌍 기반, 설계하다가 esolang이 되버린 듯)를 한글화했기 때문에...

임수서룬뫼