타입 및 연산자
데이터 타입
| 타입 | 설명 |
|---|---|
int | 임의 정밀도 수학적 정수 (고정 폭 오버플로 없음, 최대 1,048,576비트). |
bool | 불리언 진릿값 (True 또는 False). |
bytes | 바이트 시퀀스 (최대 16 MiB). |
string | 유니코드 텍스트 문자열. 에러 메시지, 16진수·UTF-8 변환, f-string에 사용되며 +, ==, != 연산을 지원한다. |
list[T] | T가 int, bool, bytes, string 중 하나인 동질 리스트. 중첩 리스트(list[list[...]])는 허용하지 않는다. 최대 1,048,576개 원소. |
tuple[...] | 다중 반환값을 갖는 함수의 반환 타입과 언패킹 대입에만 사용되며, 변수나 리스트에 저장할 수 없다. |
Script 노드의 입력·출력 포트에는 bytes, int, bool, string을 사용할 수 있다. 리스트와 튜플은 스크립트 내부 전용 타입이다.
타입 검사 규칙
- 변수의 타입은 첫 대입 시점에 결정되며 절대 바뀌지 않는다. 다른 타입의 값을 다시 대입하면 컴파일 시점 에러가 발생한다.
- 암묵적 타입 변환 없음:
int와bool, 또는int와bytes를 섞어 쓰는 연산은 거부된다.to_int,to_bytes같은 내장 함수로 명시적 변환을 수행해야 한다. if,elif, 조건식의 조건 부분과and,or,not의 피연산자는 반드시bool타입이어야 한다.and와or는 단락 평가(Short-Circuit Evaluation)를 수행한다.
확정 대입 검사 (Definite Assignment Analysis)
모든 지역 변수는 읽기 전에 반드시 대입되어야 하며, 모든 출력 포트 변수는 스크립트가 끝날 때 실패하지 않는 모든 실행 경로에서 확정 대입되어야 한다:
if/elif/else문은 명시적else를 포함한 모든 분기에서 해당 변수를 대입하거나fail(...)/return으로 종료할 때만 확정 대입으로 인정된다.for반복문 본문 안에서 이루어진 대입은 루프가 0회 실행될 가능성이 있으므로 루프 바깥에서 확정 대입으로 인정되지 않는다.
if n > 100:
o = "big"
else:
o = "small"
위 코드에서 else 분기를 생략하면 컴파일 시점에 SCRIPT_OUTPUT_UNASSIGNED 진단 에러가 발생한다.
값 의미론 (Value Semantics)
bytes와 list[T]를 포함한 모든 값은 값 의미론(Value Semantics)을 따른다. 변수 대입과 함수 인자 전달은 독립적인 복사본처럼 동작하므로, 한 변수의 바이트나 리스트 원소를 수정해도 다른 변수의 값은 절대 변하지 않는다:
a = h"00 00"
b = a
b[0] = 255
연산자
연산자 우선순위는 Python과 동일하다. 비트 연산자는 비교 연산자보다 우선순위가 높으므로 x & 0x80 != 0은 (x & 0x80) != 0으로 해석된다. 연쇄 비교(a < b < c)는 허용하지 않는다.
| 연산자 | 피연산자 | 결과 | 의미 |
|---|---|---|---|
+ | int, int | int | 덧셈 |
+ | bytes, bytes | bytes | 바이트열 이어 붙이기 |
+ | string, string | string | 문자열 이어 붙이기 |
+ | list[T], list[T] | list[T] | 리스트 이어 붙이기 |
-, * | int, int | int | 뺄셈, 곱셈 |
* | bytes, int (또는 int, bytes) | bytes | 바이트열 반복 (음수 횟수는 BYTES_INVALID_ARGUMENT 에러) |
//, % | int, int | int | 내림 나눗셈(Floor Division) 및 나머지 (나머지의 부호는 제수의 부호를 따르며, 0으로 나누면 SCRIPT_DIVISION_BY_ZERO 에러) |
단항 - | int | int | 부호 반전 |
&, |, ^, ~ | int | int | 2의 보수 기준 비트 연산 |
<<, >> | int, int | int | 산술 비트 시프트 (음수 시프트 횟수는 SCRIPT_INVALID_ARGUMENT 에러) |
&, |, ^ | bytes, bytes | bytes | 바이트별 AND, OR, XOR (길이가 다르면 BYTES_LENGTH_MISMATCH 에러) |
~ | bytes | bytes | 전체 바이트 비트 반전(NOT) |
<<, >> | bytes, int | bytes | 바이트 길이를 유지하는 전체 버퍼 비트 시프트 (바이트 경계를 넘어 캐리 이동, 빈 비트는 0으로 채움) |
==, != | 동일 타입 | bool | 동등 / 부등 비교 |
<, <=, >, >= | int, int | bool | 수치 대소 비교 |
<, <=, >, >= | bytes, bytes | bool | 사전순(Lexicographical) 바이트열 비교 |
and, or, not | bool | bool | 불리언 논리 연산 |
연산자 예시
| 식 | 결과 |
|---|---|
2 + 3 * 4 | 14 |
7 // 2 | 3 |
-7 // 2 | -4 (내림 나눗셈) |
-7 % 2 | 1 |
7 % -2 | -1 (제수의 부호) |
0xF0 & 0x3C | 48 (0x30) |
0xF0 | 0x0F | 255 |
0xFF ^ 0x0F | 240 (0xF0) |
~5 | -6 |
1 << 8 | 256 |
-16 >> 2 | -4 (산술 시프트) |
h"0f f0" & h"3c 3c" | 0c30 |
h"0f" | h"f0" | ff |
h"ff" ^ h"0f" | f0 |
~h"0f" | f0 |
h"81 00" << 1 | 0200 (길이 유지, 밀려난 상위 비트는 버림) |
h"81 00" >> 1 | 4080 |
h"01" + h"02" | 0102 |
h"00" * 3 | 000000 |
2 * h"ff" | ffff |
"ab" + "cd" | abcd |
h"01 02" < h"01 03" | True (사전순) |
h"01" < h"01 00" | True (짧은 접두사가 더 작음) |
h"01" == h"02" | False |
x == 0 and not (x > 1) | True |