개요

개요

Bus Tracker는 간단한 스크립트를 통해 함수를 작성하고, 이를 실행하는 서비스입니다. 이 문서에서는 Bus Tracker의 사용법과 기능에 대해 설명합니다. 이 문서는 사용자가 일정한 수준의 프로그래밍 지식을 가지고 있다고 가정합니다. 따라서 서비스에 특징적인 부분 위주로 설명합니다.


프로그래밍 언어

Bus Tracker는 간단한 스크립트 언어를 사용합니다. 이 언어는 Robert Nystrom이 쓴 craftinginterpreters를 기초로 합니다. 이 섹션에서는 언어에 대해 간단한 설명을 합니다.

1. 세미콜론

맞습니다. 고전적이지만 효과적이지요. 세미콜론은 문장의 끝을 나타냅니다.

var foo = 1;

2. 변수 선언

키워드 var를 통해서 변수를 선언할 수 있습니다. 변수의 타입은 동적이며, 언제나 재 할당이 가능합니다.

var foob = 1.8;

3. 함수 선언

키워드 fun을 사용해서 함수를 선언할 수 있습니다. 키워드 return을 통해서 결과값을 반환할 수 있습니다. 아무것도 없이 return을 사용하면 null을 반환합니다. 반환을 하지 않는다면 자동적으로 null을 반환합니다.

fun add(a, b) {
    return a + b;
}

var x = add(1, 3);

4. 루프문

친숙한 for와 while이 있지요. 안타깝게도 foreach는 없습니다. 옛날 느낌대로 가보자고요.

var arr = [1,2,3, "Hello", "World", true];

for (var i = 0; i < len(arr); i = i + 1) {
    print arr[i];
}

아, 이 예시에서는 몇가지 주의할 사항이 있습니다.

  1. 배열의 길이를 구하는 함수는 len을 사용할 수 있습니다.

  2. print는 내장 키워드로, 콘솔에 출력을 합니다. 안타깝게도 아직은 키워드로 구현이 되어 있습니다. 빠른 시일내로 내장 함수로 변경할 예정입니다. (괄호가 없다는 것에 주의하세요!)

  3. 배열은 혼합 타입을 가질 수 있습니다.

  4. 배열의 인덱스는 0부터 시작합니다.

  5. 인덱스를 더할때 i = i+1을 사용한 것에 주의하세요. 안타깝게도 아직 ++ 연산자는 지원되지 않습니다. Good old days, right?

5. 조건문

간단하지요. if문을 사용할 수 있습니다.

    var a = 1;
    if (a == 1) {
        print "a is 1";
    } else if(a == 2) {
        print "a is not 1";
    } else {
        print "a is not 1 and 2";
    }

6. dictionary

dictionary는 key-value 쌍을 가지는 데이터 구조입니다.

    var dict = {
        name: "John",
        age: 30
    };

    print dict["name"];

dictionary의 key가 문자열이 아닌 단순한 키워드로 이루어진 것을 볼 수 있습니다.


내장 함수 및 타입

Bus Tracker는 다양한 내장 함수들을 제공합니다. 이 섹션에서는 내장 함수들에 대해 설명합니다.

1. sleep(seconds: number)

명확하지요. 주어진 시간동안 멈춥니다. 시간은 초 단위이며, 소수점을 사용할 수 있습니다.

2. get(url: string)

get 함수는 주어진 url로 GET 요청을 보내고, 응답을 반환합니다. 응답의 타입은 response에 기록된 content-type에 따라 달라집니다.

3. browser(url: string)

browser 함수는 주어진 url로 playwright 브라우저를 실행시킵니다. 이 함수는 브라우저를 실행시키고, 페이지가 로드될 때까지 기다립니다. 페이지가 로드되면 Page 오브젝트가 반환됩니다.

4. class Page

Page 클래스는 playwright의 Page 클래스를 wrapping한 클래스입니다. 이 클래스는 playwright의 Page 클래스의 모든 메소드를 지원합니다. (언젠가는요! 아직은 아래에 명시된 몇몇 함수들만 지원됩니다.)

  1. locator(selector: string) 이 함수는 playwright의 locator 함수를 실행하고, Locator 오브젝트를 반환합니다.

  2. screenshot() 이 함수는 현재 페이지의 스크린샷을 찍고, Image 오브젝트를 반환합니다.

5. class Locator

Locator 클래스는 playwright의 Locator 클래스를 wrapping한 클래스입니다. 이 클래스는 playwright의 Locator 클래스의 모든 메소드를 지원합니다. (언젠가는요! 아직은 아래에 명시된 몇몇 함수들만 지원됩니다.)

  1. locator(selector: string) 이 함수는 현재 locator 하위의 엘리먼트에 대해 locator 함수를 실행하고, Locator 오브젝트를 반환합니다.

  2. text() playwright의 locator.TextContent 함수를 실행합니다.

  3. click() playwright의 locator.Click 함수를 실행합니다.

  4. first() playwright의 locator.First 함수를 실행합니다.

  5. last() playwright의 locator.Last 함수를 실행합니다.

  6. all() playwright의 locator.All 함수를 실행합니다.

6. class Image

이미지를 나타내는 클래스입니다. 이 클래스를 함수에서 반환한다면, 이미지 파일이 저장됩니다. 일반적으로 get 함수를 통해서 이미지를 다운받거나 screenshot 함수를 통해서 이미지를 얻을 수 있습니다.

var page = browser("https://example.com");
var img = page.screenshot();

return img;

함수 실행과 결과

좋아요. 가장 즐거운 시간이군요. 함수를 실행해봅시다.

fun fb(n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return fb(n-1) + fb(n-2);
    }
}

return fb(10);

이 함수는 피보나치 수열을 구하는 함수입니다. 이 함수를 실행하면 10번째 피보나치 수열을 반환합니다. 가장 바깥에서 return을 사용하는것을 볼 수 있습니다. 이는 이 코드가 하나의 함수로써 실행되기 때문입니다.

몇몇 오브젝트는 반환시 특수하게 동작합니다. 예를들어 json 형식으로 반환할 수 있습니다.

var dict = {
    name: "John",
    age: 30
};

return dict;

이는 그대로 반환값을 가지게됩니다.

만약 Image 오브젝트를 반환한다면, 이는 특수하게 동작합니다.

var page = browser("https://example.com");
var img = page.screenshot();

return {screenshot: img};

이는 이미지를 저장하고, 이미지의 경로를 반환합니다. 이는 특수한 동작입니다.