redscript-mc 3.0.1 → 3.0.2

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 (225) hide show
  1. package/.github/workflows/ci.yml +1 -0
  2. package/README.md +119 -313
  3. package/README.zh.md +118 -314
  4. package/ROADMAP.md +5 -5
  5. package/dist/data/impl_test/function/counter/get.mcfunction +5 -0
  6. package/dist/data/impl_test/function/counter/inc.mcfunction +7 -0
  7. package/dist/data/impl_test/function/counter/new.mcfunction +4 -0
  8. package/dist/data/impl_test/function/load.mcfunction +1 -0
  9. package/dist/data/impl_test/function/test_impl.mcfunction +10 -0
  10. package/dist/data/minecraft/tags/function/load.json +5 -0
  11. package/dist/data/playground/function/load.mcfunction +1 -0
  12. package/dist/data/playground/function/start.mcfunction +4 -0
  13. package/dist/data/playground/function/start__say_macro_t1.mcfunction +1 -0
  14. package/dist/data/playground/function/stop.mcfunction +5 -0
  15. package/dist/data/playground/function/stop__say_macro_t0.mcfunction +1 -0
  16. package/dist/data/stdlib_queue8_test/function/__queue_append_apply.mcfunction +4 -0
  17. package/dist/data/stdlib_queue8_test/function/__queue_peek_apply.mcfunction +4 -0
  18. package/dist/data/stdlib_queue8_test/function/__queue_size_raw_apply.mcfunction +4 -0
  19. package/dist/data/stdlib_queue8_test/function/load.mcfunction +1 -0
  20. package/dist/data/stdlib_queue8_test/function/queue_clear.mcfunction +6 -0
  21. package/dist/data/stdlib_queue8_test/function/queue_empty__merge_1.mcfunction +5 -0
  22. package/dist/data/stdlib_queue8_test/function/queue_empty__then_0.mcfunction +5 -0
  23. package/dist/data/stdlib_queue8_test/function/queue_peek__merge_1.mcfunction +13 -0
  24. package/dist/data/stdlib_queue8_test/function/queue_peek__then_0.mcfunction +5 -0
  25. package/dist/data/stdlib_queue8_test/function/queue_pop__merge_1.mcfunction +15 -0
  26. package/dist/data/stdlib_queue8_test/function/queue_pop__then_0.mcfunction +5 -0
  27. package/dist/data/stdlib_queue8_test/function/queue_push__const_11.mcfunction +6 -0
  28. package/dist/data/stdlib_queue8_test/function/queue_push__const_22.mcfunction +6 -0
  29. package/dist/data/stdlib_queue8_test/function/queue_size.mcfunction +13 -0
  30. package/dist/data/stdlib_queue8_test/function/test_queue_push_and_size.mcfunction +13 -0
  31. package/dist/data/test/function/load.mcfunction +1 -0
  32. package/dist/data/test/function/say_at.mcfunction +6 -0
  33. package/dist/data/test/function/test.mcfunction +4 -0
  34. package/dist/pack.mcmeta +6 -0
  35. package/dist/package.json +1 -1
  36. package/dist/src/__tests__/formatter-extra.test.d.ts +7 -0
  37. package/dist/src/__tests__/formatter-extra.test.js +123 -0
  38. package/dist/src/__tests__/global-vars.test.d.ts +13 -0
  39. package/dist/src/__tests__/global-vars.test.js +156 -0
  40. package/dist/src/__tests__/lint/new-rules.test.d.ts +9 -0
  41. package/dist/src/__tests__/lint/new-rules.test.js +402 -0
  42. package/dist/src/__tests__/lsp-rename.test.d.ts +8 -0
  43. package/dist/src/__tests__/lsp-rename.test.js +157 -0
  44. package/dist/src/__tests__/mc-integration/say-fstring.test.d.ts +11 -0
  45. package/dist/src/__tests__/mc-integration/say-fstring.test.js +220 -0
  46. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +1 -1
  47. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1 -1
  48. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1 -1
  49. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1 -1
  50. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +1 -1
  51. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +1 -1
  52. package/dist/src/__tests__/mc-integration/stdlib-coverage-8.test.js +1 -1
  53. package/dist/src/__tests__/mc-syntax.test.js +4 -1
  54. package/dist/src/__tests__/monomorphize-coverage.test.d.ts +9 -0
  55. package/dist/src/__tests__/monomorphize-coverage.test.js +204 -0
  56. package/dist/src/__tests__/optimizer-cse.test.d.ts +7 -0
  57. package/dist/src/__tests__/optimizer-cse.test.js +226 -0
  58. package/dist/src/__tests__/parser.test.js +4 -13
  59. package/dist/src/__tests__/repl-server-extra.test.js +6 -7
  60. package/dist/src/__tests__/repl-server.test.js +5 -7
  61. package/dist/src/__tests__/stdlib/queue.test.js +6 -6
  62. package/dist/src/cli.js +0 -0
  63. package/dist/src/lexer/index.js +2 -1
  64. package/dist/src/lint/index.d.ts +12 -5
  65. package/dist/src/lint/index.js +730 -5
  66. package/dist/src/lsp/main.js +0 -0
  67. package/dist/src/mc-test/client.d.ts +21 -0
  68. package/dist/src/mc-test/client.js +34 -0
  69. package/dist/src/mir/lower.js +108 -6
  70. package/dist/src/optimizer/interprocedural.js +37 -2
  71. package/dist/src/parser/decl-parser.d.ts +19 -0
  72. package/dist/src/parser/decl-parser.js +323 -0
  73. package/dist/src/parser/expr-parser.d.ts +46 -0
  74. package/dist/src/parser/expr-parser.js +759 -0
  75. package/dist/src/parser/index.d.ts +8 -129
  76. package/dist/src/parser/index.js +13 -2262
  77. package/dist/src/parser/stmt-parser.d.ts +28 -0
  78. package/dist/src/parser/stmt-parser.js +577 -0
  79. package/dist/src/parser/type-parser.d.ts +20 -0
  80. package/dist/src/parser/type-parser.js +257 -0
  81. package/dist/src/parser/utils.d.ts +34 -0
  82. package/dist/src/parser/utils.js +141 -0
  83. package/docs/dev/README-mc-integration-tests.md +141 -0
  84. package/docs/lint-rules.md +162 -0
  85. package/docs/stdlib/bigint.md +2 -0
  86. package/editors/vscode/README.md +63 -41
  87. package/editors/vscode/out/extension.js +1881 -1776
  88. package/editors/vscode/out/lsp-server.js +4257 -3651
  89. package/editors/vscode/package-lock.json +3 -3
  90. package/editors/vscode/package.json +1 -1
  91. package/examples/loops-demo.mcrs +87 -0
  92. package/package.json +1 -1
  93. package/redscript-docs/docs/en/stdlib/advanced.md +629 -0
  94. package/redscript-docs/docs/en/stdlib/bigint.md +316 -0
  95. package/redscript-docs/docs/en/stdlib/bits.md +292 -0
  96. package/redscript-docs/docs/en/stdlib/bossbar.md +177 -0
  97. package/redscript-docs/docs/en/stdlib/calculus.md +289 -0
  98. package/redscript-docs/docs/en/stdlib/color.md +353 -0
  99. package/redscript-docs/docs/en/stdlib/combat.md +88 -0
  100. package/redscript-docs/docs/en/stdlib/cooldown.md +82 -0
  101. package/redscript-docs/docs/en/stdlib/dialog.md +155 -0
  102. package/redscript-docs/docs/en/stdlib/easing.md +558 -0
  103. package/redscript-docs/docs/en/stdlib/ecs.md +475 -0
  104. package/redscript-docs/docs/en/stdlib/effects.md +324 -0
  105. package/redscript-docs/docs/en/stdlib/events.md +3 -0
  106. package/redscript-docs/docs/en/stdlib/expr.md +45 -0
  107. package/redscript-docs/docs/en/stdlib/fft.md +141 -0
  108. package/redscript-docs/docs/en/stdlib/geometry.md +430 -0
  109. package/redscript-docs/docs/en/stdlib/graph.md +259 -0
  110. package/redscript-docs/docs/en/stdlib/heap.md +185 -0
  111. package/redscript-docs/docs/en/stdlib/interactions.md +179 -0
  112. package/redscript-docs/docs/en/stdlib/inventory.md +97 -0
  113. package/redscript-docs/docs/en/stdlib/linalg.md +557 -0
  114. package/redscript-docs/docs/en/stdlib/list.md +559 -0
  115. package/redscript-docs/docs/en/stdlib/map.md +140 -0
  116. package/redscript-docs/docs/en/stdlib/math.md +193 -0
  117. package/redscript-docs/docs/en/stdlib/math_hp.md +149 -0
  118. package/redscript-docs/docs/en/stdlib/matrix.md +403 -0
  119. package/redscript-docs/docs/en/stdlib/mobs.md +965 -0
  120. package/redscript-docs/docs/en/stdlib/noise.md +244 -0
  121. package/redscript-docs/docs/en/stdlib/ode.md +253 -0
  122. package/redscript-docs/docs/en/stdlib/parabola.md +342 -0
  123. package/redscript-docs/docs/en/stdlib/particles.md +311 -0
  124. package/redscript-docs/docs/en/stdlib/pathfind.md +255 -0
  125. package/redscript-docs/docs/en/stdlib/physics.md +493 -0
  126. package/redscript-docs/docs/en/stdlib/player.md +78 -0
  127. package/redscript-docs/docs/en/stdlib/quaternion.md +673 -0
  128. package/redscript-docs/docs/en/stdlib/queue.md +134 -0
  129. package/redscript-docs/docs/en/stdlib/random.md +223 -0
  130. package/redscript-docs/docs/en/stdlib/result.md +143 -0
  131. package/redscript-docs/docs/en/stdlib/scheduler.md +183 -0
  132. package/redscript-docs/docs/en/stdlib/set_int.md +190 -0
  133. package/redscript-docs/docs/en/stdlib/sets.md +101 -0
  134. package/redscript-docs/docs/en/stdlib/signal.md +400 -0
  135. package/redscript-docs/docs/en/stdlib/sort.md +104 -0
  136. package/redscript-docs/docs/en/stdlib/spawn.md +147 -0
  137. package/redscript-docs/docs/en/stdlib/state.md +142 -0
  138. package/redscript-docs/docs/en/stdlib/strings.md +154 -0
  139. package/redscript-docs/docs/en/stdlib/tags.md +3451 -0
  140. package/redscript-docs/docs/en/stdlib/teams.md +153 -0
  141. package/redscript-docs/docs/en/stdlib/timer.md +246 -0
  142. package/redscript-docs/docs/en/stdlib/vec.md +158 -0
  143. package/redscript-docs/docs/en/stdlib/world.md +298 -0
  144. package/redscript-docs/docs/zh/stdlib/advanced.md +615 -0
  145. package/redscript-docs/docs/zh/stdlib/bigint.md +316 -0
  146. package/redscript-docs/docs/zh/stdlib/bits.md +292 -0
  147. package/redscript-docs/docs/zh/stdlib/bossbar.md +170 -0
  148. package/redscript-docs/docs/zh/stdlib/calculus.md +287 -0
  149. package/redscript-docs/docs/zh/stdlib/color.md +353 -0
  150. package/redscript-docs/docs/zh/stdlib/combat.md +88 -0
  151. package/redscript-docs/docs/zh/stdlib/cooldown.md +84 -0
  152. package/redscript-docs/docs/zh/stdlib/dialog.md +152 -0
  153. package/redscript-docs/docs/zh/stdlib/easing.md +558 -0
  154. package/redscript-docs/docs/zh/stdlib/ecs.md +472 -0
  155. package/redscript-docs/docs/zh/stdlib/effects.md +324 -0
  156. package/redscript-docs/docs/zh/stdlib/events.md +3 -0
  157. package/redscript-docs/docs/zh/stdlib/expr.md +37 -0
  158. package/redscript-docs/docs/zh/stdlib/fft.md +128 -0
  159. package/redscript-docs/docs/zh/stdlib/geometry.md +430 -0
  160. package/redscript-docs/docs/zh/stdlib/graph.md +259 -0
  161. package/redscript-docs/docs/zh/stdlib/heap.md +185 -0
  162. package/redscript-docs/docs/zh/stdlib/interactions.md +160 -0
  163. package/redscript-docs/docs/zh/stdlib/inventory.md +94 -0
  164. package/redscript-docs/docs/zh/stdlib/linalg.md +543 -0
  165. package/redscript-docs/docs/zh/stdlib/list.md +561 -0
  166. package/redscript-docs/docs/zh/stdlib/map.md +132 -0
  167. package/redscript-docs/docs/zh/stdlib/math.md +193 -0
  168. package/redscript-docs/docs/zh/stdlib/math_hp.md +143 -0
  169. package/redscript-docs/docs/zh/stdlib/matrix.md +396 -0
  170. package/redscript-docs/docs/zh/stdlib/mobs.md +965 -0
  171. package/redscript-docs/docs/zh/stdlib/noise.md +244 -0
  172. package/redscript-docs/docs/zh/stdlib/ode.md +243 -0
  173. package/redscript-docs/docs/zh/stdlib/parabola.md +337 -0
  174. package/redscript-docs/docs/zh/stdlib/particles.md +307 -0
  175. package/redscript-docs/docs/zh/stdlib/pathfind.md +255 -0
  176. package/redscript-docs/docs/zh/stdlib/physics.md +493 -0
  177. package/redscript-docs/docs/zh/stdlib/player.md +78 -0
  178. package/redscript-docs/docs/zh/stdlib/quaternion.md +669 -0
  179. package/redscript-docs/docs/zh/stdlib/queue.md +124 -0
  180. package/redscript-docs/docs/zh/stdlib/random.md +222 -0
  181. package/redscript-docs/docs/zh/stdlib/result.md +147 -0
  182. package/redscript-docs/docs/zh/stdlib/scheduler.md +173 -0
  183. package/redscript-docs/docs/zh/stdlib/set_int.md +180 -0
  184. package/redscript-docs/docs/zh/stdlib/sets.md +107 -0
  185. package/redscript-docs/docs/zh/stdlib/signal.md +373 -0
  186. package/redscript-docs/docs/zh/stdlib/sort.md +104 -0
  187. package/redscript-docs/docs/zh/stdlib/spawn.md +142 -0
  188. package/redscript-docs/docs/zh/stdlib/state.md +134 -0
  189. package/redscript-docs/docs/zh/stdlib/strings.md +107 -0
  190. package/redscript-docs/docs/zh/stdlib/tags.md +3451 -0
  191. package/redscript-docs/docs/zh/stdlib/teams.md +150 -0
  192. package/redscript-docs/docs/zh/stdlib/timer.md +254 -0
  193. package/redscript-docs/docs/zh/stdlib/vec.md +158 -0
  194. package/redscript-docs/docs/zh/stdlib/world.md +289 -0
  195. package/src/__tests__/formatter-extra.test.ts +139 -0
  196. package/src/__tests__/global-vars.test.ts +171 -0
  197. package/src/__tests__/lint/new-rules.test.ts +437 -0
  198. package/src/__tests__/lsp-rename.test.ts +171 -0
  199. package/src/__tests__/mc-integration/say-fstring.test.ts +211 -0
  200. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +1 -1
  201. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1 -1
  202. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1 -1
  203. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1 -1
  204. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +1 -1
  205. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +1 -1
  206. package/src/__tests__/mc-integration/stdlib-coverage-8.test.ts +1 -1
  207. package/src/__tests__/mc-syntax.test.ts +3 -0
  208. package/src/__tests__/monomorphize-coverage.test.ts +220 -0
  209. package/src/__tests__/optimizer-cse.test.ts +250 -0
  210. package/src/__tests__/parser.test.ts +4 -13
  211. package/src/__tests__/repl-server-extra.test.ts +6 -6
  212. package/src/__tests__/repl-server.test.ts +5 -6
  213. package/src/__tests__/stdlib/queue.test.ts +6 -6
  214. package/src/lexer/index.ts +2 -1
  215. package/src/lint/index.ts +713 -5
  216. package/src/mc-test/client.ts +40 -0
  217. package/src/mir/lower.ts +111 -2
  218. package/src/optimizer/interprocedural.ts +40 -2
  219. package/src/parser/decl-parser.ts +349 -0
  220. package/src/parser/expr-parser.ts +838 -0
  221. package/src/parser/index.ts +17 -2558
  222. package/src/parser/stmt-parser.ts +585 -0
  223. package/src/parser/type-parser.ts +276 -0
  224. package/src/parser/utils.ts +173 -0
  225. package/src/stdlib/queue.mcrs +19 -6
@@ -0,0 +1,316 @@
1
+ # Bigint
2
+
3
+ > 本文档由 `src/stdlib/bigint.mcrs` 自动生成,请勿手动编辑。
4
+
5
+ ## API 列表
6
+
7
+ - [bigint_base](#bigint-base)
8
+ - [bigint_zero](#bigint-zero)
9
+ - [bigint_copy](#bigint-copy)
10
+ - [bigint_cmp](#bigint-cmp)
11
+ - [bigint_add](#bigint-add)
12
+ - [bigint_sub](#bigint-sub)
13
+ - [bigint_mul_small](#bigint-mul-small)
14
+ - [bigint_div_small](#bigint-div-small)
15
+ - [bigint_mod_small](#bigint-mod-small)
16
+ - [bigint_mul](#bigint-mul)
17
+ - [bigint_sq](#bigint-sq)
18
+ - [bigint_div](#bigint-div)
19
+
20
+ ---
21
+
22
+ ## `bigint_base` <Badge type="info" text="v1.0.0" />
23
+
24
+ Return the bigint base (10000 = base-10000, each chunk holds 4 decimal digits).
25
+
26
+ ```redscript
27
+ fn bigint_base(): int
28
+ ```
29
+
30
+ **返回:** 10000
31
+
32
+ ---
33
+
34
+ ## `bigint_zero` <Badge type="info" text="v1.0.0" />
35
+
36
+ Set all chunks of a bigint array to zero.
37
+
38
+ ```redscript
39
+ fn bigint_zero(arr: int[], len: int)
40
+ ```
41
+
42
+ **参数**
43
+
44
+ | 参数 | 说明 |
45
+ |------|------|
46
+ | `arr` | BigInt array (most-significant chunk at index 0) |
47
+ | `len` | Number of chunks |
48
+
49
+ **返回:** void — arr[0..len-1] set to 0
50
+
51
+ **示例**
52
+
53
+ ```redscript
54
+ bigint_zero(result, 4) // zero out a 4-chunk bigint
55
+ ```
56
+
57
+ ---
58
+
59
+ ## `bigint_copy` <Badge type="info" text="v1.0.0" />
60
+
61
+ Copy a bigint from src into dst.
62
+
63
+ ```redscript
64
+ fn bigint_copy(src: int[], dst: int[], len: int)
65
+ ```
66
+
67
+ **参数**
68
+
69
+ | 参数 | 说明 |
70
+ |------|------|
71
+ | `src` | Source bigint array |
72
+ | `dst` | Destination bigint array (must have length >= len) |
73
+ | `len` | Number of chunks to copy |
74
+
75
+ **返回:** void — dst[0..len-1] = src[0..len-1]
76
+
77
+ ---
78
+
79
+ ## `bigint_cmp` <Badge type="info" text="v1.0.0" />
80
+
81
+ 比较两个等长大整数
82
+
83
+ ```redscript
84
+ fn bigint_cmp(a: int[], b: int[], len: int): int
85
+ ```
86
+
87
+ **参数**
88
+
89
+ | 参数 | 说明 |
90
+ |------|------|
91
+ | `a` | 第一个大整数(最高有效分块在索引 0) |
92
+ | `b` | 第二个大整数 |
93
+ | `len` | 分块数量(两者相同) |
94
+
95
+ **返回:** a > b 返回 1,a < b 返回 -1,相等返回 0
96
+
97
+ **示例**
98
+
99
+ ```redscript
100
+ let cmp: int = bigint_cmp(a, b, 4)
101
+ ```
102
+
103
+ ---
104
+
105
+ ## `bigint_add` <Badge type="info" text="v1.0.0" />
106
+
107
+ 将两个等长大整数相加,结果写入预分配数组
108
+
109
+ ```redscript
110
+ fn bigint_add(a: int[], b: int[], result: int[], len: int): int
111
+ ```
112
+
113
+ **参数**
114
+
115
+ | 参数 | 说明 |
116
+ |------|------|
117
+ | `a` | 第一个加数大整数 |
118
+ | `b` | 第二个加数大整数 |
119
+ | `result` | 输出大整数数组(长度需 >= len) |
120
+ | `len` | 分块数量 |
121
+
122
+ **返回:** 进位:0 或 1(非零表示溢出)
123
+
124
+ **示例**
125
+
126
+ ```redscript
127
+ let carry: int = bigint_add(a, b, result, 4)
128
+ ```
129
+
130
+ ---
131
+
132
+ ## `bigint_sub` <Badge type="info" text="v1.0.0" />
133
+
134
+ 大整数 b 从 a 中减去,结果写入 result(要求 a >= b)
135
+
136
+ ```redscript
137
+ fn bigint_sub(a: int[], b: int[], result: int[], len: int)
138
+ ```
139
+
140
+ **参数**
141
+
142
+ | 参数 | 说明 |
143
+ |------|------|
144
+ | `a` | 被减数大整数 |
145
+ | `b` | 减数大整数(必须 <= a) |
146
+ | `result` | 输出大整数数组 |
147
+ | `len` | 分块数量 |
148
+
149
+ **返回:** void — result = a - b
150
+
151
+ ---
152
+
153
+ ## `bigint_mul_small` <Badge type="info" text="v1.0.0" />
154
+
155
+ 大整数乘以小整数(1 ≤ n ≤ 9999)
156
+
157
+ ```redscript
158
+ fn bigint_mul_small(a: int[], n: int, result: int[], len: int)
159
+ ```
160
+
161
+ **参数**
162
+
163
+ | 参数 | 说明 |
164
+ |------|------|
165
+ | `a` | 被乘数大整数 |
166
+ | `n` | 小整数乘数(范围 [1, 9999]) |
167
+ | `result` | 输出数组 |
168
+ | `len` | 分块数量 |
169
+
170
+ **返回:** void — result = a × n
171
+
172
+ **示例**
173
+
174
+ ```redscript
175
+ bigint_mul_small(a, 1000, result, 4) // result = a × 1000
176
+ ```
177
+
178
+ ---
179
+
180
+ ## `bigint_div_small` <Badge type="info" text="v1.0.0" />
181
+
182
+ 大整数除以小整数,返回商和余数
183
+
184
+ ```redscript
185
+ fn bigint_div_small(a: int[], divisor: int, result: int[], len: int): int
186
+ ```
187
+
188
+ **参数**
189
+
190
+ | 参数 | 说明 |
191
+ |------|------|
192
+ | `a` | 被除数大整数 |
193
+ | `divisor` | 小整数除数(范围 [1, 9999]) |
194
+ | `result` | 商输出数组 |
195
+ | `len` | 分块数量 |
196
+
197
+ **返回:** 余数(范围 0..divisor-1)
198
+
199
+ **示例**
200
+
201
+ ```redscript
202
+ let rem: int = bigint_div_small(a, 7, result, 4)
203
+ ```
204
+
205
+ ---
206
+
207
+ ## `bigint_mod_small` <Badge type="info" text="v1.0.0" />
208
+
209
+ Compute a bigint modulo a small integer without allocating a quotient array.
210
+
211
+ ```redscript
212
+ fn bigint_mod_small(a: int[], divisor: int, len: int): int
213
+ ```
214
+
215
+ **参数**
216
+
217
+ | 参数 | 说明 |
218
+ |------|------|
219
+ | `a` | Dividend bigint |
220
+ | `divisor` | Small integer divisor (range [1, 9999]) |
221
+ | `len` | Number of chunks |
222
+
223
+ **返回:** a % divisor, in [0, divisor-1]
224
+
225
+ **示例**
226
+
227
+ ```redscript
228
+ let mod: int = bigint_mod_small(a, 10, 4) // last decimal digit of a
229
+ ```
230
+
231
+ ---
232
+
233
+ ## `bigint_mul` <Badge type="info" text="v1.0.0" />
234
+
235
+ 两个大整数相乘(朴素 O(n²) 学校算法)
236
+
237
+ ```redscript
238
+ fn bigint_mul(a: int[], b: int[], result: int[], la: int, lb: int)
239
+ ```
240
+
241
+ **参数**
242
+
243
+ | 参数 | 说明 |
244
+ |------|------|
245
+ | `a` | 第一个大整数(la 个分块) |
246
+ | `b` | 第二个大整数(lb 个分块) |
247
+ | `result` | 输出数组(需 la+lb 个分块,预置为 0) |
248
+ | `la` | a 的分块数 |
249
+ | `lb` | b 的分块数 |
250
+
251
+ **返回:** void — result = a × b
252
+
253
+ **示例**
254
+
255
+ ```redscript
256
+ let result: int[] = [0, 0, 0, 0, 0, 0, 0]
257
+ bigint_mul(a, b, result, 4, 3)
258
+ ```
259
+
260
+ ---
261
+
262
+ ## `bigint_sq` <Badge type="info" text="v1.0.0" />
263
+
264
+ Square a bigint (optimized: computes upper triangle only).
265
+
266
+ ```redscript
267
+ fn bigint_sq(a: int[], result: int[], len: int)
268
+ ```
269
+
270
+ **参数**
271
+
272
+ | 参数 | 说明 |
273
+ |------|------|
274
+ | `a` | Bigint to square (len chunks) |
275
+ | `result` | Output bigint array (must have len*2 chunks, pre-zeroed) |
276
+ | `len` | Number of chunks in a |
277
+
278
+ **返回:** void — result = a * a
279
+
280
+ **示例**
281
+
282
+ ```redscript
283
+ let sq: int[] = [0, 0, 0, 0, 0, 0, 0, 0]
284
+ bigint_sq(a, sq, 4) // sq = a²
285
+ ```
286
+
287
+ ---
288
+
289
+ ## `bigint_div` <Badge type="info" text="v1.0.0" />
290
+
291
+ 任意精度整数除法,计算商和余数
292
+
293
+ ```redscript
294
+ fn bigint_div(a: int[], b: int[], quotient: int[], remainder: int[], la: int, lb: int): void
295
+ ```
296
+
297
+ **参数**
298
+
299
+ | 参数 | 说明 |
300
+ |------|------|
301
+ | `a` | 被除数大整数(la 个分块) |
302
+ | `b` | 除数大整数(lb 个分块) |
303
+ | `quotient` | 商输出数组(la 个分块,预置为 0) |
304
+ | `remainder` | 余数输出数组(lb 个分块,预置为 0) |
305
+ | `la` | a 的分块数(需 >= lb) |
306
+ | `lb` | b 的分块数 |
307
+
308
+ **返回:** void — quotient = a/b, remainder = a%b
309
+
310
+ **示例**
311
+
312
+ ```redscript
313
+ bigint_div(a, b, quotient, remainder, 4, 2)
314
+ ```
315
+
316
+ ---
@@ -0,0 +1,292 @@
1
+ # Bits
2
+
3
+ > 本文档由 `src/stdlib/bits.mcrs` 自动生成,请勿手动编辑。
4
+
5
+ ## API 列表
6
+
7
+ - [bit_get](#bit-get)
8
+ - [bit_set](#bit-set)
9
+ - [bit_clear](#bit-clear)
10
+ - [bit_toggle](#bit-toggle)
11
+ - [bit_shl](#bit-shl)
12
+ - [bit_shr](#bit-shr)
13
+ - [bit_and](#bit-and)
14
+ - [bit_or](#bit-or)
15
+ - [bit_xor](#bit-xor)
16
+ - [bit_not](#bit-not)
17
+ - [popcount](#popcount)
18
+
19
+ ---
20
+
21
+ ## `bit_get` <Badge type="info" text="v1.0.0" />
22
+
23
+ 检测 x 的第 n 位是否为 1
24
+
25
+ ```redscript
26
+ fn bit_get(x: int, n: int): int
27
+ ```
28
+
29
+ **参数**
30
+
31
+ | 参数 | 说明 |
32
+ |------|------|
33
+ | `x` | 要检测的整数 |
34
+ | `n` | 位索引(0 = 最低位),范围 [0, 30] |
35
+
36
+ **返回:** 第 n 位为 1 则返回 1,否则返回 0
37
+
38
+ **示例**
39
+
40
+ ```redscript
41
+ let b: int = bit_get(0b1010, 1) // result: 1 (bit 1 of 10 is set)
42
+ ```
43
+
44
+ ---
45
+
46
+ ## `bit_set` <Badge type="info" text="v1.0.0" />
47
+
48
+ 将 x 的第 n 位设为 1(幂等)
49
+
50
+ ```redscript
51
+ fn bit_set(x: int, n: int): int
52
+ ```
53
+
54
+ **参数**
55
+
56
+ | 参数 | 说明 |
57
+ |------|------|
58
+ | `x` | 要修改的整数 |
59
+ | `n` | 要置 1 的位索引,范围 [0, 30] |
60
+
61
+ **返回:** 第 n 位置为 1 后的 x
62
+
63
+ **示例**
64
+
65
+ ```redscript
66
+ let v: int = bit_set(0b0100, 0) // result: 0b0101 = 5
67
+ ```
68
+
69
+ ---
70
+
71
+ ## `bit_clear` <Badge type="info" text="v1.0.0" />
72
+
73
+ 将 x 的第 n 位清零(幂等)
74
+
75
+ ```redscript
76
+ fn bit_clear(x: int, n: int): int
77
+ ```
78
+
79
+ **参数**
80
+
81
+ | 参数 | 说明 |
82
+ |------|------|
83
+ | `x` | 要修改的整数 |
84
+ | `n` | 要清零的位索引,范围 [0, 30] |
85
+
86
+ **返回:** 第 n 位置为 0 后的 x
87
+
88
+ **示例**
89
+
90
+ ```redscript
91
+ let v: int = bit_clear(0b0111, 1) // result: 0b0101 = 5
92
+ ```
93
+
94
+ ---
95
+
96
+ ## `bit_toggle` <Badge type="info" text="v1.0.0" />
97
+
98
+ 翻转 x 的第 n 位(0→1 或 1→0)
99
+
100
+ ```redscript
101
+ fn bit_toggle(x: int, n: int): int
102
+ ```
103
+
104
+ **参数**
105
+
106
+ | 参数 | 说明 |
107
+ |------|------|
108
+ | `x` | 要修改的整数 |
109
+ | `n` | 要翻转的位索引,范围 [0, 30] |
110
+
111
+ **返回:** 第 n 位翻转后的 x
112
+
113
+ **示例**
114
+
115
+ ```redscript
116
+ let v: int = bit_toggle(0b0101, 1) // result: 0b0111 = 7
117
+ ```
118
+
119
+ ---
120
+
121
+ ## `bit_shl` <Badge type="info" text="v1.0.0" />
122
+
123
+ 左移 x n 位(等效于 x * 2^n)
124
+
125
+ ```redscript
126
+ fn bit_shl(x: int, n: int): int
127
+ ```
128
+
129
+ **参数**
130
+
131
+ | 参数 | 说明 |
132
+ |------|------|
133
+ | `x` | 要移位的整数 |
134
+ | `n` | 左移位数,范围 [0, 30] |
135
+
136
+ **返回:** x << n
137
+
138
+ **示例**
139
+
140
+ ```redscript
141
+ let v: int = bit_shl(1, 4) // result: 16 (1 << 4)
142
+ ```
143
+
144
+ ---
145
+
146
+ ## `bit_shr` <Badge type="info" text="v1.0.0" />
147
+
148
+ 逻辑右移 x n 位(等效于 x / 2^n,向零截断)
149
+
150
+ ```redscript
151
+ fn bit_shr(x: int, n: int): int
152
+ ```
153
+
154
+ **参数**
155
+
156
+ | 参数 | 说明 |
157
+ |------|------|
158
+ | `x` | 要移位的整数 |
159
+ | `n` | 右移位数,范围 [0, 30] |
160
+
161
+ **返回:** x >> n
162
+
163
+ **示例**
164
+
165
+ ```redscript
166
+ let v: int = bit_shr(256, 3) // result: 32 (256 >> 3)
167
+ ```
168
+
169
+ ---
170
+
171
+ ## `bit_and` <Badge type="info" text="v1.0.0" />
172
+
173
+ 两个整数的按位与(31 个非符号位)
174
+
175
+ ```redscript
176
+ fn bit_and(a: int, b: int): int
177
+ ```
178
+
179
+ **参数**
180
+
181
+ | 参数 | 说明 |
182
+ |------|------|
183
+ | `a` | 第一个操作数 |
184
+ | `b` | 第二个操作数 |
185
+
186
+ **返回:** a & b(两者均为 1 的位)
187
+
188
+ **示例**
189
+
190
+ ```redscript
191
+ let v: int = bit_and(0b1100, 0b1010) // result: 0b1000 = 8
192
+ ```
193
+
194
+ ---
195
+
196
+ ## `bit_or` <Badge type="info" text="v1.0.0" />
197
+
198
+ 两个整数的按位或(31 个非符号位)
199
+
200
+ ```redscript
201
+ fn bit_or(a: int, b: int): int
202
+ ```
203
+
204
+ **参数**
205
+
206
+ | 参数 | 说明 |
207
+ |------|------|
208
+ | `a` | 第一个操作数 |
209
+ | `b` | 第二个操作数 |
210
+
211
+ **返回:** a | b(至少一个为 1 的位)
212
+
213
+ **示例**
214
+
215
+ ```redscript
216
+ let v: int = bit_or(0b1100, 0b1010) // result: 0b1110 = 14
217
+ ```
218
+
219
+ ---
220
+
221
+ ## `bit_xor` <Badge type="info" text="v1.0.0" />
222
+
223
+ 两个整数的按位异或(31 个非符号位)
224
+
225
+ ```redscript
226
+ fn bit_xor(a: int, b: int): int
227
+ ```
228
+
229
+ **参数**
230
+
231
+ | 参数 | 说明 |
232
+ |------|------|
233
+ | `a` | 第一个操作数 |
234
+ | `b` | 第二个操作数 |
235
+
236
+ **返回:** a ^ b(恰好一个为 1 的位)
237
+
238
+ **示例**
239
+
240
+ ```redscript
241
+ let v: int = bit_xor(0b1100, 0b1010) // result: 0b0110 = 6
242
+ ```
243
+
244
+ ---
245
+
246
+ ## `bit_not` <Badge type="info" text="v1.0.0" />
247
+
248
+ 按位非 — 翻转 x 的所有 31 个非符号位
249
+
250
+ ```redscript
251
+ fn bit_not(x: int): int
252
+ ```
253
+
254
+ **参数**
255
+
256
+ | 参数 | 说明 |
257
+ |------|------|
258
+ | `x` | 要取反的整数 |
259
+
260
+ **返回:** ~x(所有 31 个低位翻转;符号位不变)
261
+
262
+ **示例**
263
+
264
+ ```redscript
265
+ let v: int = bit_not(0) // result: 2147483647 (all 31 bits set)
266
+ ```
267
+
268
+ ---
269
+
270
+ ## `popcount` <Badge type="info" text="v1.0.0" />
271
+
272
+ 统计 x 中置 1 的位数(汉明重量)
273
+
274
+ ```redscript
275
+ fn popcount(x: int): int
276
+ ```
277
+
278
+ **参数**
279
+
280
+ | 参数 | 说明 |
281
+ |------|------|
282
+ | `x` | 整数值(使用 31 个低位;符号位不计) |
283
+
284
+ **返回:** 置 1 的位数,范围 [0, 31]
285
+
286
+ **示例**
287
+
288
+ ```redscript
289
+ let n: int = popcount(255) // result: 8 (0xFF has 8 bits set)
290
+ ```
291
+
292
+ ---