콘텐츠로 이동

Arbiter 스크립트 구문


Arbiter 스크립트는 Pipeline과 동일한 Platypus 언어 구문을 사용합니다.

식별자와 키워드

식별자

식별자는 객체를 식별하는 데 사용되며, 변수, 함수 등을 나타낼 수 있습니다. 식별자에는 키워드가 포함됩니다. 사용자 정의 식별자는 키워드와 중복될 수 없습니다.

식별자는 숫자(0-9), 문자(A-Z a-z), 밑줄(_)로 구성되며, 숫자로 시작할 수 없고 대소문자를 구분합니다. 예시:

  • _abc
  • abc
  • abc1
  • abc_1_

식별자가 문자나 밑줄로 시작하지 않아야 하거나 특수 문자를 포함해야 하는 경우, 백틱으로 감싸야 합니다. 예시:

  • 1abc
  • @some-variable
  • 这是一个表情包变量👍

키워드

키워드는 if, elif, else, for, in, break, continue, nil 등과 같이 특별한 의미를 가진 단어로, 변수명, 상수명, 함수명으로 사용할 수 없습니다.

주석

#을 행 주석 기호로 사용하며, 인라인 주석은 지원하지 않습니다. 예시:

# 이것은 한 줄 주석입니다
a = 1 # 이것은 한 줄 주석입니다

"""
이것은 (여러 줄) 문자열로, 주석을 대체합니다
"""
a = 2

"문자열"
a = 3

내장 데이터 타입

변수의 값은 동적으로 변할 수 있지만, 각 값은 명확한 데이터 타입을 가지며, 기본 타입과 복합 타입으로 나뉩니다.

기본 타입

정수(int) 타입

정수 타입은 64비트 부호 있는 정수이며, 현재는 십진수 표기만 지원합니다. 예: -1, 0, 1, +19.

부동소수점(float) 타입

부동소수점 타입은 64비트 부호 있는 부동소수점 수이며, 현재는 십진수 표기만 지원합니다. 예: -1.00001, 0.0, 1.0, +19.0.

불리언(bool) 타입

불리언 타입은 truefalse 두 개의 값만 가집니다.

문자열(str) 타입

문자열은 큰따옴표 또는 작은따옴표로 정의할 수 있으며, 여러 줄 문자열은 세 개의 큰따옴표 또는 세 개의 작은따옴표로 감쌀 수 있습니다. 예시:

  • "hello world"
  • 'hello world'
  • """를 사용한 여러 줄 문자열 표현
"""hello
world"""
  • '''를 사용한 여러 줄 문자열 표현
'''
hello
world
'''

복합 타입

복합 타입에는 maplist가 있으며, 이들은 참조 타입입니다. 여러 변수가 동일한 객체를 가리킬 수 있으며, 할당 시 메모리 복사가 발생하지 않습니다.

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는 임의의 개수와 타입의 값을 저장할 수 있으며, 인덱스 표현식을 통해 요소를 읽고 씁니다. 예시:

a = [1, "2", 3.0, false, nil, {"a": 1}]

a = a[0] # a == 1

연산자

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 리터럴 표현식
[1, true, "1", nil]
  • Map 리터럴 표현식
{
  "a": 1,
  "b": "2",
}

호출 표현식

다음은 함수 호출의 예시로, 리스트 요소의 개수를 구합니다:

len([1, 3, "5"])

이항 표현식

이항 표현식은 이항 연산자와 왼쪽/오른쪽 피연산자로 구성됩니다.

현재 버전에서 할당 표현식은 이항 표현식에 속하며, 반환값을 가집니다. 그러나 할당 표현식이 일부 문제를 일으킬 수 있으므로, 향후 이 구문은 삭제되고 할당문 구문이 추가될 예정입니다.

# 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}

괄호 표현식

괄호 표현식은 이항 표현식에서 피연산자의 연산 우선순위를 변경할 수 있지만, 결합성은 변경할 수 없습니다:

# 1 + 2 * 3 == 7

(1 + 2) * 3  # == 9

Platypus에서 모든 표현식은 값 문으로 간주될 수 있습니다. 표현식이 문 구분 기호 ; 또는 \n으로 끝나면 하나의 문으로 간주됩니다. 다음 스크립트는 네 개의 문을 포함합니다:

len("abc")
1
a = 2; a + 2 * 3 % 2

값 문 (표현식 문)

표현식 뒤에 문 구분 기호가 오면 값 문으로 간주할 수 있습니다. 다음은 네 개의 유효한 문입니다:

# 부동소수점을 문으로 사용
1.;

# 함수 호출 표현식을 문으로 사용
len("Hello World!"); len({"a": 1})

# 식별자를 문으로 사용
abc

할당문

구문 예시:

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 분기로 진입합니다.

if condition {

}
if condition {

} else {

}
if condition_1 {

} elif condition_2 {

} ... elif condition_n {

} 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 init-expr; condition; loop-expr {

}
for varb_name in map_value/list_value/string_value  {

}

사용 예시:

  • for를 사용하여 10회 반복:
for a = 0; a < 10; a = a + 1 {

}
  • for in을 사용하여 list의 모든 요소 순회:
b = "2"
for a in ["1", "a" ,"2"] {
  b = b + a
  if b == "21a" {
    break
  }
}
# b == "21a"
  • for in을 사용하여 map의 모든 키 순회:
d = 0
map_a = {"a": 1, "b":2}
for x in map_a {
  d = d + map_a[x]
}
  • for in을 사용하여 string의 모든 문자 순회:
s = ""
for c in "abcdef" {
  if s == "abc" {
    break
  } else {
    continue
  }
  s = s + "a"
}
# s == "abc"

문서 평가

이 페이지가 도움이 되었나요?