freelang-v4 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +548 -0
  2. package/dist/ast.d.ts +367 -0
  3. package/dist/ast.js +4 -0
  4. package/dist/ast.js.map +1 -0
  5. package/dist/async-basic.test.d.ts +1 -0
  6. package/dist/async-basic.test.js +88 -0
  7. package/dist/async-basic.test.js.map +1 -0
  8. package/dist/async-jest.test.d.ts +1 -0
  9. package/dist/async-jest.test.js +99 -0
  10. package/dist/async-jest.test.js.map +1 -0
  11. package/dist/channel-jest.test.d.ts +1 -0
  12. package/dist/channel-jest.test.js +148 -0
  13. package/dist/channel-jest.test.js.map +1 -0
  14. package/dist/checker-jest.test.d.ts +1 -0
  15. package/dist/checker-jest.test.js +160 -0
  16. package/dist/checker-jest.test.js.map +1 -0
  17. package/dist/checker.d.ts +149 -0
  18. package/dist/checker.js +1565 -0
  19. package/dist/checker.js.map +1 -0
  20. package/dist/checker.test.d.ts +1 -0
  21. package/dist/checker.test.js +217 -0
  22. package/dist/checker.test.js.map +1 -0
  23. package/dist/compiler-jest.test.d.ts +1 -0
  24. package/dist/compiler-jest.test.js +233 -0
  25. package/dist/compiler-jest.test.js.map +1 -0
  26. package/dist/compiler.d.ts +127 -0
  27. package/dist/compiler.js +1588 -0
  28. package/dist/compiler.js.map +1 -0
  29. package/dist/compiler.test.d.ts +1 -0
  30. package/dist/compiler.test.js +313 -0
  31. package/dist/compiler.test.js.map +1 -0
  32. package/dist/db-100m-full.d.ts +5 -0
  33. package/dist/db-100m-full.js +78 -0
  34. package/dist/db-100m-full.js.map +1 -0
  35. package/dist/db-100m-no-index.d.ts +12 -0
  36. package/dist/db-100m-no-index.js +119 -0
  37. package/dist/db-100m-no-index.js.map +1 -0
  38. package/dist/db-100m-real.d.ts +5 -0
  39. package/dist/db-100m-real.js +131 -0
  40. package/dist/db-100m-real.js.map +1 -0
  41. package/dist/db-100m-streaming.d.ts +15 -0
  42. package/dist/db-100m-streaming.js +164 -0
  43. package/dist/db-100m-streaming.js.map +1 -0
  44. package/dist/db-100m-test.d.ts +5 -0
  45. package/dist/db-100m-test.js +111 -0
  46. package/dist/db-100m-test.js.map +1 -0
  47. package/dist/db-jest.test.d.ts +1 -0
  48. package/dist/db-jest.test.js +182 -0
  49. package/dist/db-jest.test.js.map +1 -0
  50. package/dist/db-runtime.d.ts +24 -0
  51. package/dist/db-runtime.js +204 -0
  52. package/dist/db-runtime.js.map +1 -0
  53. package/dist/db.d.ts +249 -0
  54. package/dist/db.js +593 -0
  55. package/dist/db.js.map +1 -0
  56. package/dist/file-io-jest.test.d.ts +1 -0
  57. package/dist/file-io-jest.test.js +225 -0
  58. package/dist/file-io-jest.test.js.map +1 -0
  59. package/dist/for-of-jest.test.d.ts +1 -0
  60. package/dist/for-of-jest.test.js +230 -0
  61. package/dist/for-of-jest.test.js.map +1 -0
  62. package/dist/for-of.test.d.ts +1 -0
  63. package/dist/for-of.test.js +305 -0
  64. package/dist/for-of.test.js.map +1 -0
  65. package/dist/function-literal-jest.test.d.ts +1 -0
  66. package/dist/function-literal-jest.test.js +180 -0
  67. package/dist/function-literal-jest.test.js.map +1 -0
  68. package/dist/function-literal.test.d.ts +1 -0
  69. package/dist/function-literal.test.js +245 -0
  70. package/dist/function-literal.test.js.map +1 -0
  71. package/dist/generics-jest.test.d.ts +1 -0
  72. package/dist/generics-jest.test.js +93 -0
  73. package/dist/generics-jest.test.js.map +1 -0
  74. package/dist/ir-gen.d.ts +15 -0
  75. package/dist/ir-gen.js +400 -0
  76. package/dist/ir-gen.js.map +1 -0
  77. package/dist/ir.d.ts +114 -0
  78. package/dist/ir.js +5 -0
  79. package/dist/ir.js.map +1 -0
  80. package/dist/lexer.d.ts +110 -0
  81. package/dist/lexer.js +467 -0
  82. package/dist/lexer.js.map +1 -0
  83. package/dist/lexer.test.d.ts +1 -0
  84. package/dist/lexer.test.js +426 -0
  85. package/dist/lexer.test.js.map +1 -0
  86. package/dist/main.d.ts +2 -0
  87. package/dist/main.js +241 -0
  88. package/dist/main.js.map +1 -0
  89. package/dist/module-jest.test.d.ts +1 -0
  90. package/dist/module-jest.test.js +123 -0
  91. package/dist/module-jest.test.js.map +1 -0
  92. package/dist/parser.d.ts +56 -0
  93. package/dist/parser.js +1060 -0
  94. package/dist/parser.js.map +1 -0
  95. package/dist/parser.test.d.ts +1 -0
  96. package/dist/parser.test.js +461 -0
  97. package/dist/parser.test.js.map +1 -0
  98. package/dist/pattern-matching-jest.test.d.ts +1 -0
  99. package/dist/pattern-matching-jest.test.js +158 -0
  100. package/dist/pattern-matching-jest.test.js.map +1 -0
  101. package/dist/pkg/init.d.ts +1 -0
  102. package/dist/pkg/init.js +118 -0
  103. package/dist/pkg/init.js.map +1 -0
  104. package/dist/pkg/install.d.ts +1 -0
  105. package/dist/pkg/install.js +77 -0
  106. package/dist/pkg/install.js.map +1 -0
  107. package/dist/pkg/registry.d.ts +23 -0
  108. package/dist/pkg/registry.js +106 -0
  109. package/dist/pkg/registry.js.map +1 -0
  110. package/dist/pkg/run.d.ts +1 -0
  111. package/dist/pkg/run.js +76 -0
  112. package/dist/pkg/run.js.map +1 -0
  113. package/dist/pkg/toml.d.ts +5 -0
  114. package/dist/pkg/toml.js +117 -0
  115. package/dist/pkg/toml.js.map +1 -0
  116. package/dist/repl.d.ts +15 -0
  117. package/dist/repl.js +197 -0
  118. package/dist/repl.js.map +1 -0
  119. package/dist/runtime/bytecode.d.ts +92 -0
  120. package/dist/runtime/bytecode.js +253 -0
  121. package/dist/runtime/bytecode.js.map +1 -0
  122. package/dist/runtime/value.d.ts +102 -0
  123. package/dist/runtime/value.js +302 -0
  124. package/dist/runtime/value.js.map +1 -0
  125. package/dist/runtime/vm.d.ts +65 -0
  126. package/dist/runtime/vm.js +293 -0
  127. package/dist/runtime/vm.js.map +1 -0
  128. package/dist/struct-instance-jest.test.d.ts +1 -0
  129. package/dist/struct-instance-jest.test.js +209 -0
  130. package/dist/struct-instance-jest.test.js.map +1 -0
  131. package/dist/struct-instance.test.d.ts +1 -0
  132. package/dist/struct-instance.test.js +291 -0
  133. package/dist/struct-instance.test.js.map +1 -0
  134. package/dist/struct-jest.test.d.ts +1 -0
  135. package/dist/struct-jest.test.js +176 -0
  136. package/dist/struct-jest.test.js.map +1 -0
  137. package/dist/struct.test.d.ts +1 -0
  138. package/dist/struct.test.js +231 -0
  139. package/dist/struct.test.js.map +1 -0
  140. package/dist/trait-jest.test.d.ts +1 -0
  141. package/dist/trait-jest.test.js +120 -0
  142. package/dist/trait-jest.test.js.map +1 -0
  143. package/dist/vm-jest.test.d.ts +1 -0
  144. package/dist/vm-jest.test.js +569 -0
  145. package/dist/vm-jest.test.js.map +1 -0
  146. package/dist/vm.d.ts +81 -0
  147. package/dist/vm.js +1956 -0
  148. package/dist/vm.js.map +1 -0
  149. package/dist/vm.test.d.ts +1 -0
  150. package/dist/vm.test.js +337 -0
  151. package/dist/vm.test.js.map +1 -0
  152. package/dist/web-repl/sandbox.d.ts +11 -0
  153. package/dist/web-repl/sandbox.js +76 -0
  154. package/dist/web-repl/sandbox.js.map +1 -0
  155. package/dist/web-repl/server.d.ts +1 -0
  156. package/dist/web-repl/server.js +111 -0
  157. package/dist/web-repl/server.js.map +1 -0
  158. package/dist/while-loop-jest.test.d.ts +1 -0
  159. package/dist/while-loop-jest.test.js +201 -0
  160. package/dist/while-loop-jest.test.js.map +1 -0
  161. package/dist/while-loop.test.d.ts +1 -0
  162. package/dist/while-loop.test.js +262 -0
  163. package/dist/while-loop.test.js.map +1 -0
  164. package/docs/EXPERIENCE.md +787 -0
  165. package/docs/README.md +175 -0
  166. package/docs/V1_V2_V3_ANALYSIS.md +107 -0
  167. package/docs/_config.yml +36 -0
  168. package/docs/api-reference.md +459 -0
  169. package/docs/architecture.md +470 -0
  170. package/docs/benchmarks.md +295 -0
  171. package/docs/comparison.md +454 -0
  172. package/docs/index.md +335 -0
  173. package/docs/language-completeness.md +228 -0
  174. package/docs/learning-guide.md +651 -0
  175. package/package.json +65 -0
  176. package/src/api/deploy_key.fl +294 -0
  177. package/src/api/issue.fl +302 -0
  178. package/src/api/org.fl +356 -0
  179. package/src/api/repo.fl +394 -0
  180. package/src/api/team.fl +299 -0
  181. package/src/api/user.fl +385 -0
  182. package/src/api/webhook.fl +273 -0
  183. package/src/ast.ts +158 -0
  184. package/src/async-basic.test.ts +94 -0
  185. package/src/async-jest.test.ts +107 -0
  186. package/src/channel-jest.test.ts +158 -0
  187. package/src/checker-jest.test.ts +189 -0
  188. package/src/checker.test.ts +279 -0
  189. package/src/checker.ts +1861 -0
  190. package/src/commands/analyze.fl +227 -0
  191. package/src/commands/auth.fl +315 -0
  192. package/src/commands/batch.fl +349 -0
  193. package/src/commands/config.fl +199 -0
  194. package/src/commands/deploy_key.fl +352 -0
  195. package/src/commands/issue.fl +275 -0
  196. package/src/commands/main.fl +492 -0
  197. package/src/commands/org.fl +425 -0
  198. package/src/commands/repo.fl +581 -0
  199. package/src/commands/team.fl +244 -0
  200. package/src/commands/user.fl +423 -0
  201. package/src/commands/webhook.fl +400 -0
  202. package/src/compiler-jest.test.ts +275 -0
  203. package/src/compiler.test.ts +375 -0
  204. package/src/compiler.ts +1770 -0
  205. package/src/config.fl +175 -0
  206. package/src/core/batch.fl +355 -0
  207. package/src/core/cache.fl +284 -0
  208. package/src/core/ensure.fl +324 -0
  209. package/src/db-100m-full.ts +96 -0
  210. package/src/db-100m-no-index.ts +133 -0
  211. package/src/db-100m-real.ts +152 -0
  212. package/src/db-100m-streaming.ts +154 -0
  213. package/src/db-100m-test.ts +136 -0
  214. package/src/db-jest.test.ts +161 -0
  215. package/src/db-runtime.ts +242 -0
  216. package/src/db.ts +676 -0
  217. package/src/errors.fl +134 -0
  218. package/src/for-of-jest.test.ts +246 -0
  219. package/src/for-of.test.ts +308 -0
  220. package/src/function-literal-jest.test.ts +193 -0
  221. package/src/function-literal.test.ts +248 -0
  222. package/src/generics-jest.test.ts +104 -0
  223. package/src/http/client.fl +327 -0
  224. package/src/ir-gen.ts +459 -0
  225. package/src/ir.ts +80 -0
  226. package/src/lexer.test.ts +499 -0
  227. package/src/lexer.ts +522 -0
  228. package/src/main.ts +223 -0
  229. package/src/models.fl +162 -0
  230. package/src/module-jest.test.ts +145 -0
  231. package/src/parser.test.ts +542 -0
  232. package/src/parser.ts +1211 -0
  233. package/src/pattern-matching-jest.test.ts +170 -0
  234. package/src/pkg/init.ts +91 -0
  235. package/src/pkg/install.ts +56 -0
  236. package/src/pkg/registry.ts +103 -0
  237. package/src/pkg/run.ts +49 -0
  238. package/src/pkg/toml.ts +129 -0
  239. package/src/repl.ts +190 -0
  240. package/src/runtime/bytecode.ts +291 -0
  241. package/src/runtime/value.ts +322 -0
  242. package/src/runtime/vm.ts +354 -0
  243. package/src/self-host/bootstrap.fl +68 -0
  244. package/src/self-host/interpreter.fl +361 -0
  245. package/src/self-host/lexer-simple.fl +22 -0
  246. package/src/self-host/lexer.fl +305 -0
  247. package/src/self-host/parser.fl +580 -0
  248. package/src/struct-instance-jest.test.ts +221 -0
  249. package/src/struct-instance.test.ts +293 -0
  250. package/src/struct-jest.test.ts +187 -0
  251. package/src/struct.test.ts +234 -0
  252. package/src/trait-jest.test.ts +136 -0
  253. package/src/vm-jest.test.ts +754 -0
  254. package/src/vm.ts +1976 -0
  255. package/src/web-repl/public/index.html +50 -0
  256. package/src/web-repl/public/main.js +105 -0
  257. package/src/web-repl/public/style.css +225 -0
  258. package/src/web-repl/sandbox.ts +88 -0
  259. package/src/web-repl/server.ts +97 -0
  260. package/src/while-loop-jest.test.ts +218 -0
  261. package/src/while-loop.test.ts +267 -0
@@ -0,0 +1,459 @@
1
+ # 📚 FreeLang v4 - API 레퍼런스
2
+
3
+ **표준 라이브러리 42개 함수**
4
+
5
+ ---
6
+
7
+ ## 📋 카테고리별 함수 목록
8
+
9
+ ### 1️⃣ 문자열 (String) - 8개 함수
10
+
11
+ #### length() -> i32
12
+ 문자열의 길이 반환
13
+ ```freelang
14
+ let text = "hello"
15
+ let len = text.length() // 5
16
+ ```
17
+
18
+ #### to_upper() -> str
19
+ 대문자로 변환
20
+ ```freelang
21
+ let text = "hello"
22
+ let upper = text.to_upper() // "HELLO"
23
+ ```
24
+
25
+ #### to_lower() -> str
26
+ 소문자로 변환
27
+ ```freelang
28
+ let text = "HELLO"
29
+ let lower = text.to_lower() // "hello"
30
+ ```
31
+
32
+ #### slice(start: i32, end: i32) -> str
33
+ 부분 문자열 추출
34
+ ```freelang
35
+ let text = "hello"
36
+ let sub = text.slice(1, 4) // "ell"
37
+ ```
38
+
39
+ #### char_at(index: i32) -> Option(str)
40
+ 특정 위치의 문자 반환
41
+ ```freelang
42
+ let text = "hello"
43
+ match text.char_at(1) {
44
+ case Some(ch) -> println(ch), // "e"
45
+ case None -> println("Index out of range")
46
+ }
47
+ ```
48
+
49
+ #### index_of(substr: str) -> Option(i32)
50
+ 부분 문자열의 위치 반환
51
+ ```freelang
52
+ let text = "hello world"
53
+ match text.index_of("world") {
54
+ case Some(pos) -> println(str(pos)), // 6
55
+ case None -> println("Not found")
56
+ }
57
+ ```
58
+
59
+ #### pad_left(width: i32, char: str) -> str
60
+ 왼쪽 패딩
61
+ ```freelang
62
+ let text = "42"
63
+ let padded = text.pad_left(5, "0") // "00042"
64
+ ```
65
+
66
+ #### pad_right(width: i32, char: str) -> str
67
+ 오른쪽 패딩
68
+ ```freelang
69
+ let text = "test"
70
+ let padded = text.pad_right(8, "*") // "test****"
71
+ ```
72
+
73
+ ---
74
+
75
+ ### 2️⃣ 배열/컬렉션 (Array) - 7개 함수
76
+
77
+ #### length() -> i32
78
+ 배열의 길이
79
+ ```freelang
80
+ let arr = [1, 2, 3]
81
+ let len = arr.length() // 3
82
+ ```
83
+
84
+ #### push(value: T) -> void
85
+ 배열에 요소 추가
86
+ ```freelang
87
+ let arr = [1, 2]
88
+ arr.push(3) // [1, 2, 3]
89
+ ```
90
+
91
+ #### pop() -> Option(T)
92
+ 마지막 요소 제거 및 반환
93
+ ```freelang
94
+ let arr = [1, 2, 3]
95
+ match arr.pop() {
96
+ case Some(val) -> println(str(val)), // 3
97
+ case None -> println("Empty array")
98
+ }
99
+ ```
100
+
101
+ #### first() -> Option(T)
102
+ 첫 번째 요소
103
+ ```freelang
104
+ let arr = [10, 20, 30]
105
+ match arr.first() {
106
+ case Some(val) -> println(str(val)), // 10
107
+ case None -> println("Empty array")
108
+ }
109
+ ```
110
+
111
+ #### last() -> Option(T)
112
+ 마지막 요소
113
+ ```freelang
114
+ let arr = [10, 20, 30]
115
+ match arr.last() {
116
+ case Some(val) -> println(str(val)), // 30
117
+ case None -> println("Empty array")
118
+ }
119
+ ```
120
+
121
+ #### reverse() -> [T]
122
+ 배열 역순
123
+ ```freelang
124
+ let arr = [1, 2, 3]
125
+ let reversed = arr.reverse() // [3, 2, 1]
126
+ ```
127
+
128
+ #### fold(init: U, fn: fn(U, T) -> U) -> U
129
+ 배열 축약
130
+ ```freelang
131
+ let arr = [1, 2, 3, 4, 5]
132
+ let sum = arr.fold(0, fn(acc, x) -> acc + x) // 15
133
+ ```
134
+
135
+ ---
136
+
137
+ ### 3️⃣ 수학 (Math) - 7개 함수
138
+
139
+ #### floor(x: f64) -> i32
140
+ 내림
141
+ ```freelang
142
+ let result = floor(3.7) // 3
143
+ ```
144
+
145
+ #### ceil(x: f64) -> i32
146
+ 올림
147
+ ```freelang
148
+ let result = ceil(3.2) // 4
149
+ ```
150
+
151
+ #### round(x: f64) -> i32
152
+ 반올림
153
+ ```freelang
154
+ let result = round(3.5) // 4
155
+ ```
156
+
157
+ #### abs(x: i32) -> i32
158
+ 절댓값
159
+ ```freelang
160
+ let result = abs(-42) // 42
161
+ ```
162
+
163
+ #### sqrt(x: f64) -> f64
164
+ 제곱근
165
+ ```freelang
166
+ let result = sqrt(16.0) // 4.0
167
+ ```
168
+
169
+ #### pow(base: f64, exp: f64) -> f64
170
+ 거듭제곱
171
+ ```freelang
172
+ let result = pow(2.0, 3.0) // 8.0
173
+ ```
174
+
175
+ #### random() -> f64
176
+ 0~1 난수
177
+ ```freelang
178
+ let rand = random() // 0.123456...
179
+ ```
180
+
181
+ ---
182
+
183
+ ### 4️⃣ 파일 I/O (File) - 4개 함수
184
+
185
+ #### read_file(path: str) -> Result(str, str)
186
+ 파일 읽기
187
+ ```freelang
188
+ match read_file("data.txt") {
189
+ case Ok(content) -> println(content),
190
+ case Err(e) -> println("Error: " + e)
191
+ }
192
+ ```
193
+
194
+ #### write_file(path: str, content: str) -> Result(void, str)
195
+ 파일 쓰기
196
+ ```freelang
197
+ match write_file("output.txt", "Hello") {
198
+ case Ok(_) -> println("Written"),
199
+ case Err(e) -> println("Error: " + e)
200
+ }
201
+ ```
202
+
203
+ #### append_file(path: str, content: str) -> Result(void, str)
204
+ 파일에 추가
205
+ ```freelang
206
+ match append_file("log.txt", "New log\n") {
207
+ case Ok(_) -> println("Appended"),
208
+ case Err(e) -> println("Error: " + e)
209
+ }
210
+ ```
211
+
212
+ #### exists(path: str) -> bool
213
+ 파일 존재 확인
214
+ ```freelang
215
+ let exists = exists("data.txt")
216
+ if exists {
217
+ println("File exists")
218
+ }
219
+ ```
220
+
221
+ ---
222
+
223
+ ### 5️⃣ 정규식 (Regex) - 3개 함수
224
+
225
+ #### regex_match(text: str, pattern: str) -> Option(str)
226
+ 정규식 매칭
227
+ ```freelang
228
+ match regex_match("test123", "\\d+") {
229
+ case Some(match_str) -> println(match_str), // "123"
230
+ case None -> println("No match")
231
+ }
232
+ ```
233
+
234
+ #### regex_find_all(text: str, pattern: str) -> [str]
235
+ 모든 매칭 찾기
236
+ ```freelang
237
+ let matches = regex_find_all("a1b2c3", "\\d")
238
+ // ["1", "2", "3"]
239
+ ```
240
+
241
+ #### regex_replace(text: str, pattern: str, replacement: str) -> str
242
+ 정규식 치환
243
+ ```freelang
244
+ let result = regex_replace("hello123world", "\\d", "X")
245
+ // "helloXXXworld"
246
+ ```
247
+
248
+ ---
249
+
250
+ ### 6️⃣ CSV - 2개 함수
251
+
252
+ #### csv_parse(content: str) -> Result([str], str)
253
+ CSV 파싱
254
+ ```freelang
255
+ let csv = "name,age\nAlice,30\nBob,25"
256
+ match csv_parse(csv) {
257
+ case Ok(data) -> println(str(data.length())), // 3
258
+ case Err(e) -> println("Error: " + e)
259
+ }
260
+ ```
261
+
262
+ #### csv_stringify(data: [[str]]) -> str
263
+ CSV 생성
264
+ ```freelang
265
+ let data = [["name", "age"], ["Alice", "30"]]
266
+ let csv = csv_stringify(data)
267
+ // "name,age\nAlice,30"
268
+ ```
269
+
270
+ ---
271
+
272
+ ### 7️⃣ 날짜/시간 (DateTime) - 3개 함수
273
+
274
+ #### now() -> i64
275
+ 현재 타임스탬프
276
+ ```freelang
277
+ let timestamp = now()
278
+ println(str(timestamp))
279
+ ```
280
+
281
+ #### format_date(timestamp: i64, format: str) -> str
282
+ 날짜 포맷팅
283
+ ```freelang
284
+ let formatted = format_date(now(), "YYYY-MM-DD HH:mm:ss")
285
+ println(formatted)
286
+ ```
287
+
288
+ #### parse_date(date_str: str, format: str) -> Result(i64, str)
289
+ 날짜 파싱
290
+ ```freelang
291
+ match parse_date("2026-04-05", "YYYY-MM-DD") {
292
+ case Ok(timestamp) -> println(str(timestamp)),
293
+ case Err(e) -> println("Error: " + e)
294
+ }
295
+ ```
296
+
297
+ ---
298
+
299
+ ### 8️⃣ YAML - 2개 함수
300
+
301
+ #### yaml_parse(content: str) -> Result(map, str)
302
+ YAML 파싱
303
+ ```freelang
304
+ let yaml = "name: Alice\nage: 30"
305
+ match yaml_parse(yaml) {
306
+ case Ok(data) -> println(data),
307
+ case Err(e) -> println("Error: " + e)
308
+ }
309
+ ```
310
+
311
+ #### yaml_stringify(data: map) -> str
312
+ YAML 생성
313
+ ```freelang
314
+ let data = {"name": "Alice", "age": 30}
315
+ let yaml = yaml_stringify(data)
316
+ ```
317
+
318
+ ---
319
+
320
+ ### 9️⃣ 데이터베이스 (Database) - 5개 함수
321
+
322
+ #### db_open(path: str) -> Result(Database, str)
323
+ 데이터베이스 열기
324
+ ```freelang
325
+ match db_open("app.db") {
326
+ case Ok(db) -> println("Connected"),
327
+ case Err(e) -> println("Error: " + e)
328
+ }
329
+ ```
330
+
331
+ #### db_query(db: Database, sql: str) -> Result([map], str)
332
+ 쿼리 실행
333
+ ```freelang
334
+ match db_query(db, "SELECT * FROM users") {
335
+ case Ok(rows) -> println(str(rows.length())),
336
+ case Err(e) -> println("Error: " + e)
337
+ }
338
+ ```
339
+
340
+ #### db_execute(db: Database, sql: str) -> Result(i32, str)
341
+ INSERT/UPDATE/DELETE 실행
342
+ ```freelang
343
+ match db_execute(db, "INSERT INTO users (name) VALUES (?)") {
344
+ case Ok(count) -> println(str(count) + " rows affected"),
345
+ case Err(e) -> println("Error: " + e)
346
+ }
347
+ ```
348
+
349
+ #### db_close(db: Database) -> void
350
+ 데이터베이스 닫기
351
+ ```freelang
352
+ db_close(db)
353
+ ```
354
+
355
+ #### db_transaction(db: Database, fn: fn(Database) -> Result) -> Result
356
+ 트랜잭션
357
+ ```freelang
358
+ match db_transaction(db, fn(db) -> {
359
+ db_execute(db, "INSERT ...")
360
+ }) {
361
+ case Ok(_) -> println("Transaction committed"),
362
+ case Err(e) -> println("Transaction rolled back")
363
+ }
364
+ ```
365
+
366
+ ---
367
+
368
+ ## 🔧 유틸리티 함수
369
+
370
+ #### str(value: T) -> str
371
+ 모든 값을 문자열로 변환
372
+ ```freelang
373
+ str(42) // "42"
374
+ str(3.14) // "3.14"
375
+ str(true) // "true"
376
+ ```
377
+
378
+ #### parse_int(text: str) -> Result(i32, str)
379
+ 정수 파싱
380
+ ```freelang
381
+ match parse_int("42") {
382
+ case Ok(num) -> println(str(num)),
383
+ case Err(e) -> println("Error: " + e)
384
+ }
385
+ ```
386
+
387
+ #### range(start: i32, end: i32) -> [i32]
388
+ 범위 생성
389
+ ```freelang
390
+ let nums = range(1, 5) // [1, 2, 3, 4]
391
+ ```
392
+
393
+ #### println(text: str) -> void
394
+ 출력
395
+ ```freelang
396
+ println("Hello, World!")
397
+ ```
398
+
399
+ ---
400
+
401
+ ## 📊 함수 분포
402
+
403
+ ```
404
+ 문자열: 8개 (19%)
405
+ 배열: 7개 (17%)
406
+ 수학: 7개 (17%)
407
+ 파일: 4개 (10%)
408
+ 정규식: 3개 (7%)
409
+ CSV: 2개 (5%)
410
+ 날짜: 3개 (7%)
411
+ YAML: 2개 (5%)
412
+ 데이터베이스: 5개 (12%)
413
+ ───────────────────
414
+ 합계: 42개
415
+ ```
416
+
417
+ ---
418
+
419
+ ## 💡 사용 팁
420
+
421
+ ### 1. 에러 처리 필수
422
+ ```freelang
423
+ // ✅ 좋은 방법
424
+ match parse_int(user_input) {
425
+ case Ok(num) -> use_number(num),
426
+ case Err(e) -> handle_error(e)
427
+ }
428
+
429
+ // ❌ 나쁜 방법 (에러 무시)
430
+ let num = parse_int(user_input)
431
+ ```
432
+
433
+ ### 2. Option 확인
434
+ ```freelang
435
+ // ✅ 좋은 방법
436
+ match arr.first() {
437
+ case Some(val) -> process(val),
438
+ case None -> println("Empty")
439
+ }
440
+
441
+ // ❌ 위험한 방법
442
+ let val = arr[0] // 인덱스 범위 체크 필요
443
+ ```
444
+
445
+ ### 3. 리소스 관리
446
+ ```freelang
447
+ // ✅ 좋은 방법
448
+ match db_open("app.db") {
449
+ case Ok(db) -> {
450
+ db_query(db, "...")
451
+ db_close(db)
452
+ },
453
+ case Err(e) -> println("Error")
454
+ }
455
+ ```
456
+
457
+ ---
458
+
459
+ **Last Updated: 2026-04-05**