KingSejong 표준 라이브러리 레퍼런스
기준 버전: v0.5.0 (
kingsejong --version) 함수 목록은src/evaluator/Builtin.cpp의 등록 목록과stdlib/*.ksj의 정의에서 뽑았고, 예제의 결과는 모두 해당 버전 인터프리터로 실행해 확인한 값이다.
목차
1. 개요
두 층 구조
표준 라이브러리는 두 층으로 되어 있다.
| 층 | 구현 | 사용 방법 | 개수 |
|---|---|---|---|
| 내장 함수 (builtin) | C++ (src/evaluator/Builtin.cpp) | 가져오기 없이 바로 호출 | 104개 |
| stdlib 모듈 | KingSejong 코드 (stdlib/*.ksj) | 가져오기 "stdlib/이름" | 14개 모듈, 함수 250개 |
내장 함수 개수는 빌드에 따라 달라진다. SQLite 헤더가 없는 환경에서 빌드하면 DB_* 6개가 등록되지 않고, 브라우저(WASM, 플레이그라운드) 빌드에는 HTTP_* 3개가 없으며 입력() 은 호출하면 에러를 낸다.
stdlib 모듈은 대부분 내장 함수를 조합한 편의 함수다. 모듈에는 내보내기 선언이 없어 파일의 최상위 정의가 모두 들어오므로, 같은 이름이 있으면 나중에 가져온 쪽이 앞의 것(내장 함수 포함)을 덮어쓴다. 어떤 이름이 겹치는지는 알려진 문제에 정리했다.
모듈 경로 해석
가져오기 "stdlib/math" 는 다음 순서로 stdlib/math.ksj 를 찾는다.
- 가져오기 문이 있는 파일의 디렉터리
- 명시적으로 추가한 검색 경로
- 현재 작업 디렉터리
KINGSEJONG_PATH환경변수의 디렉터리들 (:로 구분)- 설치 디렉터리
<설치 접두사>/share/kingsejong(cmake --install이stdlib/를 여기에 복사한다)
저장소를 받아 바로 쓸 때는 저장소 루트에서 실행하거나 KINGSEJONG_PATH 에 저장소 경로를 넣는다. 못 찾으면 후보 경로 목록과 함께 에러가 난다.
배열 조사 메서드
숫자들을 걸러낸다(...), 변환한다, 축약한다, 정렬한다, 역순으로_나열한다, 찾다 같은 조사 기반 배열 메서드는 라이브러리 함수가 아니라 평가기의 문법 요소다. LANGUAGE_REFERENCE.md 의 배열 메서드 절을 본다.
표기법
- 시그니처의
[인자]는 생략 가능한 인자다. - 예제의
→뒤는 그 식의 값을출력()으로 찍었을 때 나오는 문자열이다.출력()은 문자열을 따옴표 없이, 배열을[1, a]처럼, 실수는 끝의 0 을 떼고(4.0→4), 큰 실수는 지수 표기(1e+08)로 찍는다. 값의 타입이 중요한 곳은 따로 적었다. - 결과가
없음인 함수는 부수 효과만 있고 돌려주는 값이 없다는 뜻이다. - 인자 개수나 타입이 틀리면 모든 내장 함수가
RuntimeError를 낸다.시도 { ... } 오류 (e) { ... }로 잡을 수 있고,e는"RuntimeError: 메시지"문자열이다.
2. 내장 함수
기본
| 함수 | 설명 | 예제 |
|---|---|---|
출력(값, ...) | 인자를 공백으로 이어 한 줄 출력 | 출력("안녕", 42, [1, "a"]) → 안녕 42 [1, a] |
입력([프롬프트]) | 표준 입력에서 한 줄을 읽어 문자열로 반환. 입력이 끝나면(EOF) 없음 | 이름 = 입력("이름? ") |
타입(값) | 타입 이름 문자열 | 타입(42) → 정수, 타입(3.5) → 실수, 타입("a") → 문자열, 타입(참) → 논리, 타입(없음) → 없음, 타입([1]) → 배열, 타입({"a": 1}) → 딕셔너리, 타입(함수() {}) → 함수, 타입(출력) → 내장함수 |
길이(문자열/배열) | 문자열은 UTF-8 문자 수, 배열은 요소 수 | 길이("안녕하세요") → 5, 길이([1, 2, 3]) → 3 |
문자열(값) | 값을 문자열로 변환. 값을 문자열로 변환한다 조사 구문도 이 함수를 부른다 | 문자열(42) → 42, 문자열([1, 2]) → [1, 2] |
부분문자열(문자열, 시작, [끝]) | 문자 단위 [시작, 끝) 구간. 끝을 생략하면 문자열 끝까지 | 부분문자열("안녕하세요", 1, 3) → 녕하, 부분문자열("안녕하세요", 2) → 하세요 |
포함(컨테이너, 값) | 문자열은 부분 문자열, 배열은 요소, 딕셔너리는 키의 포함 여부 | 포함("안녕하세요", "녕하") → 참, 포함([1, 2, 3], 2) → 참, 포함(사전, "a") |
추가(배열, 값, ...) | 값을 뒤에 붙인 새 배열을 돌려준다. 원본은 바뀌지 않는다 | 추가([1, 2], 3) → [1, 2, 3], 추가([1], 2, 3) → [1, 2, 3] |
원본 = [1, 2]
새배열 = 추가(원본, 3)
출력(원본, 새배열) # [1, 2] [1, 2, 3]타입() 이 돌려주는 이름은 위 표의 한글 이름이다. 클래스 인스턴스는 클래스, 프로미스는 프로미스 가 나온다. 배열 은 타입 키워드라 변수 이름으로 쓸 수 없다.
문자열
| 함수 | 설명 | 예제 |
|---|---|---|
분리(문자열, 구분자) | 구분자로 나눈 배열. 빈 구분자는 문자 단위로 나눈다 | 분리("a,b,c", ",") → [a, b, c], 분리("a,,b", ",") → [a, , b], 분리("abc", "") → [a, b, c] |
찾기(문자열, 패턴) | 패턴이 처음 나오는 문자 위치(0부터), 없으면 -1 | 찾기("hello world", "world") → 6, 찾기("안녕하세요", "하세") → 2, 찾기("hello", "xyz") → -1 |
바꾸기(문자열, 이전, 이후) | 모든 이전 을 이후 로 치환 | 바꾸기("hello hello", "l", "L") → heLLo heLLo |
대문자(문자열) | 영문자만 대문자로 | 대문자("Hello 안녕") → HELLO 안녕 |
소문자(문자열) | 영문자만 소문자로 | 소문자("Hello 안녕") → hello 안녕 |
딕셔너리
딕셔너리 리터럴은 {"키": 값} 이고 사전["키"] 로 읽는다. 키는 문자열이어야 한다.
| 함수 | 설명 | 예제 |
|---|---|---|
딕셔너리_키들(딕셔너리) | 키 배열 | 딕셔너리_키들({"이름": "철수", "나이": 25}) → [나이, 이름] |
딕셔너리_값들(딕셔너리) | 값 배열 | → [25, 철수] |
딕셔너리_포함(딕셔너리, 키) | 키 존재 여부 | 딕셔너리_포함(사전, "이름") → 참 |
키 순서는 입력 순서가 아니라 내부 정렬 순서다. JSON_문자열화() 는 딕셔너리를 변환하지 못한다 (JSON 참고).
타입 변환
| 함수 | 설명 | 예제 |
|---|---|---|
정수(값) | 정수로 변환. 실수는 소수점 아래를 버리고, 논리값은 1/0 | 정수("42") → 42, 정수(3.9) → 3, 정수(-3.9) → -3, 정수("3.7") → 3, 정수(참) → 1 |
실수(값) | 실수로 변환 | 실수("3.14") → 3.14, 실수(2) → 2(실수 타입), 실수(참) → 1 |
변환할 수 없는 문자열은 에러다: 정수("abc") → RuntimeError: 문자열을 정수로 변환할 수 없습니다: abc.
수학
| 함수 | 설명 | 예제 |
|---|---|---|
반올림(수) | 반올림한 정수. .5 는 큰 쪽(양의 무한대 쪽)으로 | 반올림(3.5) → 4, 반올림(2.5) → 3, 반올림(-2.5) → -2 |
올림(수) | 올림한 정수 | 올림(3.2) → 4, 올림(-3.2) → -3 |
내림(수) | 내림한 정수 | 내림(3.8) → 3, 내림(-3.8) → -4 |
절대값(수) | 절대값 | 절대값(-5) → 5, 절대값(-2.5) → 2.5 |
제곱근(수) | 제곱근(항상 실수). 음수는 에러 | 제곱근(16) → 4, 제곱근(2) → 1.41421 |
제곱(밑, 지수) | 거듭제곱. 밑이 정수이고 지수가 음이 아닌 정수면 정확한 정수(범위를 넘으면 에러), 아니면 실수 | 제곱(2, 10) → 1024, 제곱(2, -1) → 0.5, 제곱(4, 0.5) → 2 |
감싸더하기(a, b) | 정수 덧셈. 64비트를 넘으면 2의 보수로 감싸 돈다(일반 + 는 에러) | 감싸더하기(9223372036854775807, 1) → -9223372036854775808 |
감싸빼기(a, b) | 감싸 도는 정수 뺄셈 | 감싸빼기(-9223372036854775808, 1) → 9223372036854775807 |
감싸곱하기(a, b) | 감싸 도는 정수 곱셈 (FNV 같은 해시) | 감싸곱하기(9223372036854775807, 2) → -2 |
정수끼리의 / 는 정수 나눗셈이다 (1/3 → 0, 7/2 → 3). 실수 결과가 필요하면 실수(a) / b 로 쓴다. 반올림, 올림, 내림, 정수 는 결과가 정수 범위를 넘는 실수에 에러를 낸다.
파일
경로는 모두 문자열이고, 상대 경로는 현재 작업 디렉터리 기준이다. --sandbox 모드에서는 허용되지 않은 경로 접근이 ... 권한이 거부되었습니다 에러를 낸다.
| 함수 | 설명 | 반환 |
|---|---|---|
파일_읽기(경로) | 전체 내용을 문자열로 | 문자열. 없으면 파일을 열 수 없습니다 에러 |
파일_쓰기(경로, 내용) | 덮어쓰기 | 없음 |
파일_추가(경로, 내용) | 뒤에 덧붙임 | 없음 |
줄별_읽기(경로) | 줄 단위 배열 | [첫 줄, 둘째 줄, ...] |
파일_존재(경로) | 파일 또는 디렉토리가 있는지 | 논리값 |
파일_존재하는가(경로) | 파일_존재 와 같다 (디렉토리도 참) | 논리값 |
파일인가(경로) | 일반 파일인지 | 논리값 (디렉토리는 거짓) |
파일_크기(경로) | 바이트 수 | 정수 |
파일_복사(출발, 목적) | 복사 | 참 |
파일_이동(출발, 목적) | 이동(이름 바꾸기) | 참 |
파일_삭제(경로) | 삭제. 없으면 파일이 존재하지 않습니다 에러 | 없음 |
파일_쓰기("a.txt", "첫 줄\n둘째 줄")
파일_추가("a.txt", "\n셋째 줄")
출력(줄별_읽기("a.txt")) # [첫 줄, 둘째 줄, 셋째 줄]
출력(파일_크기("a.txt")) # 29 (UTF-8 바이트 수, 문자 수는 13)디렉토리
| 함수 | 설명 | 반환 |
|---|---|---|
현재_디렉토리() | 작업 디렉터리 절대 경로 | 문자열 |
디렉토리_변경(경로) | 작업 디렉터리 변경 | 참 |
디렉토리_생성(경로) | 중첩 경로도 한 번에 생성 | 없음 |
디렉토리_삭제(경로) | 하위 내용까지 삭제 | 없음 |
디렉토리_목록(경로) | 항목 이름 배열 | [a.txt, d1] |
디렉토리_나열(경로) | 디렉토리_목록 과 같다 | 배열 |
디렉토리인가(경로) | 디렉터리인지 | 논리값 |
임시_디렉토리() | 시스템 임시 디렉터리 경로 | 문자열 |
경로
| 함수 | 예제 |
|---|---|
경로_결합(경로1, 경로2) | 경로_결합("a/b", "c.txt") → a/b/c.txt |
파일명_추출(경로) | 파일명_추출("/x/y/z.tar.gz") → z.tar.gz |
확장자_추출(경로) | 확장자_추출("/x/y/z.tar.gz") → .gz, 확장자_추출("noext") → 빈 문자열 |
절대경로(경로) | 절대경로("rel/x.txt") → 현재_디렉토리() + "/rel/x.txt" |
경로_존재하는가(경로) | 파일이든 디렉터리든 있으면 참 |
stdlib/io 를 가져와도 파일명_추출, 확장자_추출, 파일_크기 는 이 내장 함수 그대로다. 파일_복사 만 모듈 함수로 바뀌며, 원본이 없을 때 에러 대신 거짓 을 돌려준다.
환경 변수와 시스템
| 함수 | 설명 | 예제 |
|---|---|---|
환경변수_읽기(이름) | 값. 없으면 빈 문자열 | 환경변수_읽기("HOME") |
환경변수_쓰기(이름, 값) | 현재 프로세스에 설정 | → 참 |
환경변수_존재하는가(이름) | 존재 여부 | → 참/거짓 |
환경변수_삭제(이름) | 삭제 | → 참 |
OS_이름() | macOS, Linux, Windows, Unknown 중 하나 | OS_이름() → macOS |
사용자_이름() | 현재 사용자 | 문자열 |
호스트_이름() | 호스트 이름 | 문자열 |
프로세스_종료(코드) | 즉시 종료. 이후 문장은 실행되지 않는다 | 프로세스_종료(3) 뒤 셸의 $? 는 3 |
JSON
KingSejong 에서 JSON 객체는 [["키", 값], ...] 형태의 쌍 배열로 표현된다. 딕셔너리 리터럴이 아니다.
| 함수 | 설명 | 예제 |
|---|---|---|
JSON_파싱(문자열) | JSON 문자열을 값으로. 객체는 쌍 배열, 배열은 배열, true/null 은 참/없음 | JSON_파싱("{\"name\": \"Alice\", \"age\": 30}") → [[age, 30], [name, Alice]] |
JSON_문자열화(값, [들여쓰기]) | 값을 JSON 문자열로. 들여쓰기를 주면 여러 줄 | JSON_문자열화([["name", "Alice"], ["age", 30]]) → {"age":30,"name":"Alice"} |
JSON_파일_읽기(경로) | 파일을 읽어 파싱 | |
JSON_파일_쓰기(경로, 값, [들여쓰기]) | 파일로 저장. 기본 들여쓰기 2칸 | → 없음 |
출력(JSON_문자열화([1, "a", 참, 없음, 2.5])) # [1,"a",true,null,2.5]
출력(JSON_문자열화([["k", 1]], 2))
# {
# "k": 1
# }
출력(JSON_문자열화({"a": 1})) # null (딕셔너리는 변환되지 않는다)객체 키는 알파벳순으로 정렬돼 나온다. 잘못된 JSON 은 RuntimeError: JSON 파싱 오류: ... 를 낸다. 쌍 배열에서 키로 값을 꺼내는 편의 함수는 stdlib/json에 있다.
시간
| 함수 | 설명 | 예제 |
|---|---|---|
현재_시간() | Unix 시간(초), 정수 | 1792899195 |
타임스탬프() | Unix 시간(밀리초), 정수 | 1792899195297 |
현재_날짜() | 로컬 날짜 | 2026-10-25 |
현재_시각() | 로컬 시각 | 12:33:15 |
현재_날짜시간() | 둘을 합친 것 | 2026-10-25 12:33:15 |
시간_포맷(초, 포맷) | Unix 초를 strftime 포맷으로, 로컬 시간대 기준 | 시간_포맷(1700000000, "%Y년 %m월 %d일") → 2023년 11월 15일 |
슬립(밀리초) | 지정 시간 대기 | 슬립(50) → 없음 |
타임스탬프() 는 밀리초다. 시간_포맷() 에는 현재_시간() 의 초 단위 값을 넘긴다.
정규표현식
인자 순서는 항상 (대상 문자열, 패턴) 이다. 패턴은 C++ std::regex (ECMAScript) 문법이고, 문자열 리터럴 안에서 역슬래시는 \\d 처럼 두 번 쓴다.
| 함수 | 설명 | 예제 |
|---|---|---|
정규표현식_일치(문자열, 패턴) | 문자열 전체가 패턴과 일치하는지 | 정규표현식_일치("hello123", "[a-z]+[0-9]+") → 참, 정규표현식_일치("hello123", "[a-z]+") → 거짓 |
정규표현식_검색(문자열, 패턴) | 패턴이 어딘가에 있는지 | 정규표현식_검색("hello123", "[0-9]+") → 참 |
정규표현식_모두_찾기(문자열, 패턴) | 일치 전부 배열로 | 정규표현식_모두_찾기("a1b22c333", "[0-9]+") → [1, 22, 333] |
정규표현식_추출(문자열, 패턴) | 첫 일치. 없으면 빈 문자열 | 정규표현식_추출("a1b22c333", "[0-9]+") → 1 |
정규표현식_개수(문자열, 패턴) | 일치 개수 | → 3 |
정규표현식_치환(문자열, 패턴, 교체) | 모든 일치를 치환. $1 같은 역참조 사용 가능 | 정규표현식_치환("hello world", "(\\w+) (\\w+)", "$2 $1") → world hello |
정규표현식_분리(문자열, 패턴) | 패턴으로 분리 | 정규표현식_분리("a, b,c ,d", "\\s*,\\s*") → [a, b, c, d] |
이메일_검증(문자열) | 이메일 형식 | 이메일_검증("user@example.com") → 참 |
URL_검증(문자열) | http(s):// URL 형식 | URL_검증("example.com") → 거짓 |
전화번호_검증(문자열) | 한국 전화번호 0X(X)-XXX(X)-XXXX | 전화번호_검증("010-1234-5678") → 참, 전화번호_검증("02-123-4567") → 참 |
한글 범위 [가-힣] 도 쓸 수 있다: 정규표현식_모두_찾기("가나 다라", "[가-힣]+") → [가나, 다라]. 잘못된 패턴은 RuntimeError: 정규표현식 오류: ... 를 낸다.
인코딩, 해시, 암호
이 절의 함수는 데이터 무결성 확인과 간단한 난독화용이다. 보안 목적의 암호화나 비밀번호 저장에는 쓰지 않는다. 암호학적 해시(SHA-256 등)와 AES, RSA 는 제공되지 않는다.
| 함수 | 설명 | 예제 |
|---|---|---|
Base64_인코딩(문자열) | Base64 | Base64_인코딩("hello") → aGVsbG8=, Base64_인코딩("안녕") → 7JWI64WV |
Base64_디코딩(문자열) | 디코딩. 잘못된 입력은 빈 문자열 | Base64_디코딩("aGVsbG8=") → hello |
URL_인코딩(문자열) | URL 퍼센트 인코딩(RFC 3986). 영문자·숫자·-_.~ 밖의 바이트를 %XX 로 | URL_인코딩("a b&c") → a%20b%26c, URL_인코딩("한") → %ED%95%9C |
문자열_해시(문자열) | std::hash<std::string> 값의 16진수 문자열. 플랫폼·컴파일러마다 다를 수 있고 암호학적 해시가 아니다 | 문자열_해시("hello") → 34432ce1c0308a8 (macOS clang 기준) |
파일_해시(경로) | 파일 내용의 문자열_해시 | |
해시_비교(해시1, 해시2) | 두 문자열이 같은지 | → 참/거짓 |
체크섬(문자열) | 32비트 회전 합 체크섬, 정수 | 체크섬("hello") → 3231 |
XOR_암호화(문자열, 키) | XOR. 결과는 출력할 수 없는 바이트일 수 있으니 Base64 로 감싼다. 빈 키는 에러 | |
XOR_복호화(문자열, 키) | XOR_암호화 와 같은 연산 | XOR_복호화(XOR_암호화("secret", "key"), "key") → secret |
시저_암호화(문자열, 이동) | 영문자만 이동, 그 외 문자는 그대로 | 시저_암호화("Hello, World!", 3) → Khoor, Zruog!, 시저_암호화("안녕 abc", 1) → 안녕 bcd |
시저_복호화(문자열, 이동) | 반대 방향 이동 | 시저_복호화("Khoor, Zruog!", 3) → Hello, World! |
난수
| 함수 | 설명 | 예제 |
|---|---|---|
랜덤_문자열(길이) | 영문 대소문자와 숫자로 된 문자열 | 길이(랜덤_문자열(16)) → 16 |
랜덤_숫자(최소, 최대) | [최소, 최대] 범위의 정수. 최소가 더 크면 에러 | 랜덤_숫자(1, 6) |
HTTP
브라우저 빌드에는 없다. 응답은 쌍 배열 [["상태", 200], ["본문", "..."], ["헤더", [["이름", "값"], ...]]] 이다. 상태·본문·헤더를 꺼내는 편의 함수는 stdlib/http에 있다.
| 함수 | 설명 |
|---|---|
HTTP_GET(URL) | GET 요청 |
HTTP_POST(URL, 본문) | POST 요청. 본문은 문자열이고 Content-Type: application/json 을 붙인다 |
HTTP_요청(메서드, URL, [헤더], [본문]) | 임의 메서드(GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS). 헤더는 [["이름", "값"], ...] 쌍 배열이어야 하며 딕셔너리는 무시된다. POST·PUT 의 본문 형식은 Content-Type 헤더를 주면 그 값, 없으면 application/json |
응답 = HTTP_GET("http://example.com/")
출력(응답[0]) # [상태, 200]
출력(타입(응답[2][1])) # 배열제약 사항:
http://만 지원한다.https://URL 은RuntimeError: HTTP_GET 에러: 현재는 HTTP만 지원합니다 (HTTPS는 향후 추가 예정)를 낸다.- SSRF 방지를 위해
localhost,127.0.0.0/8, 사설 IP 대역, 클라우드 메타데이터 주소 등 내부 주소로의 요청은접근이 차단된 URL입니다에러로 막힌다. 리다이렉트도 hop 마다 다시 검사한다. 이 정책을 끄는 명령줄 옵션은 없다. http://,https://외의 스킴(ftp://등)도 차단된다.
SQLite
SQLite 가 있는 환경에서 빌드했을 때만 등록된다 (cmake 구성 출력에 SQLite3: 버전 이 찍히는지로 확인한다).
| 함수 | 설명 | 예제 |
|---|---|---|
DB_열기(경로) | 데이터베이스 파일을 열고 연결 ID(정수) 반환 | db = DB_열기("app.db") |
DB_닫기(연결ID) | 연결 닫기. 닫은 뒤 쓰면 유효하지 않은 DB 연결 ID입니다 | → 없음 |
DB_실행(연결ID, SQL, [매개변수]) | 결과가 없는 SQL (CREATE, INSERT, UPDATE, DELETE). 매개변수 배열을 주면 SQL 의 ? 자리에 값으로 바인딩하고 문장 하나만 실행한다 | DB_실행(db, "INSERT INTO users (name, age) VALUES (?, ?)", ["it's", 25]) → 없음 |
DB_쿼리(연결ID, SQL, [매개변수]) | SELECT. 첫 행은 컬럼 이름, 이후 행은 값. 값은 모두 문자열. 매개변수는 DB_실행 과 같다 | [[id, name, age], [1, 철수, 25], [2, 영희, 30]] |
DB_마지막_ID(연결ID) | 마지막 INSERT 의 ROWID | → 1 |
DB_영향받은_행수(연결ID) | 마지막 문장이 바꾼 행 수 | → 2 |
db = DB_열기("users.db")
DB_실행(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
DB_실행(db, "INSERT INTO users (name, age) VALUES ('철수', 25)")
출력(DB_마지막_ID(db)) # 1
출력(DB_쿼리(db, "SELECT * FROM users")) # [[id, name, age], [1, 철수, 25]]
출력(DB_쿼리(db, "SELECT * FROM users WHERE age > 100")) # []
DB_닫기(db)SQL 오류는 RuntimeError: SQL 실행 오류: near "SELEC": syntax error 처럼 SQLite 메시지를 그대로 담아 난다. 바인딩 파라미터 기능은 없으므로 사용자 입력을 SQL 에 끼워 넣을 때는 직접 이스케이프해야 한다.
단언 (assert)
조건이 맞으면 없음 을 돌려주고, 틀리면 RuntimeError 를 던진다. stdlib/test 모듈이 전제하는 함수들이다.
| 함수 | 실패 메시지 |
|---|---|
assert(조건, [메시지]) | 메시지가 있으면 그 메시지, 없으면 Assertion failed |
assert_같음(실제, 기대) | 값이 다릅니다. 기대: 2, 실제: 1 |
assert_다름(실제, 기대) | 값이 같습니다: 1 |
assert_참(값) | 값이 거짓입니다: 0 |
assert_거짓(값) | 값이 참입니다: 1 |
assert_같음 은 타입까지 비교한다. assert_같음(1, 1.0) 은 값이 다릅니다. 기대: 1, 실제: 1 로 실패한다. 배열은 요소별로 비교해 assert_같음([1, 2], [1, 2]) 는 통과한다.
3. stdlib 모듈
각 절의 함수 수는 stdlib/<모듈>.ksj 에 정의된 최상위 함수 수다. 내장 함수와 이름이 같은 함수, 동작이 이름과 다른 함수는 각 절 끝의 "주의" 에 적고 4장에 모았다.
array
가져오기 "stdlib/array" - 배열 유틸리티 15개
| 함수 | 설명 | 예제 |
|---|---|---|
범위(시작, 끝) | 시작부터 끝까지(끝 포함) | 범위(1, 5) → [1, 2, 3, 4, 5] |
범위_단계(시작, 끝, 단계) | 단계 간격. 단계가 0 이하면 [] | 범위_단계(0, 10, 3) → [0, 3, 6, 9] |
중복_제거(배열) | 첫 등장 순서 유지 | 중복_제거([1, 2, 2, 3, 1]) → [1, 2, 3] |
채우기(값, 개수) | 같은 값으로 채운 배열 | 채우기(0, 3) → [0, 0, 0] |
평탄화(배열) | 한 단계만 펼침 | 평탄화([[1, 2], [3], 4]) → [1, 2, 3, 4] |
연결(배열1, 배열2) | 이어 붙임 (배열1 + 배열2 와 같다) | 연결([1, 2], [3]) → [1, 2, 3] |
자르기(배열, 시작, 끝) | [시작, 끝) 슬라이스. 범위 밖은 무시 | 자르기([1, 2, 3, 4, 5], 1, 3) → [2, 3], 자르기([1, 2], 0, 10) → [1, 2] |
포함하는가(배열, 값) | 요소 포함 여부 | 포함하는가([1, 2, 3], 2) → 참 |
찾기(배열, 값) | 첫 위치. 없으면 없음 | 찾기([10, 20, 30], 20) → 1, 찾기([10], 99) → 없음 |
모두(배열, 조건함수) | 모두 조건을 만족하면 참 | 모두([2, 4, 6], 함수(x) { 반환 x % 2 == 0 }) → 참 |
일부(배열, 조건함수) | 하나라도 만족하면 참 | 일부([1, 3, 4], 함수(x) { 반환 x % 2 == 0 }) → 참 |
그룹_나누기(배열, 크기) | 크기씩 묶기. 남는 요소는 마지막 묶음 | 그룹_나누기([1, 2, 3, 4, 5], 2) → [[1, 2], [3, 4], [5]] |
처음(배열, n) | 앞 n개 | 처음([1, 2, 3, 4], 2) → [1, 2] |
마지막(배열, n) | 뒤 n개 | 마지막([1, 2, 3, 4], 2) → [3, 4] |
쌍으로_묶기(배열1, 배열2) | zip. 짧은 쪽 길이까지 | 쌍으로_묶기([1, 2, 3], ["a", "b"]) → [[1, a], [2, b]] |
주의: 찾기 는 내장 함수 찾기(문자열, 패턴) 와 이름이 같다. 첫 인자가 문자열이면 내장 함수에 넘기므로 이 모듈을 가져와도 찾기("hello", "l") → 2 는 그대로다. 채우기, 범위_단계 는 stdlib/utils 에도 같은 이름으로 있다.
collections
가져오기 "stdlib/collections" - Set 14개, Map 11개, Queue 7개, Stack 7개, Deque 10개 (총 49개)
모든 자료구조는 배열로 표현되며 함수는 원본을 바꾸지 않고 새 배열을 돌려준다. 그래서 s = Set_추가(s, 1) 처럼 결과를 다시 대입해야 한다.
Set
| 함수 | 설명 | 예제 (s = Set_배열로부터([1, 2]), t = Set_배열로부터([2, 3])) |
|---|---|---|
Set_생성() | 빈 집합 | [] |
Set_추가(집합, 값) | 중복이면 그대로 | Set_추가(s, 1) → [1, 2] |
Set_제거(집합, 값) | Set_제거(s, 1) → [2] | |
Set_포함(집합, 값) | Set_포함(s, 2) → 참 | |
Set_크기(집합) | 2 | |
Set_비어있는가(집합) | 거짓 | |
Set_합집합(집합1, 집합2) | Set_합집합(s, t) → [1, 2, 3] | |
Set_교집합(집합1, 집합2) | [2] | |
Set_차집합(집합1, 집합2) | 집합1 - 집합2 | [1] |
Set_대칭_차집합(집합1, 집합2) | [1, 3] | |
Set_부분집합인가(집합1, 집합2) | 집합1 ⊆ 집합2 | Set_부분집합인가(Set_배열로부터([1]), s) → 참 |
Set_같은가(집합1, 집합2) | 순서 무관 | Set_같은가(s, Set_배열로부터([2, 1])) → 참 |
Set_배열로부터(배열) | 중복 제거해 생성 | Set_배열로부터([2, 3, 3]) → [2, 3] |
Set_배열로(집합) | 배열로 | [1, 2] |
Map
내부 표현은 [[키, 값], ...] 이라 JSON_파싱() 결과와 호환된다.
| 함수 | 설명 | 예제 (m = Map_추가(Map_추가(Map_생성(), "a", 1), "b", 2)) |
|---|---|---|
Map_생성() | 빈 맵 | [] |
Map_추가(맵, 키, 값) | 있으면 값 교체 | Map_추가(m, "a", 10) → [[a, 10], [b, 2]] |
Map_가져오기(맵, 키) | 없으면 빈 문자열 | Map_가져오기(m, "a") → 1 |
Map_제거(맵, 키) | Map_제거(m, "a") → [[b, 2]] | |
Map_포함(맵, 키) | 참 | |
Map_크기(맵) | 2 | |
Map_비어있는가(맵) | 거짓 | |
Map_키들(맵) | [a, b] | |
Map_값들(맵) | [1, 2] | |
Map_항목들(맵) | 쌍 배열 그대로 | [[a, 1], [b, 2]] |
Map_병합(맵1, 맵2) | 맵2 의 값이 우선 | Map_병합(m, [["b", 99]]) → [[a, 1], [b, 99]] |
Queue, Stack, Deque
꺼내는 함수는 값만 돌려주지 않고 [새_컨테이너, 꺼낸_값] 쌍을 돌려준다. 비어 있으면 꺼낸 값 자리에 빈 문자열이 온다.
가져오기 "stdlib/collections"
q = Queue_생성()
q = Queue_추가(q, "첫")
q = Queue_추가(q, "둘")
결과 = Queue_제거(q)
출력(결과) # [[둘], 첫]
q = 결과[0]
값 = 결과[1]| 함수 | 설명 |
|---|---|
Queue_생성(), Queue_추가(큐, 값), Queue_제거(큐), Queue_처음(큐), Queue_비어있는가(큐), Queue_크기(큐), Queue_비우기(큐) | FIFO. Queue_처음 은 비어 있으면 빈 문자열 |
Stack_생성(), Stack_추가(스택, 값), Stack_제거(스택), Stack_최상단(스택), Stack_비어있는가(스택), Stack_크기(스택), Stack_비우기(스택) | LIFO. Stack_제거([1, 2]) → [[1], 2] |
Deque_생성(), Deque_앞에_추가(덱, 값), Deque_뒤에_추가(덱, 값), Deque_앞에서_제거(덱), Deque_뒤에서_제거(덱), Deque_처음(덱), Deque_마지막(덱), Deque_비어있는가(덱), Deque_크기(덱), Deque_비우기(덱) | 양방향 큐. Deque_앞에서_제거([1, 2, 3]) → [[2, 3], 1] |
crypto
가져오기 "stdlib/crypto" - 35개. 내장 인코딩·해시·암호 함수의 래퍼와 조합이다. 인코딩, 해시, 암호 절의 보안 주의가 그대로 적용된다.
| 함수 | 설명 | 예제 |
|---|---|---|
인코딩(데이터), 디코딩(인코딩된_데이터) | Base64_인코딩/디코딩 과 같다 | 인코딩("hello") → aGVsbG8= |
안전한_디코딩(인코딩된_데이터) | 빈 문자열이면 빈 문자열 | |
해시(문자열) | 문자열_해시 와 같다 | |
해시_동일한가(해시1, 해시2) | 해시_비교 와 같다 | |
비밀번호_해시(비밀번호, 소금) | 문자열_해시(비밀번호 + 소금) | 비밀번호_해시("pw", "salt") → 60683962a7d53f47 |
비밀번호_검증(비밀번호, 소금, 저장된_해시) | → 참/거짓 | |
검증_체크섬(데이터) | 체크섬 과 같다 | 3231 |
파일_검증(파일경로, 예상_해시) | 파일_해시 와 비교 | |
암호화(평문, 키), 복호화(암호문, 키) | XOR | |
안전한_암호화(평문, 키) | XOR 뒤 Base64 | 안전한_암호화("secret", "key") → GAAaGQAN |
안전한_복호화(인코딩된_암호문, 키) | 위의 역 | → secret |
ROT13(문자열), ROT13_복호화(문자열) | 시저 13 | ROT13("Hello") → Uryyb |
토큰_생성(), 짧은_토큰() | 32자, 16자 랜덤 문자열 | |
OTP_생성(), PIN_생성() | 6자리, 4자리 정수 | |
비밀번호_생성(길이) | 최소 8자 | 길이(비밀번호_생성(4)) → 8 |
세션_ID_생성() | 24자 랜덤을 Base64 로 | |
안전하게_저장(데이터, 키) | [Base64(XOR), 체크섬] | 길이(안전하게_저장("data", "key")) → 2 |
안전하게_복원(저장된_데이터, 키) | 체크섬이 다르면 빈 문자열 | → data |
서명_생성(데이터, 비밀키), 서명_검증(데이터, 서명, 비밀키) | 문자열_해시(데이터 + 비밀키) | |
시간_토큰_생성(데이터, 비밀키, 타임스탬프) | 셋을 이어 해시 | |
지문_생성(데이터) | 해시 앞 8자 | 길이(지문_생성("hello")) → 8 |
UUID_생성() | 8-4-4-4-12 자리 랜덤 문자열(UUID 형식만 흉내) | 길이(UUID_생성()) → 36 |
랜덤_범위(개수, 최소, 최대) | 랜덤 정수 배열 | |
랜덤_선택(배열) | 빈 배열이면 빈 문자열 | |
섞기(배열) | Fisher-Yates | |
비밀번호_강도(비밀번호) | 0~100 점. 길이 점수(8·12·16자 이상에서 20·10·10점)에 다양성 점수(서로 다른 글자 비율 × 60)를 더한다 | 비밀번호_강도("abc") → 60, 비밀번호_강도("abcdefghijkl") → 90, 비밀번호_강도("aaaaaaaa") → 27 |
강한_비밀번호인가(비밀번호) | 70점 이상 | |
충분한_키인가(키) | 8자 이상 | |
안전한_비교(값1, 값2) | 해시를 비교 |
db
가져오기 "stdlib/db" - 17개. SQLite 내장 함수 위에 SQL 문자열을 만들어 주는 함수들이다.
| 함수 | 설명 | 예제 |
|---|---|---|
SQL_이름(이름) | 테이블·컬럼 이름을 SQL 식별자로. 큰따옴표로 감싸고 안의 큰따옴표는 두 번 써서 이스케이프 | SQL_이름("회원 목록") → "회원 목록" |
SQL_조건(조건) | 조건을 WHERE 절 본문으로. 쌍 배열 [["컬럼", 값], ...] 은 "컬럼"='값' 을 AND 로 잇고 이름과 값을 이스케이프한다. 문자열은 그대로 쓴다 | SQL_조건([["name", "it's"], ["age", 30]]) → "name"='it''s' AND "age"='30' |
DB_테이블_생성(db, 테이블명, 컬럼들) | CREATE TABLE IF NOT EXISTS. 테이블명은 SQL_이름 으로 감싸고, 컬럼 정의는 그대로 쓴다 | DB_테이블_생성(db, "users", ["id INTEGER PRIMARY KEY", "name TEXT", "age INTEGER"]) → 참 |
DB_테이블_삭제(db, 테이블명) | DROP TABLE IF EXISTS | → 참 |
DB_테이블_존재하는가(db, 테이블명) | sqlite_master 조회 | → 참/거짓 |
SQL_문자열(값) | 값을 SQL 문자열 리터럴로. 작은따옴표는 두 번 써서 이스케이프 | SQL_문자열("it's") → 'it''s', SQL_문자열(30) → '30' |
DB_삽입(db, 테이블, 데이터) | 데이터는 [["컬럼", 값], ...]. 테이블과 컬럼은 SQL_이름, 값은 SQL_문자열 로 바꿔 넣는다 | DB_삽입(db, "users", [["name", "철수"], ["age", 25]]) → 1 (마지막 ID) |
DB_조회(db, 테이블, 조건) | SELECT *. 조건은 SQL_조건 이 받는 쌍 배열이나 문자열. 비어 있으면 전체 | DB_조회(db, "users", [["name", 이름]]), DB_조회(db, "users", "age > 26") |
DB_수정(db, 테이블, 데이터, 조건) | UPDATE. 영향받은 행 수 반환 | DB_수정(db, "users", [["age", 26]], [["name", "철수"]]) → 1 |
DB_삭제(db, 테이블, 조건) | DELETE. 영향받은 행 수 반환 | DB_삭제(db, "users", [["name", "철수"]]) → 1 |
DB_트랜잭션_시작(db), DB_커밋(db), DB_롤백(db) | 각각 BEGIN, COMMIT, ROLLBACK | → 참 |
DB_트랜잭션(db, 작업함수) | 시작 → 작업함수(db) → 커밋. 작업함수의 반환값을 돌려준다. 작업함수가 에러를 던지면 롤백하고 같은 에러를 다시 던진다 | |
DB_결과_첫행(결과) | 첫 데이터 행. 없으면 거짓 | DB_결과_첫행(DB_조회(db, "users", "")) → [1, 철수, 25] |
DB_결과_열(결과, 컬럼_인덱스) | 컬럼 행을 뺀 그 열의 값 배열 (값은 문자열) | DB_결과_열(DB_쿼리(db, "SELECT name, age FROM users"), 1) → [25, 26] |
DB_결과_행수(결과) | 컬럼 행을 뺀 행 수 | → 2 |
주의:
- 테이블·컬럼 이름은
SQL_이름, 값은SQL_문자열로 이스케이프한다. 조건을 쌍 배열로 넘기면 이름과 값이 모두 이스케이프되므로 외부 입력은 이 형태로 넘긴다. - 조건을 문자열로 넘기면 그대로 SQL 에 끼워 넣는다(
age > 26처럼 같음이 아닌 비교를 쓰기 위한 형태). 외부 입력을 문자열 조건에 이어 붙이면 SQL 인젝션에 노출된다. 같음이 아닌 비교에 외부 입력을 쓸 때는DB_쿼리(db, "SELECT * FROM users WHERE age > ?", [나이])처럼 내장 함수의 매개변수 바인딩을 쓴다.DB_테이블_생성의 컬럼 정의도 그대로 들어간다. - 이름을 큰따옴표로 감싸므로
main.users처럼 점으로 스키마를 붙인 이름은 한 덩어리 이름으로 읽힌다.
http
가져오기 "stdlib/http" - 20개. HTTP 내장 함수의 제약(HTTP 전용, 내부 주소 차단)이 그대로 적용된다.
| 함수 | 설명 |
|---|---|
GET(URL), POST(URL, 본문) | HTTP_GET, HTTP_POST 와 같다 |
PUT(URL, 본문), DELETE(URL) | HTTP_요청("PUT"/"DELETE", ...) |
응답_상태(응답) | 상태 코드. 응답 형식이 아니면 0 |
응답_본문(응답) | 본문 문자열. 없으면 빈 문자열 |
응답_헤더(응답) | 헤더 쌍 배열. 없으면 [] |
헤더_찾기(헤더들, 키) | 헤더 값. 없으면 빈 문자열 |
성공인가(응답) | 상태가 2xx 면 참 |
JSON_GET(URL), JSON_POST(URL, 데이터), JSON_PUT(URL, 데이터), JSON_DELETE(URL) | 성공이면 본문을 JSON_파싱 한 값, 실패면 거짓. JSON_DELETE 는 본문이 비어 있으면 참 |
REST_클라이언트(기본_URL) | [["기본_URL", url]] |
REST_GET(클라이언트, 경로), REST_POST(클라이언트, 경로, 데이터), REST_PUT(클라이언트, 경로, 데이터), REST_DELETE(클라이언트, 경로) | 기본 URL 에 경로를 붙여 JSON_* 호출 |
쿼리_문자열(파라미터들) | 쿼리_문자열([["q", "a b"], ["page", "2"]]) → q=a%20b&page=2 |
URL_쿼리_추가(URL, 파라미터들) | URL_쿼리_추가("http://x.com/s", [["q", "a b"]]) → http://x.com/s?q=a%20b |
가져오기 "stdlib/http"
응답 = GET("http://example.com/")
만약 (성공인가(응답)) {
출력(응답_상태(응답), 헤더_찾기(응답_헤더(응답), "Content-Type"))
}쿼리_문자열 은 키와 값을 모두 내장 URL_인코딩으로 인코딩한다. POST, JSON_POST, JSON_PUT 은 Content-Type: application/json 으로 보낸다. 다른 형식은 HTTP_요청("POST", URL, [["Content-Type", "text/plain"]], 본문) 처럼 헤더로 준다.
io
가져오기 "stdlib/io" - 11개. 내장 파일 함수 위의 편의 함수다.
| 함수 | 설명 | 예제 |
|---|---|---|
안전하게_읽기(경로) | 없으면 빈 문자열 | |
안전하게_줄별_읽기(경로) | 없으면 [] | |
파일_비어있나(경로) | 없거나 비었으면 참 | |
파일_줄수(경로) | 줄 수 | 3 |
디렉토리_비어있나(경로) | 없거나 비었으면 참 | |
줄별_쓰기(경로, 줄들) | 배열을 줄바꿈으로 이어 저장 | 줄별_쓰기("l.txt", ["가", "나", "다"]) |
확장자로_필터링(경로, 확장자) | 디렉토리에서 확장자가 같은 항목 이름. 확장자는 "txt", ".txt" 둘 다 받는다 | 확장자로_필터링("d", "txt") → [a.txt] |
줄_검색(경로, 검색어) | 검색어를 포함한 줄 배열 | 줄_검색("l.txt", "나") → [나] |
파일_복사(원본경로, 대상경로) | 내용을 읽어 새로 쓴다. 원본이 없으면 거짓 | → 참 |
빈파일_생성(경로) | 빈 파일 | |
여러줄_추가(경로, 줄들) | 줄 단위로 덧붙임 |
주의: 파일_크기, 파일명_추출, 확장자_추출 은 이 모듈에 없고 내장 함수를 그대로 쓴다. 파일_복사 는 내장 함수와 이름이 같고, 원본이 없을 때 에러 대신 거짓 을 돌려준다.
json
가져오기 "stdlib/json" - 13개. JSON_파싱() 이 돌려주는 쌍 배열 [["키", 값], ...] 을 다룬다.
| 함수 | 설명 | 예제 (obj = JSON_파싱("{\"name\": \"Alice\", \"age\": 30}")) |
|---|---|---|
JSON_가져오기(obj, 키) | 값. 없거나 obj 가 배열이 아니면 없음 | JSON_가져오기(obj, "name") → Alice |
JSON_추가(obj, 키, 값) | 있으면 교체, 없으면 뒤에 추가한 새 객체 | JSON_추가(obj, "city", "Seoul") → [[age, 30], [name, Alice], [city, Seoul]] |
JSON_제거(obj, 키) | JSON_제거(obj, "name") → [[age, 30]] | |
JSON_키목록(obj) | [age, name] | |
JSON_값목록(obj) | [30, Alice] | |
JSON_키존재(obj, 키) | 참 | |
JSON_병합(obj1, obj2) | obj2 가 우선 | JSON_병합(obj, [["age", 99], ["x", 1]]) → [[age, 99], [name, Alice], [x, 1]] |
JSON_빈객체() | [] | |
배열을_JSON객체로(키배열, 값배열) | 길이가 다르면 [] | 배열을_JSON객체로(["a", "b"], [1, 2]) → [[a, 1], [b, 2]] |
JSON_예쁘게출력(값) | 들여쓰기 2칸으로 출력 | |
JSON_안전하게읽기(경로) | 파일이 없으면 [] | |
JSON_찾기(배열, 키, 값) | 객체 배열에서 첫 일치. 없으면 없음 | JSON_찾기(목록, "role", "user") |
JSON_필터링(배열, 키, 값) | 일치하는 객체 전부 |
math
가져오기 "stdlib/math" - 함수 14개, 상수 2개
| 함수 | 설명 | 예제 |
|---|---|---|
절댓값(x) | 절댓값(-10) → 10 | |
최댓값(a, b), 최솟값(a, b) | 최댓값(3, 7) → 7 | |
배열_최댓값(arr), 배열_최솟값(arr) | 빈 배열은 없음 | 배열_최댓값([3, 9, 2]) → 9 |
합계(arr) | 합계([1, 2, 3, 4]) → 10 | |
평균(arr) | 합계를 개수로 나눈 실수. 빈 배열은 0 | 평균([1, 2, 3, 4]) → 2.5, 평균([1, 2]) → 1.5 |
거듭제곱(밑, 지수) | 음수 지수는 1 / 거듭제곱 이라 정수 밑이면 0 | 거듭제곱(2, 10) → 1024, 거듭제곱(2, -2) → 0 |
계승(n) | 계승(5) → 120 | |
최대공약수(a, b), 최소공배수(a, b) | 최대공약수(12, 18) → 6, 최소공배수(4, 6) → 12 | |
제곱근(n) | 내장 제곱근 과 같은 값. 음수는 에러 대신 없음 | 제곱근(16) → 4, 제곱근(2) → 1.41421, 제곱근(-4) → 없음 |
소수인가(n) | 소수인가(17) → 참 | |
제한(값, 최소, 최대) | clamp | 제한(15, 0, 10) → 10 |
파이, 자연상수 | 3.141592653589793, 2.718281828459045 | 출력(파이) → 3.14159 |
주의: 제곱근 은 내장 함수 제곱근 과 이름이 같다. 값 계산은 내장 함수에 맡기고, 음수에서만 에러 대신 없음 을 돌려준다. 절댓값(받침 있음)은 내장 함수 절대값 과 다른 이름이다.
os
가져오기 "stdlib/os" - 15개. 환경 변수와 시스템, 디렉토리 내장 함수의 편의 함수다.
| 함수 | 설명 | 예제 |
|---|---|---|
홈_디렉토리(), 사용자_홈() | HOME 없으면 USERPROFILE | |
PATH에_추가(경로) | PATH 끝에 :경로 추가 (Unix 구분자) | → 참 |
작업_디렉토리_저장() | 현재_디렉토리() | |
작업_디렉토리_복원(경로) | 디렉토리_변경(경로) | → 참 |
안전한_디렉토리_생성(경로) | 이미 디렉터리면 참, 같은 이름의 파일이 있으면 거짓, 없으면 생성하고 없음 | |
디렉토리_비어있는가(경로) | 디렉터리가 아니면 거짓 | |
안전한_파일_삭제(경로) | 없으면 참 | |
파일_크기_KB(경로), 파일_크기_MB(경로) | 정수 나눗셈이라 1KB 미만은 0 | 파일_크기_KB("l.txt") → 0 |
파일_백업(경로) | 경로.bak 으로 복사 | → 참 |
Windows인가(), macOS인가(), Linux인가(), Unix인가() | OS_이름() 비교 | macOS 에서 Unix인가() → 참 |
regex
가져오기 "stdlib/regex" - 함수 21개, 패턴 상수 13개
| 함수 | 설명 | 예제 |
|---|---|---|
숫자인가(문자열) | ^[0-9]+$ | 숫자인가("123") → 참, 숫자인가("12a") → 거짓 |
정수_형식인가(문자열) | 음수 허용 | 정수_형식인가("-12") → 참 |
실수_형식인가(문자열) | 실수_형식인가("3.14") → 참, 실수_형식인가("-3.") → 참 | |
영문인가(문자열), 한글인가(문자열), 영문숫자인가(문자열) | 한글인가("한글") → 참 | |
날짜_형식인가(문자열) | YYYY-MM-DD | 날짜_형식인가("2026-10-25") → 참 |
시간_형식인가(문자열) | HH:MM:SS | |
우편번호_검증(문자열) | 5자리 숫자 | |
공백_제거(문자열) | 모든 공백 제거 | 공백_제거(" a b c ") → abc |
연속_공백_정리(문자열) | 연속 공백을 하나로 | 연속_공백_정리("a b \t c") → a b c |
단어_추출(문자열) | 영문·한글 단어 | 단어_추출("hello 세계, foo!") → [hello, 세계, foo] |
숫자_추출(문자열) | 숫자 덩어리 | 숫자_추출("a1b22c333") → [1, 22, 333] |
특수문자_제거(문자열) | 영문·한글·숫자·공백만 남김 | 특수문자_제거("안녕! hello@world #1") → 안녕 helloworld 1 |
이메일_추출(문자열), URL_추출(문자열), 전화번호_추출(문자열) | 모두 찾기 | 전화번호_추출("010-1234-5678 / 02-123-4567") → [010-1234-5678, 02-123-4567] |
카멜케이스를_스네이크케이스로(문자열) | 카멜케이스를_스네이크케이스로("myVarName") → my_var_name | |
비밀번호_강도_검사(비밀번호) | 0 약함, 1 보통, 2 강함 | 비밀번호_강도_검사("Abcdefg1!") → 2 |
HTML_태그_제거(문자열) | HTML_태그_제거("<p>안녕 <b>세계</b></p>") → 안녕 세계 | |
줄바꿈_정리(문자열) | 연속 줄바꿈을 줄바꿈 하나로 | 줄바꿈_정리("a\n\n\nb") → a 와 b 두 줄 |
패턴 상수: 패턴_숫자, 패턴_정수, 패턴_실수, 패턴_영문, 패턴_한글, 패턴_영문숫자, 패턴_공백, 패턴_이메일, 패턴_URL, 패턴_전화번호, 패턴_우편번호, 패턴_날짜_YYYYMMDD, 패턴_시간_HHMMSS. 내장 정규표현식 함수의 패턴 인자로 바로 쓸 수 있다.
string
가져오기 "stdlib/string" - 10개
| 함수 | 설명 | 예제 |
|---|---|---|
반복(문자열, 횟수) | 0 이하면 빈 문자열 | 반복("*", 5) → ***** |
결합(배열, 구분자) | 요소를 문자열로 바꿔 구분자로 잇는다 | 결합(["a", 1, 참], ", ") → a, 1, 참 |
비어있는가(문자열) | 비어있는가("") → 참 | |
같은가(문자열1, 문자열2) | == 와 같다 | |
역순(문자열) | 글자 단위로 뒤집는다 | 역순("한글abc") → cba글한 |
오른쪽_채우기(문자열, 전체길이) | 왼쪽에 공백을 넣어 오른쪽 정렬 | "[" + 오른쪽_채우기("42", 6) + "]" → [ 42] |
왼쪽_채우기(문자열, 전체길이) | 오른쪽에 공백을 넣어 왼쪽 정렬 | → [42 ] |
문자로_채우기(문자, 길이) | 문자로_채우기("-", 5) → ----- | |
줄_만들기(길이, 문자) | 인자 순서만 다른 문자로_채우기 | 줄_만들기(10, "=") → ========== |
제목_형식(텍스트, 전체길이) | 양쪽에 = | 제목_형식("제목", 12) → ===== 제목 ===== |
test
가져오기 "stdlib/test" - 함수 0개
이 파일은 주석만 있고 함수를 정의하지 않는다. 테스트는 내장 단언 함수 assert, assert_같음, assert_다름, assert_참, assert_거짓 으로 쓴다. 실패하면 RuntimeError 로 실행이 멈추므로, 여러 테스트를 이어서 돌리려면 시도/오류 로 감싼다.
시도 {
assert_같음(2 + 3, 5)
assert_참(길이([1, 2]) == 2)
출력("수학 테스트 통과")
} 오류 (e) {
출력("실패:", e) # 실패: RuntimeError: 값이 다릅니다. 기대: 5, 실제: 4
}time
가져오기 "stdlib/time" - 7개. 모두 Unix 초(현재_시간())를 받는다.
| 함수 | 설명 | 예제 |
|---|---|---|
시간_차이(시간1, 시간2) | 시간1 - 시간2 | 시간_차이(100, 40) → 60 |
날짜_더하기(타임스탬프, 일수) | 날짜_더하기(0, 1) → 86400 | |
날짜_빼기(타임스탬프, 일수) | 날짜_빼기(86400, 1) → 0 | |
년_추출(타임스탬프) | 문자열 | 년_추출(1700000000) → 2023 |
ISO_날짜(타임스탬프) | YYYY-MM-DD, 로컬 시간대 | ISO_날짜(1700000000) → 2023-11-15 |
과거_확인(타임스탬프), 미래_확인(타임스탬프) | 현재와 비교 | 과거_확인(0) → 참 |
utils
가져오기 "stdlib/utils" - 23개
| 함수 | 설명 | 예제 |
|---|---|---|
정수인가(값), 실수인가(값), 문자열인가(값), 배열인가(값), 함수인가(값) | 타입(값) 비교. 함수인가 는 내장 함수도 참 | 정수인가(42) → 참, 정수인가("1") → 거짓 |
범위_안에(값, 최소, 최대) | 닫힌 구간 | 범위_안에(5, 1, 10) → 참 |
양수인가(값), 음수인가(값), 짝수인가(값), 홀수인가(값) | 짝수인가(4) → 참 | |
정수를_문자로(값) | 문자열(값) 과 같다 | 정수를_문자로(-42) → -42 |
참거짓을_문자열로(값) | 참거짓을_문자열로(참) → 참 | |
선택(조건, 참값, 거짓값) | 삼항 선택 | 선택(참, "A", "B") → A |
정수_범위(시작, 끝) | 끝 포함 | 정수_범위(1, 5) → [1, 2, 3, 4, 5] |
범위_단계(시작, 끝, 단계) | stdlib/array 와 같은 이름. 끝 포함. 단계가 0 이하면 [] | 범위_단계(0, 10, 5) → [0, 5, 10] |
채우기(값, 개수) | stdlib/array 와 같은 이름 | 채우기("x", 3) → [x, x, x] |
문자열_반복(문자열, 횟수) | stdlib/string 의 반복 과 같다 | 문자열_반복("ab", 3) → ababab |
비어있는가(문자열) | stdlib/string 과 같은 이름 | |
절댓값(x), 최댓값(a, b), 최솟값(a, b), 제한(값, 최소, 최대) | stdlib/math 와 같은 이름 | |
교환(a, b) | [b, a] | 교환(1, 2) → [2, 1] |
4. 알려진 문제
위 절들에 흩어진 "주의" 를 모았다. 문서 작성 시점(v0.5.0)의 동작이며, 고쳐지면 해당 절과 함께 갱신한다.
동작이 이름에서 드러나지 않는 함수
| 모듈 | 함수 | 실제 동작 |
|---|---|---|
| collections | Queue_제거, Stack_제거, Deque_앞에서_제거, Deque_뒤에서_제거 | 값이 아니라 [새_컨테이너, 값] 을 돌려준다 (의도된 설계지만 이름에서 드러나지 않음) |
내장 함수와 이름이 같은 모듈 함수
| 모듈 | 이름 | 차이 |
|---|---|---|
| io | 파일_복사 | 원본이 없을 때 에러 대신 거짓 |
| array | 찾기 | 배열이면 값의 위치(없으면 없음), 문자열이면 내장 함수에 넘긴다 |
| math | 제곱근 | 음수에 에러 대신 없음 |
모듈 사이에 겹치는 이름
마지막에 가져온 모듈의 정의가 남는다. 아래 이름들은 두 모듈에서 같은 결과를 낸다.
| 이름 | 모듈 |
|---|---|
채우기, 범위_단계 | array, utils |
절댓값, 최댓값, 최솟값, 제한 | math, utils |
비어있는가 | string, utils |
보안 관련
- 해시·암호 함수는
std::hash, XOR, 시저 암호다. 비밀번호 저장이나 데이터 보호에 쓰면 안 된다. stdlib/db는 이름(SQL_이름)과 값(SQL_문자열), 쌍 배열 조건을 이스케이프하지만, 문자열 조건과DB_테이블_생성의 컬럼 정의는 그대로 들어간다. 외부 입력은 쌍 배열 조건이나DB_실행·DB_쿼리의 매개변수 바인딩(?)으로 넘긴다.- HTTP 는 평문
http://만 지원하므로 인증 정보를 보내는 용도로는 쓸 수 없다.