개요
개요
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];
}
아, 이 예시에서는 몇가지 주의할 사항이 있습니다.
-
배열의 길이를 구하는 함수는 len을 사용할 수 있습니다.
-
print는 내장 키워드로, 콘솔에 출력을 합니다. 안타깝게도 아직은 키워드로 구현이 되어 있습니다. 빠른 시일내로 내장 함수로 변경할 예정입니다. (괄호가 없다는 것에 주의하세요!)
-
배열은 혼합 타입을 가질 수 있습니다.
-
배열의 인덱스는 0부터 시작합니다.
-
인덱스를 더할때
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 클래스의 모든 메소드를 지원합니다. (언젠가는요! 아직은 아래에 명시된 몇몇 함수들만 지원됩니다.)
-
locator(selector: string) 이 함수는 playwright의 locator 함수를 실행하고, Locator 오브젝트를 반환합니다.
-
screenshot() 이 함수는 현재 페이지의 스크린샷을 찍고, Image 오브젝트를 반환합니다.
5. class Locator
Locator 클래스는 playwright의 Locator 클래스를 wrapping한 클래스입니다. 이 클래스는 playwright의 Locator 클래스의 모든 메소드를 지원합니다. (언젠가는요! 아직은 아래에 명시된 몇몇 함수들만 지원됩니다.)
-
locator(selector: string) 이 함수는 현재 locator 하위의 엘리먼트에 대해 locator 함수를 실행하고, Locator 오브젝트를 반환합니다.
-
text() playwright의 locator.TextContent 함수를 실행합니다.
-
click() playwright의 locator.Click 함수를 실행합니다.
-
first() playwright의 locator.First 함수를 실행합니다.
-
last() playwright의 locator.Last 함수를 실행합니다.
-
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};
이는 이미지를 저장하고, 이미지의 경로를 반환합니다. 이는 특수한 동작입니다.