Skip to content

KingSejong 표준 라이브러리 레퍼런스 ​

기준 버전: v0.5.0 (kingsejong --version) 함수 목록은 src/evaluator/Builtin.cpp 의 등록 목록과 stdlib/*.ksj 의 정의에서 뽑았고, 예제의 결과는 모두 해당 버전 인터프리터로 실행해 확인한 값이다.


목차 ​

  1. 개요
  2. 내장 함수 - 가져오기 없이 쓰는 함수 104개
  3. stdlib 모듈 - 가져오기 "stdlib/이름" 으로 쓰는 모듈 14개
  4. 알려진 문제

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 를 찾는다.

  1. 가져오기 문이 있는 파일의 디렉터리
  2. 명시적으로 추가한 검색 경로
  3. 현재 작업 디렉터리
  4. KINGSEJONG_PATH 환경변수의 디렉터리들 (: 로 구분)
  5. 설치 디렉터리 <설치 접두사>/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]
ksj
원본 = [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 모드에서는 허용되지 않은 경로 접근이 ... 권한이 거부되었습니다 에러를 낸다.

함수설명반환
파일_읽기(경로)전체 내용을 문자열로문자열. 없으면 파일을 열 수 없습니다 에러
파일_쓰기(경로, 내용)덮어쓰기없음
파일_추가(경로, 내용)뒤에 덧붙임없음
줄별_읽기(경로)줄 단위 배열[첫 줄, 둘째 줄, ...]
파일_존재(경로)파일 또는 디렉토리가 있는지논리값
파일_존재하는가(경로)파일_존재 와 같다 (디렉토리도 참)논리값
파일인가(경로)일반 파일인지논리값 (디렉토리는 거짓)
파일_크기(경로)바이트 수정수
파일_복사(출발, 목적)복사참
파일_이동(출발, 목적)이동(이름 바꾸기)참
파일_삭제(경로)삭제. 없으면 파일이 존재하지 않습니다 에러없음
ksj
파일_쓰기("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칸→ 없음
ksj
출력(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_인코딩(문자열)Base64Base64_인코딩("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
ksj
응답 = 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
ksj
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 ⊆ 집합2Set_부분집합인가(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 ​

꺼내는 함수는 값만 돌려주지 않고 [새_컨테이너, 꺼낸_값] 쌍을 돌려준다. 비어 있으면 꺼낸 값 자리에 빈 문자열이 온다.

ksj
가져오기 "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_복호화(문자열)시저 13ROT13("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
ksj
가져오기 "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 로 실행이 멈추므로, 여러 테스트를 이어서 돌리려면 시도/오류 로 감싼다.

ksj
시도 {
    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)의 동작이며, 고쳐지면 해당 절과 함께 갱신한다.

동작이 이름에서 드러나지 않는 함수 ​

모듈함수실제 동작
collectionsQueue_제거, Stack_제거, Deque_앞에서_제거, Deque_뒤에서_제거값이 아니라 [새_컨테이너, 값] 을 돌려준다 (의도된 설계지만 이름에서 드러나지 않음)

내장 함수와 이름이 같은 모듈 함수 ​

모듈이름차이
io파일_복사원본이 없을 때 에러 대신 거짓
array찾기배열이면 값의 위치(없으면 없음), 문자열이면 내장 함수에 넘긴다
math제곱근음수에 에러 대신 없음

모듈 사이에 겹치는 이름 ​

마지막에 가져온 모듈의 정의가 남는다. 아래 이름들은 두 모듈에서 같은 결과를 낸다.

이름모듈
채우기, 범위_단계array, utils
절댓값, 최댓값, 최솟값, 제한math, utils
비어있는가string, utils

보안 관련 ​

  • 해시·암호 함수는 std::hash, XOR, 시저 암호다. 비밀번호 저장이나 데이터 보호에 쓰면 안 된다.
  • stdlib/db 는 이름(SQL_이름)과 값(SQL_문자열), 쌍 배열 조건을 이스케이프하지만, 문자열 조건과 DB_테이블_생성 의 컬럼 정의는 그대로 들어간다. 외부 입력은 쌍 배열 조건이나 DB_실행·DB_쿼리 의 매개변수 바인딩(?)으로 넘긴다.
  • HTTP 는 평문 http:// 만 지원하므로 인증 정보를 보내는 용도로는 쓸 수 없다.

MIT License