Arbiter 스크립트 구문¶
Arbiter 스크립트는 Pipeline과 동일한 Platypus 언어 구문을 사용합니다.
식별자와 키워드¶
식별자¶
식별자는 객체를 식별하는 데 사용되며, 변수, 함수 등을 나타낼 수 있습니다. 식별자에는 키워드가 포함됩니다. 사용자 정의 식별자는 키워드와 중복될 수 없습니다.
식별자는 숫자(0-9), 문자(A-Z a-z), 밑줄(_)로 구성되며, 숫자로 시작할 수 없고 대소문자를 구분합니다. 예시:
_abcabcabc1abc_1_
식별자가 문자나 밑줄로 시작하지 않아야 하거나 특수 문자를 포함해야 하는 경우, 백틱으로 감싸야 합니다. 예시:
1abc@some-variable这是一个表情包变量👍
키워드¶
키워드는 if, elif, else, for, in, break, continue, nil 등과 같이 특별한 의미를 가진 단어로, 변수명, 상수명, 함수명으로 사용할 수 없습니다.
주석¶
#을 행 주석 기호로 사용하며, 인라인 주석은 지원하지 않습니다. 예시:
내장 데이터 타입¶
변수의 값은 동적으로 변할 수 있지만, 각 값은 명확한 데이터 타입을 가지며, 기본 타입과 복합 타입으로 나뉩니다.
기본 타입¶
정수(int) 타입¶
정수 타입은 64비트 부호 있는 정수이며, 현재는 십진수 표기만 지원합니다. 예: -1, 0, 1, +19.
부동소수점(float) 타입¶
부동소수점 타입은 64비트 부호 있는 부동소수점 수이며, 현재는 십진수 표기만 지원합니다. 예: -1.00001, 0.0, 1.0, +19.0.
불리언(bool) 타입¶
불리언 타입은 true와 false 두 개의 값만 가집니다.
문자열(str) 타입¶
문자열은 큰따옴표 또는 작은따옴표로 정의할 수 있으며, 여러 줄 문자열은 세 개의 큰따옴표 또는 세 개의 작은따옴표로 감쌀 수 있습니다. 예시:
"hello world"'hello world'"""를 사용한 여러 줄 문자열 표현
'''를 사용한 여러 줄 문자열 표현
복합 타입¶
복합 타입에는 map과 list가 있으며, 이들은 참조 타입입니다. 여러 변수가 동일한 객체를 가리킬 수 있으며, 할당 시 메모리 복사가 발생하지 않습니다.
Map 타입¶
map은 키-값 쌍 구조입니다. 키는 문자열 타입만 가능하며, 값은 모든 타입이 가능합니다. 인덱스 표현식을 통해 요소를 읽고 씁니다. 예시:
a = {
"1": [1, "2", 3, nil],
"2": 1.1,
"abc": nil,
"def": true
}
# a["1"]은 list 객체이므로, b는 단지 a["1"]의 값을 참조합니다
b = a["1"]
"""
이 시점에서 a["1"][0] == 1.1
"""
b[0] = 1.1
List 타입¶
list는 임의의 개수와 타입의 값을 저장할 수 있으며, 인덱스 표현식을 통해 요소를 읽고 씁니다. 예시:
연산자¶
Platypus는 다음과 같은 연산자를 지원하며, 우선순위는 낮은 것부터 높은 순서입니다:
| 우선순위 | 기호 | 결합성 | 설명 |
|---|---|---|---|
| 1 | `=` | 오른쪽 | 할당; 명명된 인자; 우선순위 가장 낮음 |
| 1 | `+=` | 오른쪽 | 할당, 왼쪽 피연산자 = 왼쪽 피연산자 + 오른쪽 피연산자 |
| 1 | `-=` | 오른쪽 | 할당, 왼쪽 피연산자 = 왼쪽 피연산자 - 오른쪽 피연산자 |
| 1 | `*=` | 오른쪽 | 할당, 왼쪽 피연산자 = 왼쪽 피연산자 * 오른쪽 피연산자 |
| 1 | `/=` | 오른쪽 | 할당, 왼쪽 피연산자 = 왼쪽 피연산자 / 오른쪽 피연산자 |
| 1 | `%=` | 오른쪽 | 할당, 왼쪽 피연산자 = 왼쪽 피연산자 % 오른쪽 피연산자 |
| 2 | `||` | 왼쪽 | 논리 OR |
| 3 | `&&` | 왼쪽 | 논리 AND |
| 4 | `in` | 왼쪽 | 키가 map에 있는지 확인; 요소가 list에 있는지 확인; 부분 문자열이 문자열에 포함되었는지 확인 |
| 5 | `>=` | 왼쪽 | 조건 "크거나 같음" |
| 5 | `>` | 왼쪽 | 조건 "큼" |
| 5 | `!=` | 왼쪽 | 조건 "같지 않음" |
| 5 | `==` | 왼쪽 | 조건 "같음" |
| 5 | `<=` | 왼쪽 | 조건 "작거나 같음" |
| 5 | `<` | 왼쪽 | 조건 "작음" |
| 6 | `+` | 왼쪽 | 산술 "더하기" |
| 6 | `-` | 왼쪽 | 산술 "빼기" |
| 7 | `*` | 왼쪽 | 산술 "곱하기" |
| 7 | `/` | 왼쪽 | 산술 "나누기" |
| 7 | `%` | 왼쪽 | 산술 "나머지" |
| 8 | `!` | 오른쪽 | 단항 연산자; 논리 "부정", 내장된 6가지 데이터 타입에 사용 가능 |
| 8 | `+` | 오른쪽 | 단항 연산자; 양수 부호, 양수를 나타내는 데 사용 |
| 8 | `-` | 오른쪽 | 단항 연산자; 음수 부호, 부호 반전 및 음수 표현에 사용 |
| 9 | `[]` | 왼쪽 | 첨자 연산자; list 인덱스 또는 map의 키를 사용하여 값에 접근 |
| 9 | `()` | 왼쪽 | 연산자 우선순위 변경 가능; 함수 호출 |
표현식¶
Platypus는 쉼표 ,를 표현식 구분자로 사용합니다. 표현식은 값을 가질 수 있지만, 문은 값을 갖지 않습니다.
리터럴 표현식¶
각 데이터 타입의 리터럴은 모두 표현식입니다. 예를 들어 정수 100, -1, 0, 부동소수점 1.1, 불리언 true, false 등이 있습니다.
복합 타입의 리터럴 표현식은 다음과 같습니다:
- List 리터럴 표현식
- Map 리터럴 표현식
호출 표현식¶
다음은 함수 호출의 예시로, 리스트 요소의 개수를 구합니다:
이항 표현식¶
이항 표현식은 이항 연산자와 왼쪽/오른쪽 피연산자로 구성됩니다.
현재 버전에서 할당 표현식은 이항 표현식에 속하며, 반환값을 가집니다. 그러나 할당 표현식이 일부 문제를 일으킬 수 있으므로, 향후 이 구문은 삭제되고 할당문 구문이 추가될 예정입니다.
# 0
2 / 5
# 0.4, 계산 시 왼쪽 피연산자의 타입이 부동소수점으로 승격됨
2 / 5.0
# true
1 + 2 * 3 == 7 && 1 <= 2
# `=` 연산자의 오른쪽 결합성으로 인해 a = (b = 3), a == 3
b == 3;
a = b = 3
# 참고: 할당 표현식 구문이 곧 폐지될 예정이므로 할당문으로 대체하세요
b = 3
a = b
"a" in [1,"a"] # true
"def" in "abcdef" # true
"a" in {"a": 1} # true
"b" in {"a": 1} # false
x = 1; y= [1]
x in y # true
인덱스 표현식¶
[] 첨자 연산자를 사용하여 list 또는 map의 요소를 조작합니다.
인덱스 표현식을 통해 list 또는 map의 요소 값을 읽거나 수정하고, map에 요소를 추가할 수 있습니다.
리스트의 경우 음수 인덱스를 사용할 수 있습니다.
구문 예시:
a = [1, 2 ,3, -1.]
b = {"a": [-1], "b": 2}
a[-1] = -2
b["a"][-1] = a[-1]
# 결과
# a: [1,2,3,-2]
# b: {"a":[-2],"b":2}
괄호 표현식¶
괄호 표현식은 이항 표현식에서 피연산자의 연산 우선순위를 변경할 수 있지만, 결합성은 변경할 수 없습니다:
문¶
Platypus에서 모든 표현식은 값 문으로 간주될 수 있습니다. 표현식이 문 구분 기호 ; 또는 \n으로 끝나면 하나의 문으로 간주됩니다. 다음 스크립트는 네 개의 문을 포함합니다:
값 문 (표현식 문)¶
표현식 뒤에 문 구분 기호가 오면 값 문으로 간주할 수 있습니다. 다음은 네 개의 유효한 문입니다:
할당문¶
구문 예시:
key_a = "key-a"
# 식별자 a를 왼쪽 피연산자로 하여, a에 리스트 리터럴을 할당
a = [1, nil, 3]
# 인덱스 표현식을 왼쪽 피연산자로 사용
a[0] = 0
a[2] = {"key-b": "value-b"}
a[2][key_a] = 123
조건문¶
대부분의 프로그래밍 언어와 마찬가지로, if/elif의 조건이 참인지 여부에 따라 해당 문 블록으로 진입하며, 모두 거짓이면 else 분기로 진입합니다.
현재 condition은 모든 표현식이 될 수 있으며, 그 값이 내장 데이터 타입 중 하나인 경우 해당 값이 타입의 기본값일 때 표현식 값은 false입니다:
- 조건이
int타입 값인 경우,0이면 조건은false, 그렇지 않으면true - 조건이
float타입 값인 경우,0.0이면 조건은false, 그렇지 않으면true - 조건이
string타입 값인 경우, 빈 문자열""이면 조건은false, 그렇지 않으면true - 조건이
bool타입 값인 경우, 조건은 현재 값과 같음 - 조건이
nil타입 값인 경우, 조건은false - 조건이
map타입 값인 경우, 길이가 0이면 조건은false, 그렇지 않으면true - 조건이
list타입 값인 경우, 길이가 0이면 조건은false, 그렇지 않으면true
반복문¶
Platypus는 for 문과 for in 문을 지원합니다.
다음은 반복문 블록 내에서만 사용할 수 있는 두 가지 문입니다:
continue문, 이후 문을 실행하지 않고 다음 반복을 계속 진행합니다.break문, 반복을 종료합니다.
for 문을 사용하면 무한 반복이 발생할 수 있으므로 주의해야 하며, 가능하면 for in 문을 대신 사용하는 것이 좋습니다.
사용 예시:
for를 사용하여 10회 반복:
for in을 사용하여list의 모든 요소 순회:
for in을 사용하여map의 모든 키 순회:
for in을 사용하여string의 모든 문자 순회: