vx-toolkit 1.16.2__py3-none-any.whl
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.
- vx_toolkit/__init__.py +10 -0
- vx_toolkit/_bin/headers/collections/vec.c +8 -0
- vx_toolkit/_bin/headers/collections/vec.vxh +2 -0
- vx_toolkit/_bin/headers/cpp/greet.cpp +11 -0
- vx_toolkit/_bin/headers/cpp/greet.hpp +6 -0
- vx_toolkit/_bin/headers/cpp/greet.vxh +4 -0
- vx_toolkit/_bin/headers/fmath.c +3 -0
- vx_toolkit/_bin/headers/fmath.vxh +5 -0
- vx_toolkit/_bin/headers/math.c +6 -0
- vx_toolkit/_bin/headers/math.vxh +4 -0
- vx_toolkit/_bin/headers/sys.c +9 -0
- vx_toolkit/_bin/headers/sys.vxh +3 -0
- vx_toolkit/_bin/headers/text.c +17 -0
- vx_toolkit/_bin/headers/text.vxh +6 -0
- vx_toolkit/_bin/libvxrt.a +0 -0
- vx_toolkit/_bin/libvxtidy.dylib +0 -0
- vx_toolkit/_bin/std/README.md +90 -0
- vx_toolkit/_bin/std/bytes.vx +65 -0
- vx_toolkit/_bin/std/char.vx +83 -0
- vx_toolkit/_bin/std/collections/hashmap.vx +31 -0
- vx_toolkit/_bin/std/collections/linked_list.vx +166 -0
- vx_toolkit/_bin/std/collections/mod.vx +8 -0
- vx_toolkit/_bin/std/collections/set.vx +102 -0
- vx_toolkit/_bin/std/collections/vec.vx +40 -0
- vx_toolkit/_bin/std/conv.vx +57 -0
- vx_toolkit/_bin/std/error.vx +165 -0
- vx_toolkit/_bin/std/io/dir.vx +50 -0
- vx_toolkit/_bin/std/io/file.vx +154 -0
- vx_toolkit/_bin/std/io/mod.vx +5 -0
- vx_toolkit/_bin/std/io/path.vx +105 -0
- vx_toolkit/_bin/std/io/stream.vx +82 -0
- vx_toolkit/_bin/std/io.vx +6 -0
- vx_toolkit/_bin/std/iter.vx +67 -0
- vx_toolkit/_bin/std/macros.vx +117 -0
- vx_toolkit/_bin/std/math/math.vx +341 -0
- vx_toolkit/_bin/std/math/mod.vx +6 -0
- vx_toolkit/_bin/std/math/random.vx +104 -0
- vx_toolkit/_bin/std/mem/allocator.vx +9 -0
- vx_toolkit/_bin/std/mem/arena.vx +41 -0
- vx_toolkit/_bin/std/mem/general.vx +35 -0
- vx_toolkit/_bin/std/mem/mod.vx +11 -0
- vx_toolkit/_bin/std/mem/page.vx +23 -0
- vx_toolkit/_bin/std/mod.vx +5 -0
- vx_toolkit/_bin/std/option.vx +68 -0
- vx_toolkit/_bin/std/prelude.vx +13 -0
- vx_toolkit/_bin/std/reflect/mod.vx +129 -0
- vx_toolkit/_bin/std/string/codec.vx +146 -0
- vx_toolkit/_bin/std/string/core.vx +28 -0
- vx_toolkit/_bin/std/string/iter.vx +49 -0
- vx_toolkit/_bin/std/string/mod.vx +7 -0
- vx_toolkit/_bin/std/string/pattern.vx +84 -0
- vx_toolkit/_bin/std/string/util.vx +369 -0
- vx_toolkit/_bin/std/sys/coroutine.vx +46 -0
- vx_toolkit/_bin/std/sys/datetime.vx +160 -0
- vx_toolkit/_bin/std/sys/duration.vx +53 -0
- vx_toolkit/_bin/std/sys/env.vx +43 -0
- vx_toolkit/_bin/std/sys/mod.vx +10 -0
- vx_toolkit/_bin/std/sys/sync.vx +132 -0
- vx_toolkit/_bin/std/sys/time.vx +28 -0
- vx_toolkit/_bin/std/sys.vx +6 -0
- vx_toolkit/_bin/std/tests/run_all.vx +627 -0
- vx_toolkit/_bin/std/tests/smoke.vx +4 -0
- vx_toolkit/_bin/std/tests/test_collections.vx +42 -0
- vx_toolkit/_bin/std/tests/test_string_io.vx +202 -0
- vx_toolkit/_bin/vfmt +0 -0
- vx_toolkit/_bin/vlnk +0 -0
- vx_toolkit/_bin/vmake +0 -0
- vx_toolkit/_bin/vmake-lsp +0 -0
- vx_toolkit/_bin/vx +0 -0
- vx_toolkit/_bin/vxc +0 -0
- vx_toolkit/_bin/vxls +0 -0
- vx_toolkit/_dispatch.py +121 -0
- vx_toolkit-1.16.2.dist-info/METADATA +13 -0
- vx_toolkit-1.16.2.dist-info/RECORD +77 -0
- vx_toolkit-1.16.2.dist-info/WHEEL +4 -0
- vx_toolkit-1.16.2.dist-info/entry_points.txt +8 -0
- vx_toolkit-1.16.2.dist-info/licenses/LICENSE +198 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::string —— 字符串处理模块
|
|
3
|
+
# 扩展内建字符串操作
|
|
4
|
+
# ============================================================
|
|
5
|
+
|
|
6
|
+
import std.error
|
|
7
|
+
import std.collections.vec
|
|
8
|
+
|
|
9
|
+
# ---- String 工具类(静态方法集合)----
|
|
10
|
+
# 所有方法都是静态的,接收 string 作为首个参数
|
|
11
|
+
class StringUtil:
|
|
12
|
+
|
|
13
|
+
# ========== 基本信息 ==========
|
|
14
|
+
|
|
15
|
+
# 字符串长度
|
|
16
|
+
func size(s: var) -> int:
|
|
17
|
+
return len(s)
|
|
18
|
+
|
|
19
|
+
# 是否为空
|
|
20
|
+
func is_empty(s: var) -> bool:
|
|
21
|
+
if len(s) == 0:
|
|
22
|
+
return true
|
|
23
|
+
return false
|
|
24
|
+
|
|
25
|
+
# ========== 拼接 & 截取 ==========
|
|
26
|
+
|
|
27
|
+
# 字符串拼接(等于使用 + 运算符)
|
|
28
|
+
func concat(a: var, b: var) -> var:
|
|
29
|
+
return a + b
|
|
30
|
+
|
|
31
|
+
# 重复字符串 n 次
|
|
32
|
+
func repeat(s: var, n: int) -> var:
|
|
33
|
+
var result = ""
|
|
34
|
+
var i = 0
|
|
35
|
+
while i < n:
|
|
36
|
+
result = result + s
|
|
37
|
+
i = i + 1
|
|
38
|
+
return result
|
|
39
|
+
|
|
40
|
+
# 截取子串 [start, end)
|
|
41
|
+
func slice(s: var, start: int, end: int) -> var:
|
|
42
|
+
var s_len = len(s)
|
|
43
|
+
if start < 0:
|
|
44
|
+
start = 0
|
|
45
|
+
if end > s_len:
|
|
46
|
+
end = s_len
|
|
47
|
+
if start >= end:
|
|
48
|
+
return ""
|
|
49
|
+
|
|
50
|
+
var result = ""
|
|
51
|
+
var i = start
|
|
52
|
+
while i < end:
|
|
53
|
+
result = result + s[i]
|
|
54
|
+
i = i + 1
|
|
55
|
+
return result
|
|
56
|
+
|
|
57
|
+
# 从 start 到末尾
|
|
58
|
+
func slice_from(s: var, start: int) -> var:
|
|
59
|
+
return StringUtil.slice(s, start, len(s))
|
|
60
|
+
|
|
61
|
+
# 从头到 end
|
|
62
|
+
func slice_to(s: var, end: int) -> var:
|
|
63
|
+
return StringUtil.slice(s, 0, end)
|
|
64
|
+
|
|
65
|
+
# ========== 查找 & 匹配 ==========
|
|
66
|
+
|
|
67
|
+
# 查找子串首次出现位置,-1 表示未找到
|
|
68
|
+
func find(s: var, pattern: var) -> int:
|
|
69
|
+
var s_len = len(s)
|
|
70
|
+
var p_len = len(pattern)
|
|
71
|
+
if p_len == 0:
|
|
72
|
+
return 0
|
|
73
|
+
if p_len > s_len:
|
|
74
|
+
return -1
|
|
75
|
+
|
|
76
|
+
var i = 0
|
|
77
|
+
while i <= s_len - p_len:
|
|
78
|
+
var match = true
|
|
79
|
+
var j = 0
|
|
80
|
+
while j < p_len:
|
|
81
|
+
if s[i + j] != pattern[j]:
|
|
82
|
+
match = false
|
|
83
|
+
j = p_len
|
|
84
|
+
j = j + 1
|
|
85
|
+
if match:
|
|
86
|
+
return i
|
|
87
|
+
i = i + 1
|
|
88
|
+
return -1
|
|
89
|
+
|
|
90
|
+
# 从右侧查找
|
|
91
|
+
func rfind(s: var, pattern: var) -> int:
|
|
92
|
+
var s_len = len(s)
|
|
93
|
+
var p_len = len(pattern)
|
|
94
|
+
if p_len == 0:
|
|
95
|
+
return s_len
|
|
96
|
+
if p_len > s_len:
|
|
97
|
+
return -1
|
|
98
|
+
|
|
99
|
+
var i = s_len - p_len
|
|
100
|
+
while i >= 0:
|
|
101
|
+
var match = true
|
|
102
|
+
var j = 0
|
|
103
|
+
while j < p_len:
|
|
104
|
+
if s[i + j] != pattern[j]:
|
|
105
|
+
match = false
|
|
106
|
+
j = p_len
|
|
107
|
+
j = j + 1
|
|
108
|
+
if match:
|
|
109
|
+
return i
|
|
110
|
+
i = i - 1
|
|
111
|
+
return -1
|
|
112
|
+
|
|
113
|
+
# 是否包含子串
|
|
114
|
+
func contains(s: var, pattern: var) -> bool:
|
|
115
|
+
if StringUtil.find(s, pattern) >= 0:
|
|
116
|
+
return true
|
|
117
|
+
return false
|
|
118
|
+
|
|
119
|
+
# 是否以 prefix 开头
|
|
120
|
+
func starts_with(s: var, prefix: var) -> bool:
|
|
121
|
+
var p_len = len(prefix)
|
|
122
|
+
if p_len > len(s):
|
|
123
|
+
return false
|
|
124
|
+
var i = 0
|
|
125
|
+
while i < p_len:
|
|
126
|
+
if s[i] != prefix[i]:
|
|
127
|
+
return false
|
|
128
|
+
i = i + 1
|
|
129
|
+
return true
|
|
130
|
+
|
|
131
|
+
# 是否以 suffix 结尾
|
|
132
|
+
func ends_with(s: var, suffix: var) -> bool:
|
|
133
|
+
var s_len = len(s)
|
|
134
|
+
var sf_len = len(suffix)
|
|
135
|
+
if sf_len > s_len:
|
|
136
|
+
return false
|
|
137
|
+
var i = 0
|
|
138
|
+
while i < sf_len:
|
|
139
|
+
if s[s_len - sf_len + i] != suffix[i]:
|
|
140
|
+
return false
|
|
141
|
+
i = i + 1
|
|
142
|
+
return true
|
|
143
|
+
|
|
144
|
+
# 子串出现次数
|
|
145
|
+
func count(s: var, pattern: var) -> int:
|
|
146
|
+
var c = 0
|
|
147
|
+
var pos = StringUtil.find(s, pattern)
|
|
148
|
+
while pos >= 0:
|
|
149
|
+
c = c + 1
|
|
150
|
+
s = StringUtil.slice_from(s, pos + len(pattern))
|
|
151
|
+
pos = StringUtil.find(s, pattern)
|
|
152
|
+
return c
|
|
153
|
+
|
|
154
|
+
# ========== 变换 ==========
|
|
155
|
+
|
|
156
|
+
# 替换首次出现的子串
|
|
157
|
+
func replace(s: var, from: var, to: var) -> var:
|
|
158
|
+
var pos = StringUtil.find(s, from)
|
|
159
|
+
if pos < 0:
|
|
160
|
+
return s
|
|
161
|
+
var before = StringUtil.slice_to(s, pos)
|
|
162
|
+
var after = StringUtil.slice_from(s, pos + len(from))
|
|
163
|
+
return before + to + after
|
|
164
|
+
|
|
165
|
+
# 替换所有出现的子串
|
|
166
|
+
func replace_all(s: var, from: var, to: var) -> var:
|
|
167
|
+
var result = ""
|
|
168
|
+
var current = s
|
|
169
|
+
var pos = StringUtil.find(current, from)
|
|
170
|
+
while pos >= 0:
|
|
171
|
+
result = result + StringUtil.slice_to(current, pos) + to
|
|
172
|
+
current = StringUtil.slice_from(current, pos + len(from))
|
|
173
|
+
pos = StringUtil.find(current, from)
|
|
174
|
+
result = result + current
|
|
175
|
+
return result
|
|
176
|
+
|
|
177
|
+
# 去除首尾空白(空格、tab、换行)
|
|
178
|
+
func trim(s: var) -> var:
|
|
179
|
+
return StringUtil.trim_end(StringUtil.trim_start(s))
|
|
180
|
+
|
|
181
|
+
# 去除首部空白
|
|
182
|
+
func trim_start(s: var) -> var:
|
|
183
|
+
var i = 0
|
|
184
|
+
var s_len = len(s)
|
|
185
|
+
while i < s_len:
|
|
186
|
+
var ch = s[i]
|
|
187
|
+
if ch != " ":
|
|
188
|
+
if ch != "\t":
|
|
189
|
+
if ch != "\n":
|
|
190
|
+
if ch != "\r":
|
|
191
|
+
i = s_len
|
|
192
|
+
if i < s_len:
|
|
193
|
+
if ch != " ":
|
|
194
|
+
if ch != "\t":
|
|
195
|
+
if ch != "\n":
|
|
196
|
+
if ch != "\r":
|
|
197
|
+
i = s_len
|
|
198
|
+
else:
|
|
199
|
+
i = i + 1
|
|
200
|
+
return StringUtil.slice_from(s, i)
|
|
201
|
+
|
|
202
|
+
# 去除尾部空白
|
|
203
|
+
func trim_end(s: var) -> var:
|
|
204
|
+
var i = len(s) - 1
|
|
205
|
+
while i >= 0:
|
|
206
|
+
var ch = s[i]
|
|
207
|
+
if ch != " ":
|
|
208
|
+
if ch != "\t":
|
|
209
|
+
if ch != "\n":
|
|
210
|
+
if ch != "\r":
|
|
211
|
+
i = -1
|
|
212
|
+
if i >= 0:
|
|
213
|
+
if ch != " ":
|
|
214
|
+
if ch != "\t":
|
|
215
|
+
if ch != "\n":
|
|
216
|
+
if ch != "\r":
|
|
217
|
+
i = -1
|
|
218
|
+
else:
|
|
219
|
+
i = i - 1
|
|
220
|
+
return StringUtil.slice_to(s, i + 1)
|
|
221
|
+
|
|
222
|
+
# 转换为小写(ASCII)
|
|
223
|
+
func to_lower(s: var) -> var:
|
|
224
|
+
var result = ""
|
|
225
|
+
var i = 0
|
|
226
|
+
var s_len = len(s)
|
|
227
|
+
while i < s_len:
|
|
228
|
+
var ch = s[i]
|
|
229
|
+
# ASCII 'A'~'Z' = 65~90, 'a'~'z' = 97~122
|
|
230
|
+
var code = ch[0]
|
|
231
|
+
if code >= "A"[0]:
|
|
232
|
+
if code <= "Z"[0]:
|
|
233
|
+
# 转为小写:ch + 32
|
|
234
|
+
var lower_code = code - "A"[0] + "a"[0]
|
|
235
|
+
result = result + lower_code
|
|
236
|
+
i = i + 1
|
|
237
|
+
continue
|
|
238
|
+
result = result + ch
|
|
239
|
+
i = i + 1
|
|
240
|
+
return result
|
|
241
|
+
|
|
242
|
+
# 转换为大写(ASCII)
|
|
243
|
+
func to_upper(s: var) -> var:
|
|
244
|
+
var result = ""
|
|
245
|
+
var i = 0
|
|
246
|
+
var s_len = len(s)
|
|
247
|
+
while i < s_len:
|
|
248
|
+
var ch = s[i]
|
|
249
|
+
var code = ch[0]
|
|
250
|
+
if code >= "a"[0]:
|
|
251
|
+
if code <= "z"[0]:
|
|
252
|
+
var upper_code = code - "a"[0] + "A"[0]
|
|
253
|
+
result = result + upper_code
|
|
254
|
+
i = i + 1
|
|
255
|
+
continue
|
|
256
|
+
result = result + ch
|
|
257
|
+
i = i + 1
|
|
258
|
+
return result
|
|
259
|
+
|
|
260
|
+
# 首字母大写
|
|
261
|
+
func capitalize(s: var) -> var:
|
|
262
|
+
if len(s) == 0:
|
|
263
|
+
return ""
|
|
264
|
+
var first = StringUtil.to_upper(StringUtil.slice_to(s, 1))
|
|
265
|
+
var rest = StringUtil.to_lower(StringUtil.slice_from(s, 1))
|
|
266
|
+
return first + rest
|
|
267
|
+
|
|
268
|
+
# ========== 分割 & 连接 ==========
|
|
269
|
+
|
|
270
|
+
# 按分隔符分割
|
|
271
|
+
func split(s: var, delim: var) -> var:
|
|
272
|
+
var result = new Vec()
|
|
273
|
+
var current = s
|
|
274
|
+
var delim_len = len(delim)
|
|
275
|
+
if delim_len == 0:
|
|
276
|
+
# 拆分为单字符
|
|
277
|
+
var i = 0
|
|
278
|
+
while i < len(s):
|
|
279
|
+
result.push(StringUtil.slice(s, i, i + 1))
|
|
280
|
+
i = i + 1
|
|
281
|
+
return result
|
|
282
|
+
|
|
283
|
+
var pos = StringUtil.find(current, delim)
|
|
284
|
+
while pos >= 0:
|
|
285
|
+
var part = StringUtil.slice_to(current, pos)
|
|
286
|
+
result.push(part)
|
|
287
|
+
current = StringUtil.slice_from(current, pos + delim_len)
|
|
288
|
+
pos = StringUtil.find(current, delim)
|
|
289
|
+
result.push(current)
|
|
290
|
+
return result
|
|
291
|
+
|
|
292
|
+
# 按空白分割
|
|
293
|
+
func split_whitespace(s: var) -> var:
|
|
294
|
+
var result = new Vec()
|
|
295
|
+
var current = ""
|
|
296
|
+
var i = 0
|
|
297
|
+
var s_len = len(s)
|
|
298
|
+
while i < s_len:
|
|
299
|
+
var ch = s[i]
|
|
300
|
+
if ch == " ":
|
|
301
|
+
if current != "":
|
|
302
|
+
result.push(current)
|
|
303
|
+
current = ""
|
|
304
|
+
elif ch == "\t":
|
|
305
|
+
if current != "":
|
|
306
|
+
result.push(current)
|
|
307
|
+
current = ""
|
|
308
|
+
elif ch == "\n":
|
|
309
|
+
if current != "":
|
|
310
|
+
result.push(current)
|
|
311
|
+
current = ""
|
|
312
|
+
else:
|
|
313
|
+
current = current + ch
|
|
314
|
+
i = i + 1
|
|
315
|
+
if current != "":
|
|
316
|
+
result.push(current)
|
|
317
|
+
return result
|
|
318
|
+
|
|
319
|
+
# 按行分割
|
|
320
|
+
func lines(s: var) -> var:
|
|
321
|
+
var result = new Vec()
|
|
322
|
+
var current = ""
|
|
323
|
+
var i = 0
|
|
324
|
+
var s_len = len(s)
|
|
325
|
+
while i < s_len:
|
|
326
|
+
var ch = s[i]
|
|
327
|
+
if ch == "\n":
|
|
328
|
+
result.push(current)
|
|
329
|
+
current = ""
|
|
330
|
+
elif ch == "\r":
|
|
331
|
+
# 跳过 \r
|
|
332
|
+
if i + 1 < s_len:
|
|
333
|
+
if s[i + 1] == "\n":
|
|
334
|
+
i = i + 1
|
|
335
|
+
result.push(current)
|
|
336
|
+
current = ""
|
|
337
|
+
else:
|
|
338
|
+
current = current + ch
|
|
339
|
+
i = i + 1
|
|
340
|
+
# 最后一行(既使是空行)
|
|
341
|
+
result.push(current)
|
|
342
|
+
return result
|
|
343
|
+
|
|
344
|
+
# 用分隔符连接字符串数组
|
|
345
|
+
func join(strings: var, sep: var) -> var:
|
|
346
|
+
var result = ""
|
|
347
|
+
var i = 0
|
|
348
|
+
var n = len(strings)
|
|
349
|
+
while i < n:
|
|
350
|
+
if i > 0:
|
|
351
|
+
result = result + sep
|
|
352
|
+
result = result + strings[i]
|
|
353
|
+
i = i + 1
|
|
354
|
+
return result
|
|
355
|
+
|
|
356
|
+
# ========== 字符访问 ==========
|
|
357
|
+
|
|
358
|
+
# 安全字符访问(返回单字符字符串)
|
|
359
|
+
func char_at(s: var, idx: int) -> var:
|
|
360
|
+
var s_len = len(s)
|
|
361
|
+
if idx < 0:
|
|
362
|
+
return Result.err(error.value_error("char_at: index " + idx + " < 0"))
|
|
363
|
+
if idx >= s_len:
|
|
364
|
+
return Result.err(error.value_error("char_at: index " + idx + " out of bounds"))
|
|
365
|
+
return Result.ok(StringUtil.slice(s, idx, idx + 1))
|
|
366
|
+
|
|
367
|
+
# 获取所有字符列表
|
|
368
|
+
func chars(s: var) -> var:
|
|
369
|
+
return StringUtil.split(s, "")
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::sys::coroutine —— 协程(用户态轻量级并发)
|
|
3
|
+
# 第一版:占位定义,等待 VM 层支持
|
|
4
|
+
# ============================================================
|
|
5
|
+
|
|
6
|
+
import std.error
|
|
7
|
+
|
|
8
|
+
# ---- CoroutineState 枚举 ----
|
|
9
|
+
enum CoroutineState:
|
|
10
|
+
Ready = 0
|
|
11
|
+
Running = 1
|
|
12
|
+
Suspended = 2
|
|
13
|
+
Done = 3
|
|
14
|
+
|
|
15
|
+
# ---- Coroutine 类:协程句柄 ----
|
|
16
|
+
class Coroutine:
|
|
17
|
+
id: int
|
|
18
|
+
state: int
|
|
19
|
+
|
|
20
|
+
# 创建协程
|
|
21
|
+
func spawn(func: var) -> var:
|
|
22
|
+
# TODO: 需要 VM 层 CallFrame 保存/恢复机制
|
|
23
|
+
var co = new Coroutine()
|
|
24
|
+
co.id = 0
|
|
25
|
+
co.state = CoroutineState.Ready
|
|
26
|
+
return co
|
|
27
|
+
|
|
28
|
+
# 恢复执行
|
|
29
|
+
func resume() -> var:
|
|
30
|
+
# TODO: 需要 VM 支持
|
|
31
|
+
return Result.err(error.runtime_error("Coroutine.resume: not implemented"))
|
|
32
|
+
|
|
33
|
+
# 让出执行权
|
|
34
|
+
func yield_co():
|
|
35
|
+
# TODO: 需要 VM 支持
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
# 是否完成
|
|
39
|
+
func is_done() -> bool:
|
|
40
|
+
if self.state == CoroutineState.Done:
|
|
41
|
+
return true
|
|
42
|
+
return false
|
|
43
|
+
|
|
44
|
+
# 获取协程 ID
|
|
45
|
+
func get_id() -> int:
|
|
46
|
+
return self.id
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::sys::datetime —— 日期时间
|
|
3
|
+
# ============================================================
|
|
4
|
+
|
|
5
|
+
import std.error
|
|
6
|
+
import std.math
|
|
7
|
+
import std.collections.vec
|
|
8
|
+
|
|
9
|
+
# ---- DateTime 类:日期时间表示 ----
|
|
10
|
+
class DateTime:
|
|
11
|
+
year: int
|
|
12
|
+
month: int
|
|
13
|
+
day: int
|
|
14
|
+
hour: int
|
|
15
|
+
minute: int
|
|
16
|
+
second: int
|
|
17
|
+
nanos: int
|
|
18
|
+
weekday: int # 0=Sunday ... 6=Saturday
|
|
19
|
+
|
|
20
|
+
# 请求当前日期时间(需要 VM 支持的系统时钟)
|
|
21
|
+
func now() -> var:
|
|
22
|
+
# TODO: 需要 VM 内建 system_time 指令
|
|
23
|
+
var dt = new DateTime()
|
|
24
|
+
dt.year = 1970
|
|
25
|
+
dt.month = 1
|
|
26
|
+
dt.day = 1
|
|
27
|
+
dt.hour = 0
|
|
28
|
+
dt.minute = 0
|
|
29
|
+
dt.second = 0
|
|
30
|
+
dt.nanos = 0
|
|
31
|
+
dt.weekday = 4 # 1970-01-01 是周四
|
|
32
|
+
return dt
|
|
33
|
+
|
|
34
|
+
# 从 Unix 时间戳创建
|
|
35
|
+
func from_timestamp(ts: int) -> var:
|
|
36
|
+
# 使用公历算法将 Unix 时间戳转为日期
|
|
37
|
+
var dt = new DateTime()
|
|
38
|
+
|
|
39
|
+
# 先转为从 1970-01-01 的天数
|
|
40
|
+
var days = ts / 86400
|
|
41
|
+
var secs_remain = ts % 86400
|
|
42
|
+
if secs_remain < 0:
|
|
43
|
+
secs_remain = secs_remain + 86400
|
|
44
|
+
days = days - 1
|
|
45
|
+
|
|
46
|
+
# 计算时分秒
|
|
47
|
+
dt.hour = secs_remain / 3600
|
|
48
|
+
secs_remain = secs_remain % 3600
|
|
49
|
+
dt.minute = secs_remain / 60
|
|
50
|
+
dt.second = secs_remain % 60
|
|
51
|
+
dt.nanos = 0
|
|
52
|
+
|
|
53
|
+
# 从 Epoch 1970-01-01 计算年月日
|
|
54
|
+
# 使用偏移算法:向前走到目标天数
|
|
55
|
+
var remaining_days = days
|
|
56
|
+
dt.year = 1970
|
|
57
|
+
dt.month = 1
|
|
58
|
+
|
|
59
|
+
# 按年推进
|
|
60
|
+
while remaining_days >= 365:
|
|
61
|
+
var days_in_this_year = 365
|
|
62
|
+
if DateTime._is_leap(dt.year):
|
|
63
|
+
days_in_this_year = 366
|
|
64
|
+
if remaining_days >= days_in_this_year:
|
|
65
|
+
remaining_days = remaining_days - days_in_this_year
|
|
66
|
+
dt.year = dt.year + 1
|
|
67
|
+
else:
|
|
68
|
+
break
|
|
69
|
+
|
|
70
|
+
# 按月推进
|
|
71
|
+
var days_in_months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
|
72
|
+
if DateTime._is_leap(dt.year):
|
|
73
|
+
days_in_months[1] = 29
|
|
74
|
+
|
|
75
|
+
var m = 0
|
|
76
|
+
while m < 12:
|
|
77
|
+
if remaining_days < days_in_months[m]:
|
|
78
|
+
dt.month = m + 1
|
|
79
|
+
dt.day = remaining_days + 1
|
|
80
|
+
break
|
|
81
|
+
remaining_days = remaining_days - days_in_months[m]
|
|
82
|
+
m = m + 1
|
|
83
|
+
|
|
84
|
+
# 计算星期几(Zeller 算法简化)
|
|
85
|
+
dt.weekday = DateTime._calc_weekday(dt.year, dt.month, dt.day)
|
|
86
|
+
|
|
87
|
+
return dt
|
|
88
|
+
|
|
89
|
+
# 转换回 Unix 时间戳
|
|
90
|
+
func to_timestamp() -> int:
|
|
91
|
+
var days = 0
|
|
92
|
+
# 从 1970 到当前年的天数
|
|
93
|
+
var y = 1970
|
|
94
|
+
while y < self.year:
|
|
95
|
+
days = days + 365
|
|
96
|
+
if DateTime._is_leap(y):
|
|
97
|
+
days = days + 1
|
|
98
|
+
y = y + 1
|
|
99
|
+
|
|
100
|
+
# 当年已过月份的天数
|
|
101
|
+
var days_in_months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
|
102
|
+
if DateTime._is_leap(self.year):
|
|
103
|
+
days_in_months[1] = 29
|
|
104
|
+
|
|
105
|
+
var m = 0
|
|
106
|
+
while m < self.month - 1:
|
|
107
|
+
days = days + days_in_months[m]
|
|
108
|
+
m = m + 1
|
|
109
|
+
|
|
110
|
+
days = days + (self.day - 1)
|
|
111
|
+
|
|
112
|
+
var total_secs = days * 86400
|
|
113
|
+
total_secs = total_secs + self.hour * 3600
|
|
114
|
+
total_secs = total_secs + self.minute * 60
|
|
115
|
+
total_secs = total_secs + self.second
|
|
116
|
+
|
|
117
|
+
return total_secs
|
|
118
|
+
|
|
119
|
+
# 格式化输出(ISO 8601 简化版)
|
|
120
|
+
func to_string() -> var:
|
|
121
|
+
return self.to_iso8601()
|
|
122
|
+
|
|
123
|
+
# ISO 8601 格式
|
|
124
|
+
func to_iso8601() -> var:
|
|
125
|
+
var s = ""
|
|
126
|
+
s = s + self.year
|
|
127
|
+
s = s + "-" + DateTime._pad2(self.month)
|
|
128
|
+
s = s + "-" + DateTime._pad2(self.day)
|
|
129
|
+
s = s + "T" + DateTime._pad2(self.hour)
|
|
130
|
+
s = s + ":" + DateTime._pad2(self.minute)
|
|
131
|
+
s = s + ":" + DateTime._pad2(self.second)
|
|
132
|
+
return s
|
|
133
|
+
|
|
134
|
+
# 填充两位数
|
|
135
|
+
func _pad2(n: int) -> var:
|
|
136
|
+
if n < 10:
|
|
137
|
+
return "0" + n
|
|
138
|
+
return n
|
|
139
|
+
|
|
140
|
+
# 判断闰年
|
|
141
|
+
func _is_leap(year: int) -> bool:
|
|
142
|
+
if year % 400 == 0:
|
|
143
|
+
return true
|
|
144
|
+
if year % 100 == 0:
|
|
145
|
+
return false
|
|
146
|
+
if year % 4 == 0:
|
|
147
|
+
return true
|
|
148
|
+
return false
|
|
149
|
+
|
|
150
|
+
# 计算星期几(Zeller 公式,返回 0=Sunday)
|
|
151
|
+
func _calc_weekday(year: int, month: int, day: int) -> int:
|
|
152
|
+
if month < 3:
|
|
153
|
+
month = month + 12
|
|
154
|
+
year = year - 1
|
|
155
|
+
var k = year % 100
|
|
156
|
+
var j = year / 100
|
|
157
|
+
var h = (day + (13 * (month + 1)) / 5 + k + k / 4 + j / 4 - 2 * j) % 7
|
|
158
|
+
if h < 0:
|
|
159
|
+
h = h + 7
|
|
160
|
+
return h
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::sys::duration —— 时间间隔
|
|
3
|
+
# ============================================================
|
|
4
|
+
|
|
5
|
+
# ---- Duration 类:时间段 ----
|
|
6
|
+
class Duration:
|
|
7
|
+
secs: int
|
|
8
|
+
nanos: int
|
|
9
|
+
|
|
10
|
+
# 从秒创建
|
|
11
|
+
func from_secs(s: float) -> var:
|
|
12
|
+
var dur = new Duration()
|
|
13
|
+
dur.secs = s
|
|
14
|
+
var frac = s - dur.secs
|
|
15
|
+
dur.nanos = frac * 1000000000.0
|
|
16
|
+
return dur
|
|
17
|
+
|
|
18
|
+
# 从毫秒创建
|
|
19
|
+
func from_millis(ms: int) -> var:
|
|
20
|
+
var dur = new Duration()
|
|
21
|
+
dur.secs = ms / 1000
|
|
22
|
+
dur.nanos = (ms % 1000) * 1000000
|
|
23
|
+
return dur
|
|
24
|
+
|
|
25
|
+
# 从微秒创建
|
|
26
|
+
func from_micros(us: int) -> var:
|
|
27
|
+
var dur = new Duration()
|
|
28
|
+
dur.secs = us / 1000000
|
|
29
|
+
dur.nanos = (us % 1000000) * 1000
|
|
30
|
+
return dur
|
|
31
|
+
|
|
32
|
+
# 从纳秒创建
|
|
33
|
+
func from_nanos(ns: int) -> var:
|
|
34
|
+
var dur = new Duration()
|
|
35
|
+
dur.secs = ns / 1000000000
|
|
36
|
+
dur.nanos = ns % 1000000000
|
|
37
|
+
return dur
|
|
38
|
+
|
|
39
|
+
# 转为秒(浮点)
|
|
40
|
+
func as_secs() -> float:
|
|
41
|
+
return self.secs + self.nanos / 1000000000.0
|
|
42
|
+
|
|
43
|
+
# 转为毫秒
|
|
44
|
+
func as_millis() -> int:
|
|
45
|
+
return self.secs * 1000 + self.nanos / 1000000
|
|
46
|
+
|
|
47
|
+
# 转为微秒
|
|
48
|
+
func as_micros() -> int:
|
|
49
|
+
return self.secs * 1000000 + self.nanos / 1000
|
|
50
|
+
|
|
51
|
+
# 转为纳秒
|
|
52
|
+
func as_nanos() -> int:
|
|
53
|
+
return self.secs * 1000000000 + self.nanos
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::sys::env —— 环境变量与进程控制
|
|
3
|
+
# ============================================================
|
|
4
|
+
|
|
5
|
+
import std.error
|
|
6
|
+
import std.collections.vec
|
|
7
|
+
|
|
8
|
+
# ---- Env 类:环境和进程工具(静态方法)----
|
|
9
|
+
class Env:
|
|
10
|
+
# 获取命令行参数(封装 VM 内建 sys_argv)
|
|
11
|
+
func args() -> var:
|
|
12
|
+
var raw = sys_argv()
|
|
13
|
+
if raw == nil:
|
|
14
|
+
return []
|
|
15
|
+
return raw
|
|
16
|
+
|
|
17
|
+
# 获取环境变量(占位)
|
|
18
|
+
func get(key: var) -> var:
|
|
19
|
+
# TODO: 需要 VM 内建 get_env 指令
|
|
20
|
+
return nil
|
|
21
|
+
|
|
22
|
+
# 设置环境变量(占位)
|
|
23
|
+
func set(key: var, val: var):
|
|
24
|
+
# TODO: 需要 VM 内建 set_env 指令
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
# 删除环境变量(占位)
|
|
28
|
+
func remove(key: var):
|
|
29
|
+
# TODO: 需要 VM 内建 unset_env 指令
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
# 退出进程
|
|
33
|
+
func exit(code: int):
|
|
34
|
+
# TODO: 需要 VM 内建 exit 指令
|
|
35
|
+
out("[EXIT] code=" + code)
|
|
36
|
+
|
|
37
|
+
# 获取当前工作目录(占位)
|
|
38
|
+
func current_dir() -> var:
|
|
39
|
+
return Result.err(error.system_error("Env.current_dir: not implemented"))
|
|
40
|
+
|
|
41
|
+
# 获取临时目录(占位)
|
|
42
|
+
func temp_dir() -> var:
|
|
43
|
+
return "/tmp"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::sys —— 模块入口
|
|
3
|
+
# ============================================================
|
|
4
|
+
|
|
5
|
+
import std.sys.time
|
|
6
|
+
import std.sys.duration
|
|
7
|
+
import std.sys.datetime
|
|
8
|
+
import std.sys.coroutine
|
|
9
|
+
import std.sys.sync
|
|
10
|
+
import std.sys.env
|