yaksok.js 도움말


들어가며

약속은 한글을 사용하는 사람들 누구나 쉽게 프로그래밍을 배울 수 있게 하기 위해 만들어진 언어입니다. 처음 프로그래밍을 접하는 사람들이 실수하기 쉬운 표현들을 최소화하고 누구나 알아보기 쉬운 코드를 만들 수 있게 하는 것이 목표입니다. - 약속 공식 명세에서

yaksok.js는 한글 프로그래밍 언어 약속을 다루기 위한 자바스크립트 라이브러리입니다.

이 문서는 yaksok.js의 사용법과 약속 프로그래밍 언어에 대한 이해를 돕기 위해 제작되었습니다.

yaksok.js 맛보기

12 + 5*6 보여주기 # 42가 출력된다
약속 (X)의 (Y)제곱
    결과: 1
    반복 1~Y 의 반복횟수 마다
        결과: 결과 * X

(3의 5제곱) 보여주기 # 243이 출력된다
약속 (음식) 좋아함
    결과: 참

약속 (음식) 시키기
    "중국집에 전화해서 " + 음식 + " 시켰다" 보여주기

만약 ("짜장면" 좋아함) 이면
    만약 ("짬뽕" 좋아함) 이면
        "짬짜면" 시키기
    아니면
        "짜장면" 시키기
아니면서 만약 ("짬뽕" 좋아함) 이면
    "짬뽕" 시키기
아니라면
    "대충" 시키기

# 중국집에 전화해서 짬짜면 시켰다

yaksok.js와 약속 레퍼런스 구현의 가장 큰 차이점은 약속 선언 방식입니다. 인자를 괄호 사이에 넣기 때문에 약속 선언에서 변하지 않는 부분과 변하는 부분을 더 쉽게 구현할 수 있습니다.

소스 코드 컴파일은 어떻게 하나요

코드를 통해 컴파일하는 방법

yaksok.js는 UMD import를 지원합니다. AMD, CommonJS, global 등 환경에 맞게 편한 방식으로 import 할 수 있습니다. 아래 예제에서는 CommonJS 방식을 사용합니다.

var yaksok = require('yaksok'); //yaksok import
var compiler = new yaksok.compiler.JsTargetCompiler(); //컴파일러
compiler.plugins.add(new yaksok.plugin.ConstantFolder({ dce: true })); //optional

//컴파일 수행
compiler.compile(yaksokCode).then(function (jsCode) {
    console.log(jsCode);
});

커맨드라인 툴을 이용해 컴파일하는 방법

  1. npm을 이용하기 위해 먼저 node.js를 설치합니다.
  2. npm install -g yaksok
  3. ysjs compile "약속파일.yak" 또는 ysjs compile "약속파일.yak" -o "결과파일.js"

yaml 파일을 이용하는 방법

  1. pakcage.yaml 파일을 만들고 다음과 같이 입력합니다.
시작: 메인
결과: result.js
  1. 메인.약속 혹은 메인.yak 파일을 만들고 다음과 같이 입력합니다.
'안녕하세요' 보여주기
  1. 다음과 같이 컴파일하고 실행해봅니다.
$ ysjs compile
$ node result
안녕하세요

약속 문법

yaksok.js에서 사용하는 약속 문법은 약속의 레퍼런스 문법과 차이가 있을 수 있습니다.

1. 값

yaksok.js는 다음 다섯 종류의 값을 지원하고 있습니다.

문자열

참, 거짓

배열

사전

2. 변수

변수 선언은 :(콜론)을 이용합니다. 변수를 이용해 값에 이름을 붙여 재사용 할 수 있습니다. 변수 선언은 변수명 : 값으로 선언하며, 값을 갱신할 때도 같은 문법을 이용합니다.

변수 이름 규칙

변수 이름으로는 한글, 알파벳, 숫자, _(언더바), $(달러)를 사용할 수 있습니다. 숫자는 변수의 첫 글자에는 올 수 없습니다.

추천도서: ['노인과 바다', '톨스토이 전집', '1984']
내가읽는책: 추천도서[3]

현재시간: 14
마지막식사시간: 12
배고픔: 현재시간 - 마지막식사시간 > 4 # 거짓

3. 코드 작성

약속은 Python과 비슷하게 하나의 줄에 하나의 문장을 입력합니다.

인코딩과 줄 구분

기본 인코딩으로 utf-8을 사용하며, CRLFLF로 줄을 구분합니다. 한 줄에는 하나의 문장만이 들어가지만 (), {}, [] 등의 괄호쌍 내부에서는 줄구분을 하지 않습니다. 따라서 배열, 사전 등은 여러 줄에 걸쳐 사용할 수 있습니다.

확장자

.yak.약속 확장자를 사용합니다.

주석

#(샵) 문자 뒤에 코드를 입력하면 주석으로 처리되어 프로그램의 실행에 영향을 미치지 않게 됩니다.

블록

블록은 동일한 개수의 공백 문자로 시작하는 문장들입니다. 약속 정의, 조건문, 반복문 등을 사용할 때는 안쪽 문장과 바깥쪽 문장을 구분하기 위해 블록을 이용합니다. 블록 안에는 하나 이상의 문장이 들어갈 수 있습니다.

블록의 공백 문자 개수를 계산할 때 탭 문자는 8개의 공백 문자로 처리합니다. 연속된 줄구분 문자는 하나의 줄구분 문자로 처리하기 때문에 빈 줄이 발생해도 블록이 닫히지 않습니다.

아래 예시를 참고해주세요(약속 코드가 아닙니다).

블록 1입니다
계속 블록 1입니다
    블록 2입니다 # 여기는 주석입니다
        블록 3입니다
    다시 블록 2입니다

    아직도 블록 2입니다

4. 약속

'약속'은 약속 언어의 핵심 기능으로, 다른 프로그래밍 언어의 함수에 대응되는 기능입니다. 여러 번 반복되는 기능을 약속으로 만들어 사용하면 좀 더 쉽고 이해하기 쉬운 표현이 가능합니다.

약속을 정의하려면

약속은 변하는 부분과 변하지 않는 부분으로 구성됩니다. 변하는 부분은 괄호로 감싸 표현하고, 변하지 않는 부분은 그대로 작성합니다. 문장의 가장 앞쪽에 약속을 입력하고, 그 뒤부터 약속의 정의를 입력합니다. 약속 정의 부분에서는 연속된 공백문자는 하나의 공백문자처럼 다뤄집니다.

예를 들어, 다양한 음식을 먹는 약속은 약속 (음식) 먹기처럼 정의할 수 있습니다.

약속 블록

약속 정의 부분 다음 블록에는 약속의 내용을 작성합니다. 약속 블록에서는 약속 정의 부분의 변하는 부분들을 변수처럼 사용할 수 있습니다.

약속 (음식) 먹기
    음식 + " 잘 먹었다!" 보여주기
    결과: "빈 접시"
    약속 그만
    "더 먹을거야" 보여주기

약속 블록에서는 다음과 같은 문법을 사용할 수 있습니다.

결과 반환하기

결과라는 변수에 내용을 담으면 약속을 사용할 때 결과를 받아서 사용할 수 있습니다.

약속 그만

약속 그만 문장을 만나면 거기서 약속의 실행이 종료니다. 조건문 등으로 분기를 나눌 때 유용하게 사용할 수 있습니다.

약속 사용하기

약속을 사용하려면 약속 정의 부분의 '변하는 부분'에 실제 값을 넣으면 됩니다. 위의 약속 (음식) 먹기"탕수육" 먹기, "고기" 먹기 등으로 사용할 수 있습니다.

약속을 여러 개 중첩해서 사용하는 것도 가능합니다. 이럴 때는 주변에 괄호를 쳐서 약속을 구분합니다.

약속 (재료)로/으로 요리하기
    결과: "정체불명의 요리"

약속 (음식) 먹기
    음식 + " 먹었다!" 보여주기 # 정체불명의 요리 먹었다!

("오징어"로 요리하기) 먹기
조사 사용하기

약속을 정의할 때, 변하지 않는 부분에 /(슬래시)를 넣어 여러 조사를 사용할 수 있습니다. 예를 들어, 약속 (재료)로/으로 요리하기 약속은 "오징어"로 요리하기, "밥"으로 요리하기 등으로 사용할 수 있습니다.

(값) 보여주기

기본적으로 약속 (값) 보여주기가 정의되어 있습니다. 값들을 확인하고 싶을 때 보여주기 약속을 사용할 수 있습니다.

5. 바깥

약속 블록의 내부에는 그 약속 내부에서만 사용되는 특별한 변수공간(스코프)이 생성됩니다.

약속 (재료) 튀기기
    튀김옷_입힌_재료: "밀가루" + 재료 # 튀김옷_입힌_재료 변수는 변수공간 안쪽에 정의된다
    결과: "기름" + 튀김옷_입힌_재료
"양파" 튀기기
튀김옷_입힌_재료 보여주기 # 여기서는 접근할 수 없어서 에러가 발생한다

그래서 다음과 같은 코드는 원하는대로 동작하지 않습니다.

지능: 1
약속 전공책 읽기
    지능: 지능 + 1 # 변수공간 내부에 새로운 지능 변수를 생성한다
전공책 읽기
지능 보여주기 # 여전히 지능은 1이 출력된다

이런 경우 바깥 키워드를 사용하면 변수공간 밖의 변수를 가리킬 수 있습니다.

지능: 1
약속 전공책 읽기
    바깥 지능
    지능: 지능 + 1 # 변수공간 밖의 지능 변수를 업데이트한다
전공책 읽기
지능 보여주기 # 지능이 2가 되었다

6. 조건문

조건문은 만약 키워드를 이용합니다. 조건들은 또는 거짓 값이고, 그리고/이고또는/이거나를 이용해 결합할 수 있습니다.

아래는 조건문의 예시 코드입니다. 슬래시로 구분된 단어들은 어떤 것을 선택해도 무방함을 의미합니다.

만약 (조건1) 이면/이라면
    # 조건1이 참이라면 실행
아니면/아니라면/아니면서 만약 (조건2) 이면/이라면
    # 조건1이 거짓이고, 조건2가 참이라면 실행
아니면/아니라면
    # 조건1과 조건2가 모두 거짓이라면 실행

아니면서가 사용된 경우, 만약 키워드는 생략해도 됩니다.

만약 (조건1) 이면/이라면
    # 조건1이 참이라면 실행
아니면서 (조건2) 이면/이라면
    # 조건1이 거짓이고, 조건2가 참이라면 실행

7. 반복문

약속에서 반복문을 쓰려면 반복 키워드를 사용합니다. 반복문에는 두 종류가 있습니다.

반복

현재시간: 12
반복
    현재시간: 현재시간 + 1
    만약 현재시간 = 18 이면
        "저녁밥" 보여주기
        반복 그만

반복 하나만 사용할 경우 다음 블록의 문장들이 순서대로 계속 실행되며, 반복 그만으로 반복을 종료할 수 있습니다.

반복 ~의 ~마다

배열 안의 값 하나하나에 대해 반복문을 실행할 수 있습니다. 배열 안의 값들을 마다 앞에 지정된 이름의 변수처럼 사용할 수 있습니다.

약속 (식사) 먹기
    식사 + " 냠냠쩝쩝" 보여주기

하루: ["아침", "점심", "저녁"]
반복 하루 의 끼니 마다
    끼니 먹기 # 끼니를 변수처럼 사용. 끼니 변수에 "아침", "점심", "저녁"이 들어간다.
범위

특정 범위를 표현하기 위해 시작~끝 표현을 사용할 수 있습니다. 다음과 같이 응용해서 사용할 수 있습니다.

반복 1~100 의 반성문횟수 마다
    반성문횟수 + "번째 반성문을 썼다" 보여주기

범위와 배열은 반복문에서 거의 유사하게 사용할 수 있지만 몇 가지 차이점이 있습니다. 범위에는 범위.시작 범위.끝을 이용해 범위의 시작과 끝 값을 알아내는 기능이 있습니다. 또한 범위는 대괄호를 이용해 값을 뽑아 사용할 수 없습니다.

8. 고급 기능

모듈

다른 파일에 있는 약속을 사용할 수 있습니다. 약속 사용 문장 앞에 @파일명을 붙이면 됩니다.

# 요리책.yak
약속 (재료) 굽기
    "구웠다" 보여주기

약속 (재료) 튀기기
    "튀겼다" 보여주기

# 요리사.yak
@요리책 "돌멩이" 굽기
@요리책 "칫솔" 튀기기

번역

약속의 FFI(Foreign Function Interface)로 컴파일 될 내용을 직접 작성하는 기능입니다. 번역(언어명) 약속정의 안쪽에 * 기호 세 개를 블럭 앞뒤에 붙이고 그 안쪽에 내용을 직접 작성하면 됩니다.

번역(자바스크립트) (내용) 경고하기
***
    window.alert(내용);
***

참고자료