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,67 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::iter —— 数组/Vec 通用迭代工具
|
|
3
|
+
# 补充 Vec 未提供的 find / any / all / reduce
|
|
4
|
+
# ============================================================
|
|
5
|
+
|
|
6
|
+
import std.error
|
|
7
|
+
import std.collections.vec
|
|
8
|
+
|
|
9
|
+
class Iter:
|
|
10
|
+
# 查找第一个满足 pred 的元素,返回 Result
|
|
11
|
+
func find(arr: var, pred: var) -> var:
|
|
12
|
+
var i = 0
|
|
13
|
+
var n = len(arr)
|
|
14
|
+
while i < n:
|
|
15
|
+
if pred(arr[i]):
|
|
16
|
+
return Result.ok(arr[i])
|
|
17
|
+
i = i + 1
|
|
18
|
+
return Result.err(error.value_error("Iter.find: no matching element"))
|
|
19
|
+
|
|
20
|
+
# 是否存在满足 pred 的元素
|
|
21
|
+
func any(arr: var, pred: var) -> bool:
|
|
22
|
+
var i = 0
|
|
23
|
+
var n = len(arr)
|
|
24
|
+
while i < n:
|
|
25
|
+
if pred(arr[i]):
|
|
26
|
+
return true
|
|
27
|
+
i = i + 1
|
|
28
|
+
return false
|
|
29
|
+
|
|
30
|
+
# 是否所有元素都满足 pred
|
|
31
|
+
func all(arr: var, pred: var) -> bool:
|
|
32
|
+
var i = 0
|
|
33
|
+
var n = len(arr)
|
|
34
|
+
while i < n:
|
|
35
|
+
if pred(arr[i]) == false:
|
|
36
|
+
return false
|
|
37
|
+
i = i + 1
|
|
38
|
+
return true
|
|
39
|
+
|
|
40
|
+
# 从左到右归约
|
|
41
|
+
func reduce(arr: var, init: var, f: var) -> var:
|
|
42
|
+
var acc = init
|
|
43
|
+
var i = 0
|
|
44
|
+
var n = len(arr)
|
|
45
|
+
while i < n:
|
|
46
|
+
acc = f(acc, arr[i])
|
|
47
|
+
i = i + 1
|
|
48
|
+
return acc
|
|
49
|
+
|
|
50
|
+
# 将数组复制到新 Vec
|
|
51
|
+
func collect(arr: var) -> var:
|
|
52
|
+
var v = new Vec()
|
|
53
|
+
var i = 0
|
|
54
|
+
var n = len(arr)
|
|
55
|
+
while i < n:
|
|
56
|
+
v.push(arr[i])
|
|
57
|
+
i = i + 1
|
|
58
|
+
return v
|
|
59
|
+
|
|
60
|
+
# 反转数组得到新数组
|
|
61
|
+
func reversed(arr: var) -> var:
|
|
62
|
+
var result = []
|
|
63
|
+
var i = len(arr) - 1
|
|
64
|
+
while i >= 0:
|
|
65
|
+
result = result + [arr[i]]
|
|
66
|
+
i = i - 1
|
|
67
|
+
return result
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::macros —— 编译时宏工具库
|
|
3
|
+
# 提供常用的代码生成模板,在编译阶段展开,零运行时开销
|
|
4
|
+
# ============================================================
|
|
5
|
+
# 使用方式:
|
|
6
|
+
# import std # 通过 prelude 自动导入
|
|
7
|
+
# import std.macros # 按需显式导入
|
|
8
|
+
# ============================================================
|
|
9
|
+
|
|
10
|
+
# ============================================================
|
|
11
|
+
# 一、调试与日志宏
|
|
12
|
+
# ============================================================
|
|
13
|
+
|
|
14
|
+
# 断言:条件不成立时输出错误信息
|
|
15
|
+
# 用法:#assert(x > 0, "x 必须为正数")
|
|
16
|
+
macro assert(condition, message) {
|
|
17
|
+
if !condition {
|
|
18
|
+
out("Assertion failed: " + message)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
# 调试打印:输出变量名与值
|
|
23
|
+
# 用法:#debug_print("x", x)
|
|
24
|
+
macro debug_print(name, value) {
|
|
25
|
+
out("DEBUG: " + name + " = " + value)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
# 日志级别宏
|
|
29
|
+
# 用法:#log_info("服务已启动")
|
|
30
|
+
macro log_info(message) {
|
|
31
|
+
out("[INFO] " + message)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
macro log_warn(message) {
|
|
35
|
+
out("[WARN] " + message)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
macro log_error(message) {
|
|
39
|
+
out("[ERROR] " + message)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
macro log_debug(message) {
|
|
43
|
+
out("[DEBUG] " + message)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
# ============================================================
|
|
47
|
+
# 二、控制流宏
|
|
48
|
+
# ============================================================
|
|
49
|
+
|
|
50
|
+
# 条件为真时执行
|
|
51
|
+
# 用法:#when(flag, out("flag 为 true"))
|
|
52
|
+
macro when(condition, action) {
|
|
53
|
+
if condition {
|
|
54
|
+
action
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
# 条件为假时执行
|
|
59
|
+
# 用法:#unless(flag, out("flag 为 false"))
|
|
60
|
+
macro unless(condition, action) {
|
|
61
|
+
if !condition {
|
|
62
|
+
action
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# 重复执行 n 次
|
|
67
|
+
# 用法:#repeat(3, out("Hello"))
|
|
68
|
+
macro repeat(n, body) {
|
|
69
|
+
var __vx_macro_i = 0
|
|
70
|
+
while __vx_macro_i < n {
|
|
71
|
+
body
|
|
72
|
+
__vx_macro_i = __vx_macro_i + 1
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# repeat 的别名
|
|
77
|
+
macro times(n, body) {
|
|
78
|
+
var __vx_macro_i = 0
|
|
79
|
+
while __vx_macro_i < n {
|
|
80
|
+
body
|
|
81
|
+
__vx_macro_i = __vx_macro_i + 1
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# ============================================================
|
|
86
|
+
# 三、变量操作宏
|
|
87
|
+
# ============================================================
|
|
88
|
+
|
|
89
|
+
# 交换两个可赋值变量的值
|
|
90
|
+
# 用法:#swap(a, b)
|
|
91
|
+
# 注意:a、b 必须是可修改的左值(如变量、字段)
|
|
92
|
+
macro swap(a, b) {
|
|
93
|
+
var __vx_macro_temp = a
|
|
94
|
+
a = b
|
|
95
|
+
b = __vx_macro_temp
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
# ============================================================
|
|
99
|
+
# 四、Result 辅助宏
|
|
100
|
+
# ============================================================
|
|
101
|
+
|
|
102
|
+
# 确保 Result 成功,否则输出错误信息
|
|
103
|
+
# 用法:#ensure_ok(result, "读取配置失败")
|
|
104
|
+
macro ensure_ok(result, message) {
|
|
105
|
+
if !result.is_ok {
|
|
106
|
+
out("Error: " + message)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# 如果 Result 失败则直接返回该 Result
|
|
111
|
+
# 用法:#try_return(read_file(path))
|
|
112
|
+
# 注意:仅在返回 Result 的函数中使用
|
|
113
|
+
macro try_return(result) {
|
|
114
|
+
if !result.is_ok {
|
|
115
|
+
return result
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::math —— 基础数学运算模块
|
|
3
|
+
# ============================================================
|
|
4
|
+
|
|
5
|
+
import std.collections.vec
|
|
6
|
+
|
|
7
|
+
# ---- 数学常量 ----
|
|
8
|
+
# 注:VX 当前无 const 关键字,使用函数返回常量值
|
|
9
|
+
|
|
10
|
+
func math_pi() -> float:
|
|
11
|
+
return 3.141592653589793
|
|
12
|
+
|
|
13
|
+
func math_e() -> float:
|
|
14
|
+
return 2.718281828459045
|
|
15
|
+
|
|
16
|
+
func math_tau() -> float:
|
|
17
|
+
return 6.283185307179586
|
|
18
|
+
|
|
19
|
+
func deg_to_rad() -> float:
|
|
20
|
+
return 0.017453292519943295
|
|
21
|
+
|
|
22
|
+
func rad_to_deg() -> float:
|
|
23
|
+
return 57.29577951308232
|
|
24
|
+
|
|
25
|
+
# ========== 基础函数 ==========
|
|
26
|
+
|
|
27
|
+
func abs(x: float) -> float:
|
|
28
|
+
if x < 0.0:
|
|
29
|
+
return -x
|
|
30
|
+
return x
|
|
31
|
+
|
|
32
|
+
func abs_int(x: int) -> int:
|
|
33
|
+
if x < 0:
|
|
34
|
+
return -x
|
|
35
|
+
return x
|
|
36
|
+
|
|
37
|
+
func min(a: var, b: var) -> var:
|
|
38
|
+
if a < b:
|
|
39
|
+
return a
|
|
40
|
+
return b
|
|
41
|
+
|
|
42
|
+
func max(a: var, b: var) -> var:
|
|
43
|
+
if a > b:
|
|
44
|
+
return a
|
|
45
|
+
return b
|
|
46
|
+
|
|
47
|
+
func clamp(val: var, lo: var, hi: var) -> var:
|
|
48
|
+
if val < lo:
|
|
49
|
+
return lo
|
|
50
|
+
if val > hi:
|
|
51
|
+
return hi
|
|
52
|
+
return val
|
|
53
|
+
|
|
54
|
+
func floor(x: float) -> int:
|
|
55
|
+
var i = x
|
|
56
|
+
if i > x:
|
|
57
|
+
i = i - 1
|
|
58
|
+
return i
|
|
59
|
+
|
|
60
|
+
func ceil(x: float) -> int:
|
|
61
|
+
var i = x
|
|
62
|
+
if i < x:
|
|
63
|
+
i = i + 1
|
|
64
|
+
return i
|
|
65
|
+
|
|
66
|
+
func round(x: float) -> int:
|
|
67
|
+
return floor(x + 0.5)
|
|
68
|
+
|
|
69
|
+
func trunc(x: float) -> int:
|
|
70
|
+
if x >= 0.0:
|
|
71
|
+
return floor(x)
|
|
72
|
+
return ceil(x)
|
|
73
|
+
|
|
74
|
+
func fract(x: float) -> float:
|
|
75
|
+
return x - floor(x)
|
|
76
|
+
|
|
77
|
+
func sign(x: float) -> int:
|
|
78
|
+
if x > 0.0:
|
|
79
|
+
return 1
|
|
80
|
+
if x < 0.0:
|
|
81
|
+
return -1
|
|
82
|
+
return 0
|
|
83
|
+
|
|
84
|
+
# ========== 幂/对数 ==========
|
|
85
|
+
|
|
86
|
+
# 整数幂运算
|
|
87
|
+
func pow_int(base: int, exp: int) -> int:
|
|
88
|
+
if exp < 0:
|
|
89
|
+
return 0
|
|
90
|
+
var result = 1
|
|
91
|
+
var i = 0
|
|
92
|
+
while i < exp:
|
|
93
|
+
result = result * base
|
|
94
|
+
i = i + 1
|
|
95
|
+
return result
|
|
96
|
+
|
|
97
|
+
# 浮点幂运算(整数指数递归快速幂)
|
|
98
|
+
func pow(base: float, exp: int) -> float:
|
|
99
|
+
if exp == 0:
|
|
100
|
+
return 1.0
|
|
101
|
+
if exp < 0:
|
|
102
|
+
return 1.0 / pow(base, -exp)
|
|
103
|
+
var half = pow(base, exp / 2)
|
|
104
|
+
if exp % 2 == 0:
|
|
105
|
+
return half * half
|
|
106
|
+
return half * half * base
|
|
107
|
+
|
|
108
|
+
# 平方根(牛顿迭代法)
|
|
109
|
+
func sqrt(x: float) -> float:
|
|
110
|
+
if x < 0.0:
|
|
111
|
+
return 0.0
|
|
112
|
+
if x == 0.0:
|
|
113
|
+
return 0.0
|
|
114
|
+
var guess = x
|
|
115
|
+
var i = 0
|
|
116
|
+
while i < 20:
|
|
117
|
+
guess = (guess + x / guess) / 2.0
|
|
118
|
+
i = i + 1
|
|
119
|
+
return guess
|
|
120
|
+
|
|
121
|
+
# 立方根
|
|
122
|
+
func cbrt(x: float) -> float:
|
|
123
|
+
if x == 0.0:
|
|
124
|
+
return 0.0
|
|
125
|
+
var neg = false
|
|
126
|
+
if x < 0.0:
|
|
127
|
+
neg = true
|
|
128
|
+
x = -x
|
|
129
|
+
var guess = x
|
|
130
|
+
var i = 0
|
|
131
|
+
while i < 30:
|
|
132
|
+
guess = (2.0 * guess + x / (guess * guess)) / 3.0
|
|
133
|
+
i = i + 1
|
|
134
|
+
if neg:
|
|
135
|
+
return -guess
|
|
136
|
+
return guess
|
|
137
|
+
|
|
138
|
+
# e^x(泰勒级数)
|
|
139
|
+
func exp(x: float) -> float:
|
|
140
|
+
var result = 1.0
|
|
141
|
+
var term = 1.0
|
|
142
|
+
var n = 1
|
|
143
|
+
while n < 20:
|
|
144
|
+
term = term * x / n
|
|
145
|
+
result = result + term
|
|
146
|
+
n = n + 1
|
|
147
|
+
return result
|
|
148
|
+
|
|
149
|
+
# 自然对数 ln(x)(牛顿法)
|
|
150
|
+
func ln(x: float) -> float:
|
|
151
|
+
if x <= 0.0:
|
|
152
|
+
return 0.0
|
|
153
|
+
if x == 1.0:
|
|
154
|
+
return 0.0
|
|
155
|
+
var guess = x - 1.0
|
|
156
|
+
var i = 0
|
|
157
|
+
while i < 20:
|
|
158
|
+
var exp_guess = exp(guess)
|
|
159
|
+
guess = guess + (x - exp_guess) / exp_guess
|
|
160
|
+
i = i + 1
|
|
161
|
+
return guess
|
|
162
|
+
|
|
163
|
+
# 任意底对数
|
|
164
|
+
func log(base: float, x: float) -> float:
|
|
165
|
+
return ln(x) / ln(base)
|
|
166
|
+
|
|
167
|
+
func log2(x: float) -> float:
|
|
168
|
+
return ln(x) / 0.6931471805599453
|
|
169
|
+
|
|
170
|
+
func log10(x: float) -> float:
|
|
171
|
+
return ln(x) / 2.302585092994046
|
|
172
|
+
|
|
173
|
+
# ========== 三角函数(泰勒级数近似) ==========
|
|
174
|
+
|
|
175
|
+
# 角度参数规约到 [-pi, pi]
|
|
176
|
+
func _normalize_angle(x: float) -> float:
|
|
177
|
+
var pi = math_pi()
|
|
178
|
+
var two_pi = 2.0 * pi
|
|
179
|
+
while x > pi:
|
|
180
|
+
x = x - two_pi
|
|
181
|
+
while x < -pi:
|
|
182
|
+
x = x + two_pi
|
|
183
|
+
return x
|
|
184
|
+
|
|
185
|
+
# 正弦(泰勒级数)
|
|
186
|
+
func sin(x: float) -> float:
|
|
187
|
+
x = _normalize_angle(x)
|
|
188
|
+
var result = x
|
|
189
|
+
var term = x
|
|
190
|
+
var n = 1
|
|
191
|
+
while n < 10:
|
|
192
|
+
term = term * (-x * x) / ((2 * n) * (2 * n + 1))
|
|
193
|
+
result = result + term
|
|
194
|
+
n = n + 1
|
|
195
|
+
return result
|
|
196
|
+
|
|
197
|
+
# 余弦
|
|
198
|
+
func cos(x: float) -> float:
|
|
199
|
+
var pi = math_pi()
|
|
200
|
+
return sin(x + pi / 2.0)
|
|
201
|
+
|
|
202
|
+
# 正切
|
|
203
|
+
func tan(x: float) -> float:
|
|
204
|
+
var c = cos(x)
|
|
205
|
+
if c == 0.0:
|
|
206
|
+
return 0.0
|
|
207
|
+
return sin(x) / c
|
|
208
|
+
|
|
209
|
+
# 反正弦(牛顿法 + 区间判断)
|
|
210
|
+
func asin(x: float) -> float:
|
|
211
|
+
if x < -1.0:
|
|
212
|
+
return -math_pi() / 2.0
|
|
213
|
+
if x > 1.0:
|
|
214
|
+
return math_pi() / 2.0
|
|
215
|
+
if x == 0.0:
|
|
216
|
+
return 0.0
|
|
217
|
+
# 牛顿法求解 sin(y) - x = 0
|
|
218
|
+
var guess = x
|
|
219
|
+
var i = 0
|
|
220
|
+
while i < 10:
|
|
221
|
+
var s = sin(guess)
|
|
222
|
+
var c = cos(guess)
|
|
223
|
+
if c == 0.0:
|
|
224
|
+
return guess
|
|
225
|
+
guess = guess - (s - x) / c
|
|
226
|
+
i = i + 1
|
|
227
|
+
return guess
|
|
228
|
+
|
|
229
|
+
# 反余弦
|
|
230
|
+
func acos(x: float) -> float:
|
|
231
|
+
return math_pi() / 2.0 - asin(x)
|
|
232
|
+
|
|
233
|
+
# 反正切
|
|
234
|
+
func atan(x: float) -> float:
|
|
235
|
+
if x == 0.0:
|
|
236
|
+
return 0.0
|
|
237
|
+
# 用 asin 实现:atan(x) = asin(x / sqrt(1 + x²))
|
|
238
|
+
return asin(x / sqrt(1.0 + x * x))
|
|
239
|
+
|
|
240
|
+
# atan2(y, x)
|
|
241
|
+
func atan2(y: float, x: float) -> float:
|
|
242
|
+
if x > 0.0:
|
|
243
|
+
return atan(y / x)
|
|
244
|
+
if x < 0.0:
|
|
245
|
+
if y >= 0.0:
|
|
246
|
+
return atan(y / x) + math_pi()
|
|
247
|
+
return atan(y / x) - math_pi()
|
|
248
|
+
# x == 0
|
|
249
|
+
if y > 0.0:
|
|
250
|
+
return math_pi() / 2.0
|
|
251
|
+
if y < 0.0:
|
|
252
|
+
return -math_pi() / 2.0
|
|
253
|
+
return 0.0
|
|
254
|
+
|
|
255
|
+
# 双曲正弦
|
|
256
|
+
func sinh(x: float) -> float:
|
|
257
|
+
var ex = exp(x)
|
|
258
|
+
return (ex - 1.0 / ex) / 2.0
|
|
259
|
+
|
|
260
|
+
# 双曲余弦
|
|
261
|
+
func cosh(x: float) -> float:
|
|
262
|
+
var ex = exp(x)
|
|
263
|
+
return (ex + 1.0 / ex) / 2.0
|
|
264
|
+
|
|
265
|
+
# 双曲正切
|
|
266
|
+
func tanh(x: float) -> float:
|
|
267
|
+
if x == 0.0:
|
|
268
|
+
return 0.0
|
|
269
|
+
var sh = sinh(x)
|
|
270
|
+
var ch = cosh(x)
|
|
271
|
+
if ch == 0.0:
|
|
272
|
+
return 0.0
|
|
273
|
+
return sh / ch
|
|
274
|
+
|
|
275
|
+
# ========== 数值检查 ==========
|
|
276
|
+
|
|
277
|
+
func is_nan(x: float) -> bool:
|
|
278
|
+
# NaN 不等于自身
|
|
279
|
+
if x == x:
|
|
280
|
+
return false
|
|
281
|
+
return true
|
|
282
|
+
|
|
283
|
+
func is_finite(x: float) -> bool:
|
|
284
|
+
if is_nan(x):
|
|
285
|
+
return false
|
|
286
|
+
if x == 1.0:
|
|
287
|
+
if x / 1000000000000000000000000000.0 == 0.0:
|
|
288
|
+
return true
|
|
289
|
+
return true
|
|
290
|
+
|
|
291
|
+
# ========== 通用数学工具 ==========
|
|
292
|
+
|
|
293
|
+
func hypot(x: float, y: float) -> float:
|
|
294
|
+
return sqrt(x * x + y * y)
|
|
295
|
+
|
|
296
|
+
func lerp(a: float, b: float, t: float) -> float:
|
|
297
|
+
return a + (b - a) * t
|
|
298
|
+
|
|
299
|
+
func gcd(a: int, b: int) -> int:
|
|
300
|
+
a = abs_int(a)
|
|
301
|
+
b = abs_int(b)
|
|
302
|
+
while b != 0:
|
|
303
|
+
var t = b
|
|
304
|
+
b = a % b
|
|
305
|
+
a = t
|
|
306
|
+
return a
|
|
307
|
+
|
|
308
|
+
func lcm(a: int, b: int) -> int:
|
|
309
|
+
if a == 0:
|
|
310
|
+
if b == 0:
|
|
311
|
+
return 0
|
|
312
|
+
return abs_int(b)
|
|
313
|
+
return abs_int(a * b) / gcd(a, b)
|
|
314
|
+
|
|
315
|
+
func is_prime(n: int) -> bool:
|
|
316
|
+
if n < 2:
|
|
317
|
+
return false
|
|
318
|
+
if n <= 3:
|
|
319
|
+
return true
|
|
320
|
+
if n % 2 == 0:
|
|
321
|
+
return false
|
|
322
|
+
if n % 3 == 0:
|
|
323
|
+
return false
|
|
324
|
+
var i = 5
|
|
325
|
+
while i * i <= n:
|
|
326
|
+
if n % i == 0:
|
|
327
|
+
return false
|
|
328
|
+
if n % (i + 2) == 0:
|
|
329
|
+
return false
|
|
330
|
+
i = i + 6
|
|
331
|
+
return true
|
|
332
|
+
|
|
333
|
+
func factorial(n: int) -> int:
|
|
334
|
+
if n < 0:
|
|
335
|
+
return 0
|
|
336
|
+
var result = 1
|
|
337
|
+
var i = 2
|
|
338
|
+
while i <= n:
|
|
339
|
+
result = result * i
|
|
340
|
+
i = i + 1
|
|
341
|
+
return result
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::math::random —— 随机数生成
|
|
3
|
+
# 使用 xoshiro256** 算法(简化版线性同余生成器)
|
|
4
|
+
# ============================================================
|
|
5
|
+
|
|
6
|
+
import std.math
|
|
7
|
+
|
|
8
|
+
# ---- Random 类:伪随机数生成器 ----
|
|
9
|
+
class Random:
|
|
10
|
+
seed: int # 当前种子值
|
|
11
|
+
a: int # 乘数 6364136223846793005
|
|
12
|
+
c: int # 增量 1442695040888963407
|
|
13
|
+
m: int # 模数 2^31 - 1
|
|
14
|
+
|
|
15
|
+
# 初始化(使用时钟种子)
|
|
16
|
+
func new() -> var:
|
|
17
|
+
var r = new Random()
|
|
18
|
+
# 默认种子(可通过 time 模块改进)
|
|
19
|
+
r.seed = 123456789
|
|
20
|
+
r.a = 636413622384679
|
|
21
|
+
r.c = 1442695040
|
|
22
|
+
r.m = 2147483647
|
|
23
|
+
return r
|
|
24
|
+
|
|
25
|
+
# 指定种子初始化(可复现随机序列)
|
|
26
|
+
func with_seed(seed: int) -> var:
|
|
27
|
+
var r = new Random()
|
|
28
|
+
r.seed = seed
|
|
29
|
+
r.a = 636413622384679
|
|
30
|
+
r.c = 1442695040
|
|
31
|
+
r.m = 2147483647
|
|
32
|
+
return r
|
|
33
|
+
|
|
34
|
+
# 生成下一个随机整数(LCG 算法)
|
|
35
|
+
func _next_int() -> int:
|
|
36
|
+
self.seed = (self.a * self.seed + self.c) % self.m
|
|
37
|
+
return self.seed
|
|
38
|
+
|
|
39
|
+
# 生成 [0, 1) 的浮点数
|
|
40
|
+
func next() -> float:
|
|
41
|
+
var r = self._next_int()
|
|
42
|
+
var m = self.m
|
|
43
|
+
return r / m
|
|
44
|
+
|
|
45
|
+
# 生成 [lo, hi] 的整数
|
|
46
|
+
func next_int(lo: int, hi: int) -> int:
|
|
47
|
+
if lo >= hi:
|
|
48
|
+
return lo
|
|
49
|
+
var range = hi - lo + 1
|
|
50
|
+
var r = self._next_int()
|
|
51
|
+
return lo + (r % range)
|
|
52
|
+
|
|
53
|
+
# 生成 [lo, hi) 的浮点数
|
|
54
|
+
func next_float(lo: float, hi: float) -> float:
|
|
55
|
+
if lo >= hi:
|
|
56
|
+
return lo
|
|
57
|
+
return lo + self.next() * (hi - lo)
|
|
58
|
+
|
|
59
|
+
# 正态分布(Box-Muller 变换)
|
|
60
|
+
func gaussian(mean: float, stddev: float) -> float:
|
|
61
|
+
var u1 = self.next()
|
|
62
|
+
if u1 == 0.0:
|
|
63
|
+
u1 = 0.000001
|
|
64
|
+
var u2 = self.next()
|
|
65
|
+
var z = sqrt(-2.0 * ln(u1)) * cos(2.0 * math_pi() * u2)
|
|
66
|
+
return mean + z * stddev
|
|
67
|
+
|
|
68
|
+
# 从列表中随机选择
|
|
69
|
+
func choice(items: var) -> var:
|
|
70
|
+
var n = len(items)
|
|
71
|
+
if n == 0:
|
|
72
|
+
return nil
|
|
73
|
+
var idx = self.next_int(0, n - 1)
|
|
74
|
+
return items[idx]
|
|
75
|
+
|
|
76
|
+
# 洗牌(Fisher-Yates)
|
|
77
|
+
func shuffle(items: var) -> var:
|
|
78
|
+
var n = len(items)
|
|
79
|
+
var result = []
|
|
80
|
+
var i = 0
|
|
81
|
+
while i < n:
|
|
82
|
+
result = result + [items[i]]
|
|
83
|
+
i = i + 1
|
|
84
|
+
i = n - 1
|
|
85
|
+
while i > 0:
|
|
86
|
+
var j = self.next_int(0, i)
|
|
87
|
+
var tmp = result[i]
|
|
88
|
+
result[i] = result[j]
|
|
89
|
+
result[j] = tmp
|
|
90
|
+
i = i - 1
|
|
91
|
+
return result
|
|
92
|
+
|
|
93
|
+
# 不放回抽样
|
|
94
|
+
func sample(items: var, k: int) -> var:
|
|
95
|
+
var n = len(items)
|
|
96
|
+
if k > n:
|
|
97
|
+
k = n
|
|
98
|
+
var shuffled = self.shuffle(items)
|
|
99
|
+
var result = []
|
|
100
|
+
var i = 0
|
|
101
|
+
while i < k:
|
|
102
|
+
result = result + [shuffled[i]]
|
|
103
|
+
i = i + 1
|
|
104
|
+
return result
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::mem.allocator —— 分配器接口
|
|
3
|
+
# Zig 风格:显式分配/释放,无 hidden GC
|
|
4
|
+
# ============================================================
|
|
5
|
+
|
|
6
|
+
extern func malloc(size: int) -> int
|
|
7
|
+
extern func c_free(ptr: int)
|
|
8
|
+
extern func calloc(count: int, size: int) -> int
|
|
9
|
+
extern func c_realloc(ptr: int, size: int) -> int
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# std::mem.arena —— 竞技场分配器(ArenaAllocator)
|
|
3
|
+
# Zig 风格:一次性分配、批量释放
|
|
4
|
+
# ============================================================
|
|
5
|
+
|
|
6
|
+
var arena_used: int = 0
|
|
7
|
+
var arena_capacity: int = 0
|
|
8
|
+
var arena_block_size: int = 65536
|
|
9
|
+
var arena_blocks: var = []
|
|
10
|
+
|
|
11
|
+
func arena_reset():
|
|
12
|
+
arena_used = 0
|
|
13
|
+
arena_capacity = 0
|
|
14
|
+
arena_blocks = []
|
|
15
|
+
|
|
16
|
+
func arena_alloc(size: int) -> int:
|
|
17
|
+
if arena_used + size > arena_capacity:
|
|
18
|
+
var new_cap = arena_block_size
|
|
19
|
+
if size > new_cap:
|
|
20
|
+
new_cap = size
|
|
21
|
+
var block_ptr = malloc(new_cap)
|
|
22
|
+
arena_blocks = arena_blocks + [block_ptr]
|
|
23
|
+
arena_capacity = new_cap
|
|
24
|
+
arena_used = 0
|
|
25
|
+
var last_block = arena_blocks[len(arena_blocks) - 1]
|
|
26
|
+
var ptr = last_block + arena_used
|
|
27
|
+
arena_used = arena_used + size
|
|
28
|
+
return ptr
|
|
29
|
+
|
|
30
|
+
func arena_dealloc(ptr: int):
|
|
31
|
+
# 竞技场不支持单块释放
|
|
32
|
+
|
|
33
|
+
func arena_free_all():
|
|
34
|
+
var i = 0
|
|
35
|
+
while i < len(arena_blocks):
|
|
36
|
+
c_free(arena_blocks[i])
|
|
37
|
+
i = i + 1
|
|
38
|
+
arena_reset()
|
|
39
|
+
|
|
40
|
+
func arena_allocated() -> int:
|
|
41
|
+
return arena_used
|